项目学习::(五)项目启动流程(从上电开始)"/>
PX4项目学习::(五)项目启动流程(从上电开始)
PX4的启动流程
初学c语言对RTOS不是很熟悉的同学对main函数都有着不一般的执着,阅读代码时总是会去找程序的main函数,然后从入口处开始阅读。 实际上我们接触的所有软件程序,使用到的main函数都不是程序实际开始运行的入口,只是用户程序的入口而已。从这个角度而言,PX4的每个任务的main函数都是该任务的入口。
这一篇我们分析一下PX4是如何从单片机的启动汇编入口引导到应用任务启动的。
PX4的启动流程分为两个部分,第一部分为Nuttx的启动,到加载nsh启动脚本;第二部分为PX4启动脚本的执行,用于启动PX4的所有应用程序。
一、第一部分Nuttx的启动流程:飞控程序跑起来之前的操作——bootloader
Bootloader是系统上电后启动的一段引导程序,负责引导进入Nuttx系统。
1.1bootloader和Nuttx启动
在嵌入式系统中,通常并没有像BIOS那样的固件程序(注,有的嵌入式CPU也会内嵌一段短小的启动程序),因此整个系统的加载启动任务就完全由BootLoader来完成。
Bootloader是嵌入式系统在上电后执行的第一段代码,在它完成CPU和相关硬件的初始化之后,再将操作系统映像或固化的嵌入式应用程序装在到内存中然后跳转到操作系统所在的空间,启动操作系统运行.
1.2主处理器和协处理器的固件烧写和运行流程
上图为主处理器和协处理器,固件下载到固件运行的流程图。值得说明的一点是分别给两个处理器下载blootloader以后,主处理器等待下载飞控固件,用地面站通过USB向飞控固件,下载完以后,主处理器的飞控固件启动,这时候通过串口给协处理器下载固件(固件只是下载一次)。这个工作完成之后,主处理器和协处理器同时开始工作。
Firmware\src\modules\px4iofirmware 这里面主要是一些,IO口的操作和安全开关的操作。他会在编译飞控固件的时候,一起被编译成为px4io-v2.bin,放在NUTTX文件系统中,在主处理器运行的时候把这个固件烧写进入协处理器。具体的烧写到单片机的FLASH哪个位置由px4io.cpp文件设置。
在软件层面的详细流程图如下:
PX4启动流程,分为4步:
1.__start:
上电之后程序入口为Firmware/NuttX/nuttx/arch/arm/src/stm32/stm32_start.c中的__start函数,负责stm32芯片的底层初始化,包括是时钟,GPIO等。
2.os_start:
__start函数调用Firmware/NuttX/nuttx/sched/os_start.c中的os_start函数,负责os的底层初始化,包括队列和进程结构等。
3.os_bringup:
os_start函数调用Firmware/NuttX/nuttx/sched/os_bringup.c中的os_bringup函数,负责os基本进程的启动和用户进程的启动。用户启动入口由CONFIG_USER_ENTRYPOINT宏定义进行指定。
4.CONFIG_USER_ENTRYPOINT:
FMU和IO的启动入口不同,分别为:
(1)FMU中CONFIG_USER_ENTRYPOINT宏定义为nsh_main:
[1] 调用nsh_main函数。
[2] nsh_main函数调用Firmware/NuttX/apps/nshlib/nsh_consolemain.c中nsh_consolemain函数。
[3] nsh_consolemain函数调用nsh_initscript函数。
[4] nsh_initscript函数所执行的脚本即为FMU的启动脚本rcS。
[5] rcS脚本中负责挂载Sd卡,启动uorb,加载参数配置文件,启动dataman数据管理,启动各传感器,commander,执行rc.io,执行rc.interface(混控器),执行rc.mc_app(飞控姿态与位置算法)等。(2)IO中CONFIG_USER_ENTRYPOINT宏定义为user_main:
调用src/modules/px4iofirmware/px4io.c中的user_start函数,负责IO基础环境的初始化,包括PWM,串口,ADC等,最后进入死循环,用于遥控器输入和与FMU通信的内容。
到这里为止即完成了Nuttx系统的启动,程序执行到加载启动脚本,后面即是PX4应用的启动。
PX4系统层(platforms):除了nuttx系统以外,还有common(中间件);
中间件主要提供:px4_work_queue(nx_work_queue);uORB;task_manage;驱动等
PX4板子启动平台公共部分:HRT、console_buffer、crypto、WorkQueue、uorb、log、mavlink_usb_check等。(这部分后续有时间继续深入。)
二、从RCS启动脚本可以看出哪些东西
启动脚本是一个神奇的东西,它能够识别出你对应的飞机类型,加载对应的混控器,选择对应的姿态、位置估计程序以及控制程序,初始化你需要的驱动程序。下面来分析下。
2.1RCS启动脚本的位置(从芯片初始化(init)到项目启动(start))
Firmware->ROMFS->px4fmu_common->init.d->rcs,代码参见项目代码。
网上找的PX4启动流程图:
从上述的图片分析可知,启动脚本实现了挂载SD卡,设置存储好的飞行控制初始参数(可以通过地面站修改),启动所有外设传感器,启动与地面站通行的Mavlink服务,以及机型的选择后对应启动的控制服务(以固定翼为例,启动了ekf2,fw_att_control,fw_pos_control_l1,airspeed_selector,land_detector等服务),打开navigator服务。
综上:RCS启动脚本就是在进行一些配置,并且开始了一个个进程。
(56条消息) PX4代码阅读笔记(二)——启动脚本_px4 sd卡命令_星光2020的博客-CSDN博客
启动的过程按图示大致如下(当前版本)
其中黄色部分为SD卡自定义脚本,蓝色部分为控制相关程序,紫色部分为机型相关自动配置程序,绿色部分为算法程序。
总结主要的点有:
1 程序启动首先Load SD卡,如果SD卡上有自定义启动脚本,就运行SD卡上的脚本,如果没有(默认情况),运行板载自动启动流程
2 机型相关的参数配置通过SYS_AUTOSTART值来定义,通过设置这个值,可以自动载入某一机型对应的参数(如DJI 450,3DR SOLO等)
3 飞行控制相关程序在commander,rc.vehicle_setup,navigator等模块或脚本启动,主要的飞控相关模块有
rc_input - 遥控输入
commander - 命令处理
navigator - 导航
pos_control - 位置控制
att_control - 姿态控制
pwm_out - 电机输出
PX4板子启动平台公共部分:HRT、console_buffer、crypto、WorkQueue、uorb、log、mavlink_usb_check等。(这部分后续有时间继续深入。)
参考文献:
(54条消息) PX4模块设计之十:PX4启动过程_px4启动流程_lida2003的博客-CSDN博客
(51条消息) PX4二次开发——PX4程序架构_多谱hhhh的博客-CSDN博客_px4飞控二次开发
(51条消息) PX4二次开发——程序运行过程_多谱hhhh的博客-CSDN博客_px4二次开发
(52条消息) PX4-10-系统启动流程_AcmeUav的博客-CSDN博客_px4启动流程
更多推荐
PX4项目学习::(五)项目启动流程(从上电开始)
发布评论