驱动框架
PX4的代码库使用一个轻量级的,统一的驱动抽象层:DriverFramework.
POSIX和 的驱动写入这个驱动框架当中。
PX4 是一个反应式系统reactive system ,使用订阅/发布来传递消息。文件句柄是不被操作系统的核心所需要或者使用。主要使用了以下两个API:
- 发布/订阅系统,该系统拥有一个文件,网络或者共享内存,其依靠于PX4后台运行。
- 全局驱动注册器,它允许枚举设备和获取/设置这些设备参数。这个可以很简单的作为一个链表或者文件系统地图。
- 启动脚本位于
- PX4中间件配置位于src/drivers/boards.其中包括总线和GPIO映射还有硬件平台初始化代码。
- 驱动位于
- 参考配置:运行使px4fmu-v4_default构建FMUv4配置,这是当前NuttX参考配置。
- 启动脚本位于 posix-configs/
- 系统配置文件模式作为Linux映射的一部分(备注:提供 本地的LINUX IMAGE和flash指令)
- PX4中间件配置位于。备注:增加总线配置。
- 驱动位于DriverFramework
- 参考配置:运行’make qurt_eagle_release’构建Snapdragon飞行参考配置。
传感器的顺序(例如一个是,另一个是/dev/mag1
)于优先级是不挂钩的,优先级实际是在发布uORB topic时确定的。
有关系统上三个磁力计的示例,使用飞行日志(.px4log)转存变量。三个参数对传感器ID进行编码,MAG_PRIME识别哪个磁力计被选为主传感器。每一个MAGx_ID是一个24bit数值,左面手工填零补充。
通过I2C连接的外部HMC5983,总线1,地址0x1E:在log中以IMU.MagX
显示。
# device ID 73225 in 24-bit binary:
00000001 00011110 00001 001
以及通过SPI总线连接的内部MPU9250磁力计,总线1,从设备选择slot4。在log中以IMU2.MagX
显示。
# device ID 263178 in 24-bit binary:
00000100 00000100 00001 010
#decodes to:
根据此格式,设备ID是一个24位的数字。注意,第一字段是上述解码示例中的最低有效位。
这里bus_type
按以下方式解码:
enum DeviceBusType {
DeviceBusType_UNKNOWN = 0,
DeviceBusType_I2C = 1,
DeviceBusType_SPI = 2,
DeviceBusType_UAVCAN = 3,