PX4模块设计之二十:PX4应用平台初始化
Posted lida2003
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PX4模块设计之二十:PX4应用平台初始化相关的知识,希望对你有一定的参考价值。
PX4模块设计之二十:PX4应用平台初始化
在PX4启动过程章节的基础上,可以深入分析下PX4应用平台(框架)的实现。
1. PX4应用平台介绍
PX4应用平台初始化(px4_platform_init)在INIT初始化脚本之前,被PX4应用使用的抽象的模块都在这里进行初始化。
比如:
注:部分尚没有对应研读的文章,没有给出链接,后续会更新。
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. 讨论和思考
看到的一些现象:
- 整体上看这里PX4飞控系统是有一些基础组件(模块)的抽象。
- PX4应用平台软件模块,硬件驱动,框架设计等解耦并非都能完全到位。
- 各个模块的启动顺序相对来说还是有时序要求。
现象思考:
- 虽然有些软硬件的内容可能并非完全能够解耦到位。这也是可以完全理解的,毕竟嵌入式本身就是软硬件协同工作的产品。
- 随着系统设计规模化,功能复杂化,软硬件的解耦和抽象是非常重要的,并且是后续维护和进一步开发基础。
- 假设业务和硬件确实有强耦合,也可以通过一些方法论(比如:业务抽象和标准化)进行解耦,从而成为弱耦合而非强耦合。
- PX4作为开源代码,参与人员众多,且存在较多历史原因,重构是一个非常复杂的问题。
希望,随着硬件性能的提升,能有机会看到从上至下进行整体设计考虑,更加模块化/人性化,从整个产品系统做进一步的提升,便于更多的人易于了解和上手设计研发工作。
4. 参考资料
【1】PX4开源软件框架简明简介
【2】PX4模块设计之十:PX4启动过程
【3】PX4模块设计之十二:High Resolution Timer设计
【4】PX4模块设计之十三:WorkQueue设计
【5】PX4模块设计之二:uORB消息代理
【6】PX4模块设计之十五:PX4 Log设计
以上是关于PX4模块设计之二十:PX4应用平台初始化的主要内容,如果未能解决你的问题,请参考以下文章