您的位置:首页 > 其它

Pixhawk_bootloader简介

2017-06-05 18:48 225 查看
origin: http://blog.csdn.net/wangcfan/article/details/51273780 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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: