PX4固件I2C驱动开发
一、背景
一直有一个想法,做一款小巧的、精致的,可以在室内飞行的无人机。现在主流的pixhawk飞控,体积比较大 ,在小巧这方面就不占优势。但是市面上常见的FPV飞控,凭借其小巧及aio的特点,一直是我考虑的对象。有同样想法的,也可以私信。
这就涉及到px4移植的问题。买了一块STM2开发板,打算以此板为基础,学习px4的移植。首先是修改配置文件,将px4固件在开发板上跑起来,这一步已经完成了。然后是驱动的移植。由于板子自带的IMU是SH3001,且通过I2C进行通信,那就不得不面临I2C驱动开发。
在开发的过程中,也遇到了很多问题,比如对I2C驱动整个运行的框架不了解,不知道怎么打印调试信息等。也在网上找了很多的资料,一般都是介绍整个I2C驱动的代码,没有介绍驱动的整个运行流程,以及可能存在的问题。下面,就介绍下驱动的运行架构,及遇到的问题及解决方案。
二、代码架构
I2C驱动,主要涉及四条主线。一条是驱动逻辑代码运行,包括是一些初始化及数据的交互。第二条是WorkItemSingleShot线,完成驱动代码的初始化,将驱动的逻辑代码调起来,有点类似于操作系统的bootloader功能。第三条线是,任务管理器,负责任务的运行。第四条是workitem。它是队列运行的最小单位,所有需要通过workqueue调度的类,都要继承它。由此看来实例和WorkItemSingleShot都是workitem的子类。
三、程序运行流程。
下图展示了核心代码及详细的运行流程。(如果csdn展示不清楚,可以私信我)

四、代码解析
程序运行的流程图中,已经包含了主要代码的说明。更详细的代码说明,后续再补充
五、遇到问题及解决办法
1、调试信息打印不出来
PX4_DEBUG函数,在nsh中不打印字符,要用PX4_ERR或者PX4_INFO_RAW函数。
2、怎么看自己的实例有没有在workqeue中运行
最简单的办法是通过stop命令,看没有程序停止相关的输出。还有一个方法是在配置文件中增加CONFIG_SYSTEMCMDS_WORK_QUEUE=y。将work_queue增加在syscmd中,就可以打印wq的信息。
3、实例一直不能运行
一般都是实例的init函数出错了。比如我遇到一次是,I2C::init();没成功,导致后面也没有加到调度中。
更多推荐

所有评论(0)