“ Bootloader定义·DSP上电引导过程
”
Bootloader即引导程序,一般指DSP上电复位后负责程序跳转至应用程序之前的出厂程序;也范指将程序数据由指定接口(如CAN)装载到固定区域的过程,包括一次Bootloader和二次Bootloader。
01、一次Bootloader
DSP上电复位后,会触发RESET中断,中断指向固化在片内ROM中的Bootloader代码。这是出厂就存在的引导程序,不可修改。它实现的功能是查询Bootloader模式,初始化接口,并从该接口中读取“固定大小”内的源程序并搬移到RAM中执行。这个过程叫一次引导。注意此时的Bootloader不会初始化与模式无关的外设。
02、二次Bootloader
对于小程序,只需要一次引导,但一般程序规模大于“固定大小(一般64K或1K)”,这时需要在一次Bootloader的基础上编写一个新的引导程序,这个引导程序不超过“固定大小”,而源程序则放在另外一处,这样在新的Bootloader程序中实现搬移源程序的工作。当系统复位时,一次引导把接口中的二次引导程序复制到RAM中执行,复位结束后,在RAM中执行二次引导,将目的源程序复制到FLASH中执行。即第二次引导实现真正的代码搬移,一次引导是二次引导的引导。
以上是常规意义的二次引导,另外一种方案是仅使用一次引导的程序跳转功能,不使用一次引导复制程序,而程序复制与装载由位于FLASH区的新编写的引导程序完成,实现真正的代码搬移,这里的二次Bootloader具有二次开发的意思。
03、DSP上电引导过程
当CPU上电时,会引起上电复位RESET。RESET向量位于固化在boot ROM中的CPU Vector Table。TMS320x2803x的CPU Vector Table位于地址0x3F E000 - 0x3F FFFF。
(图:TMS320x2803x Piccolo Boot ROM Reference Guide)
CPU Vector Table内容如下图,其中唯一可被正常响应的向量就是位于0x3F FFC0的RESET向量。RESET向量出厂固化为指向InitBoot函数,InitBoot函数位于上图中的Bootloader functions区域。
(图:TMS320x2803x Piccolo Boot ROM Reference Guide)
进入InitBoot函数后,开始执行Bootloader模式查询过程,并根据查询选择的模式根据需求判断是否调用接口函数(如CAN、SCI、I2C等)读取“固定大小”内的源程序并搬移到RAM中执行,或者直接进入入口地址(如FLASH启动,地址为FLASH用户可用区域的最后2字的位置),TMS320x2803x FLASH入口地址为0x3F 7FF6。至此,完成一次Bootloader过程。
(图:TMS320x2803x Piccolo Boot ROM Reference Guide)
当仅使用一次引导的程序跳转功能,不使用一次引导复制程序时,上图中条件判断“Call Get_Mode()?”和“Call Boot Loader?”将不被满足,从而执行“No”分支,最终默认配置将进入FLASH区域的BEGIN区(地址0x3F 7FF6)。
对于BEGIN区,查看CMD文件中的MEMORY指令,如下图。BEGIN位于PAGE 0,起始地址为0x3F 7FF6,长度为0x00 0002。(注:该地址恰好位于FLSAH用户可用区的末尾,且长度刚好可以存放一条长跳转语句)
对于BEGIN区内存放的程序段,查看CMD文件中的SECTION指令,如下图。可以看出程序段“codestart”将被存放于此。
那么“codestart”程序段里又是什么?查看工程中的“xxx_CodeStartBranch.asm”汇编源文件,如下图,BEGIN区将存放一条长跳转指令,该指令默认指向c_int00。
c_int00是C/C++程序的入口地址,用于完成C运行环境的初始化,最终跳转到main函数,开始运行应用程序。
(图:TMS320C28x Assembly Language Tools v18.1.0.LTS User's Guide)
转自:
https://mp.weixin.qq.com/s?__biz=MzU4OTY3OTk2MQ==&mid=2247483666&idx=1&sn=e2cff08a96b6216198c990108cff8a9d&chksm=fdc89d24cabf143234ecd68685af32947643551f84158691b71e1d182255ebe27831dbc15db4&scene=21#wechat_redirect
(图:TMS320C28x Assembly Language Tools v18.1.0.LTS User's Guide)