PX4模块设计之二十:PX4应用平台初始化

Posted lida2003

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PX4模块设计之二十:PX4应用平台初始化相关的知识,希望对你有一定的参考价值。

PX4模块设计之二十:PX4应用平台初始化

PX4启动过程章节的基础上,可以深入分析下PX4应用平台(框架)的实现。

1. PX4应用平台介绍

PX4应用平台初始化(px4_platform_init)在INIT初始化脚本之前,被PX4应用使用的抽象的模块都在这里进行初始化。

比如:

  1. 秘钥/加密算法
  2. 高精度定时
  3. PX4系统参数
  4. 工作队列
  5. uORB消息
  6. 打印日志
    等等(驱动部分不再这里讨论)

注:部分尚没有对应研读的文章,没有给出链接,后续会更新。

2. PX4应用平台初始化实现

所谓平台其实更多的就是考虑通用组件,将共性的东西抽象提取出来,设计和代码集中管理和实现。平台部分的代码因晚于驱动早于应用初始化。

nsh_initialize
 └──> boardctl(BOARDIOC_INIT, 0);
     └──> board_app_initialize
         └──> px4_platform_init
px4_platform_init
 ├──> <!defined(CONFIG_BUILD_FLAT)>
 │   ├──> cxx_initialize
 │   └──> kernel_ioctl_initialize
 ├──> px4_console_buffer_init
 ├──> <defined(PX4_CRYPTO)>
 │   └──> PX4Crypto::px4_crypto_init      // 秘钥,加密算法
 ├──> hrt_init           // 高精度定时
 ├──> param_init         // 参数
 ├──> <CONFIG_SCHED_INSTRUMENTATION>
 │   └──> cpuload_initialize_once
 ├──> <defined(CONFIG_FS_PROCFS)>
 │   └──> int ret_mount_procfs = mount(nullptr, "/proc", "procfs", 0, nullptr);
 ├──> <defined(CONFIG_FS_BINFS)>
 │   └──> int ret_mount_binfs = nx_mount(nullptr, "/bin", "binfs", 0, nullptr);
 ├──> px4::WorkQueueManagerStart     // 工作队列
 ├──> uorb_start    // uorb消息
 ├──> px4_log_initialize  // 日志uORB消息注册
 └──> <defined(CONFIG_SYSTEM_CDCACM) && defined(CONFIG_BUILD_FLAT)>
     └──> cdcacm_init

3. 讨论和思考

看到的一些现象:

  1. 整体上看这里PX4飞控系统是有一些基础组件(模块)的抽象。
  2. PX4应用平台软件模块,硬件驱动,框架设计等解耦并非都能完全到位。
  3. 各个模块的启动顺序相对来说还是有时序要求。

现象思考:

  1. 虽然有些软硬件的内容可能并非完全能够解耦到位。这也是可以完全理解的,毕竟嵌入式本身就是软硬件协同工作的产品。
  2. 随着系统设计规模化,功能复杂化,软硬件的解耦和抽象是非常重要的,并且是后续维护和进一步开发基础。
  3. 假设业务和硬件确实有强耦合,也可以通过一些方法论(比如:业务抽象和标准化)进行解耦,从而成为弱耦合而非强耦合。
  4. PX4作为开源代码,参与人员众多,且存在较多历史原因,重构是一个非常复杂的问题。

希望,随着硬件性能的提升,能有机会看到从上至下进行整体设计考虑,更加模块化/人性化,从整个产品系统做进一步的提升,便于更多的人易于了解和上手设计研发工作。

4. 参考资料

【1】PX4开源软件框架简明简介
【2】PX4模块设计之十:PX4启动过程
【3】PX4模块设计之十二:High Resolution Timer设计
【4】PX4模块设计之十三:WorkQueue设计
【5】PX4模块设计之二:uORB消息代理
【6】PX4模块设计之十五:PX4 Log设计

以上是关于PX4模块设计之二十:PX4应用平台初始化的主要内容,如果未能解决你的问题,请参考以下文章

PX4模块设计之二十七:LandDetector模块

PX4模块设计之二十二:FlightModeManager模块

PX4模块设计之二十六:BatteryStatus模块

PX4模块设计之二十九:RCUpdate模块

PX4模块设计之二十八:RCInput模块

PX4模块设计之二十五:DShot模块