pixhawk 学习总结2
Pixhawk编译环境搭建好,接下来就是要看APM源码了。介绍给大家一款非常好用的程序编辑器软件source insight,在windows下看源码是最好不过了。
飞控系统是一套庞大的系统,要理解一整套的流程的话,是要经过一番折腾才行。我的角度是用linux的分层架构去分析的,接下来就是我看代码所理解和整理的飞控架构。
飞控架构分为3层:飞行控制栈(主要是姿态的控制)和HAL(硬件抽象层)属于顶层应用,实时操作系统(nuttx)和底层驱动属于底层,还有就是引导系统启动的bootloader。
我所负责的是底层和bootloader,现在就来说说流程吧,从bootloader说起。
一.Bootloader源码:CPU启动过程
1.上电启动:EXTERN (vector_table)
1)初始化堆栈指针 .initial_sp_value = &_stack,
2)硬件错误为阻塞 .hard_fault = hard_fault_handler,
3)中断控制器 .irq = { IRQ_HANDLERS }
4)系统的复位入口函数 .reset = reset_handler,
2.入口函数:ENTRY(reset_handler)
1)定义数据段 .data和.bss
2)pre_main()(开启协处理器)
3)main()
3.main函数:main(void)
1)board_init()(开发板的初始化)
2)bootloader()(nuttx系统的设置)
3)jump_to_app()(测试引导nuttx系统)
二.APM的源码:nuttx系统的启动
1.bootloader引导进入.vectors向量表:stm32_vectors.S
1)定义堆栈的大小
2)定义STM32的中断向量表
3)入口函数是ENTRY(__start)
2.入口函数是ENTRY(__start)
1)stm32的配置和初始化
2)nuttx系统的入口函数os_start()
3.系统入口函数os_start()
1)nuttx系统的初始化
2)nuttx系统的启动进程os_bringup()
4.系统的启动进程os_bringup()
1)创建内核进程
2)创建用户进程
a.创建init进程(main_t)CONFIG_USER_ENTRYPOINT
IO板 : CONFIG_USER_ENTRYPOINT =user_start
Fmu板:CONFIG_USER_ENTRYPOINT = nsh_main
5.IO板系统进程入口函数:user_start(没有使用根文件系统)
6.fmu板系统进程入口函数:nsh_main(根文件系统binfs)