Pixhawk_bootloader简介

Pixhawk Bootloader引导过程简介

自己结合网络上的资源总结的内容,有不对的地方请及时指出,有侵权的请指出!

QQ:4862879


Pixhawk硬件使用STM32的芯片,

Cortex M3的内核有三种启动方式,其分别是:

      A.通过boot引脚设置可以将中断向量表定位于SRAM区,即起始地址为0x2000000,同时复位后PC指针位于0x2000000处;
      B.通过boot引脚设置可以将中断向量表定位于FLASH区,即起始地址为0x8000000,同时复位后PC指针位于0x8000000处;
     C.通过boot引脚设置可以将中断向量表定位于内置Bootloader区,
M3单片机复位后,从0x00000000取栈指针(SP),从0x00000004取复位向量(PC),有了栈指针和复位向量后,单片机就按照正常流程运行了,单片机启动默认先运行BootLoader,所以默认的中断向量表位置是BootLoader的中断向量表。

Cortex-M3单片机有一个管理中断向量表的寄存器,叫做向量表偏移量寄存器(VTOR)(地址:0xE000_ED08)。具体可以看看截图:



STM332的BootLoader程序一般是在0x08000000,不是在0x00000000是因为STM32的重映射技术(不符合Cortex-M3),所以BootLoader的中断向量表在0x08000000那里。如果我们新下载的程序在0x08060000,并且新程序的中断向量表在起始地址,那么下载完程序,为了新程序能正确运行,我们需要把中断向量表重定位到0x08060000那里,再跳转到新程序运行。
Cortex-M3内核规定,起始地址必须存放堆顶指针,而第二个地址则必须存放复位中断入口向量地址,这样在Cortex-M3内核复位后,会自动从起始地址的下一个32位空间取出复位中断入口向量,跳转执行复位中断服务程序。Cortex-M3内核是固定了中断向量表的位置而起始地址是可变化的.

一.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() //分为main_f1.c和main_f4.c
3.main函数:main(void)
1)board_init()(开发板的初始化)
2)bootloader()(nuttx系统的设置)
3)jump_to_app()(测试引导nuttx系统)
二.Nuttx系统的启动
1.bootloader引导进入.vectors向量表:stm32_vectors.S
1)定义堆栈的大小
2)定义STM32的中断向量表
3)入口函数是ENTRY(__start)
2.入口函数是ENTRY(__start)
1)stm32的配置和初始化
2)nuttx系统的入口函数os_start() //\Firmware\NuttX\nuttx\sched\os_start.c启动Nuttx系统
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)




你可能感兴趣的:(Pixhawk@APM)