SoC上电后,不同架构的处理器,代码执行的初始位置不同。
下边,根据最近的一个项目来做出说明,整体的逻辑规划是这样的:
*上电判断启动方式,即用户选择是否选择更新程序;
若是,则判断是通过SD卡还是通过串口进行更新;
*若用户不曾选择进行程序更新,则在跳转到flash,执行既有代码;
以上就是bootloader实现的主要功能。
此处上电执行的地址是0x00000000。(此处放置中断向量表)
1----- 此处第一句Reset/NMI中断 (跳转到SOC运行环境初始化函数(CPU初始化、堆栈初始化、内存初始化、跳转到main)(前三步骤涉及到更底层的硬件暂且不作说明)),
其后放置的是其他的中断向量表的内容;
2----- 在main函数:
2.1 初始化硬件设备驱动(UART 、 FLASH 、I2C、GPIO、SD card等等,根据设计不同,需要初始化的硬件驱动不同)
2.2 判断启动设置( SD卡 或者 USB_Serial 或者 执行flash中原有的程序(位置0x80000000))
通过板级的跳线或者按键的选择,来判断此次启动的方式:
a、首先,判断是否有SD卡、并进一步判断SD卡中是否有可用的更新程序,如果有则将新的程序复写到0x80000000的位置;
b 、若a未能进行,则判断是否通过USB_Serial进行程序更新,即通过PC上位机将新的程序复写到0x80000000的位置;
c、 经过判断,若没有选择a、b两种方式,则跳转到flash的0x80000000位置开始执行,但是 当0x80000000位置存放的代码有误的时候(由于某种原遭到破坏),则自动执行b过程,等待上位机对SOC进行 代码更新;
3------ 当程序更新完毕或者未进行更新直接跳转到0x80000000位置执行,均意味着BootLoader的一次使命完整结束了。
需要说明的是,更新成功后,可以选择进入原处循环等待也可以选择稍后跳转到0x80000000执行新的程序
-----------------------------------
在BootLoader中,SOC也可以响应其他中断,具体能够响应哪些根据向量表中的不同的设置实现。