DSP Bootloader设计(之)初识Bootloader

2019-04-14 08:34发布

class="markdown_views prism-atom-one-light">

DSP Bootloader设计(之)初识Bootloader


写在前面的话:
本文对DSP Bootloader为何物进行了系统介绍,但Bootloader设计过程较为复杂,更详细的设计过程无法在本文中罗列,更多的细节在公众号【iFTrue未来已来】中有系列文章的多期发布。并且可以获取DSP学习电子书籍与课件PPT。 查看方式:
1) 微信扫描下方二维码,关注公众号【iFTrue未来已来
在这里插入图片描述
2) 后台回复关键字 “【 Bootloader 】” 即可获取所有相关文章的目录
3) 后台回复关键字“ 【DSP书籍】 ”即可获取相关电子书和PPT

正文: Bootloader即引导程序,一般指DSP上电复位后负责程序跳转至应用程序之前的出厂程序;也范指将程序数据由指定接口(如CAN)装载到固定区域的过程,包括一次Bootloader和二次Bootloader。

一次Bootloader

DSP上电复位后,会触发RESET中断,中断指向固化在片内ROM中的Bootloader代码。这是出厂就存在的引导程序,不可修改。它实现的功能是查询Bootloader模式,初始化接口,并从该接口中读取“固定大小”内的源程序并搬移到RAM中执行。这个过程叫一次引导。注意此时的Bootloader不会初始化与模式无关的外设。

二次Bootloader

对于小程序,只需要一次引导,但一般程序规模大于“固定大小(一般64K或1K)”,这时需要在一次Bootloader的基础上编写一个新的引导程序,这个引导程序不超过“固定大小”,而源程序则放在另外一处,这样在新的Bootloader程序中实现搬移源程序的工作。当系统复位时,一次引导把接口中的二次引导程序复制到RAM中执行,复位结束后,在RAM中执行二次引导,将目的源程序复制到FLASH中执行。即第二次引导实现真正的代码搬移,一次引导是二次引导的引导。 以上是常规意义的二次引导,另外一种方案是仅使用一次引导的程序跳转功能,不使用一次引导复制程序,而程序复制与装载由位于FLASH区的新编写的引导程序完成,实现真正的代码搬移,这里的二次Bootloader具有二次开发的意思。

DSP上电引导过程

当CPU上电时,会引起上电复位RESET。 RESET向量位于固化在boot ROM中的CPU Vector Table。TMS320x2803x的CPU Vector Table位于地址0x3F E000 - 0x3F FFFF。 CPU Vector Table内容如下图,其中唯一可被正常响应的向量就是位于0x3F FFC0的RESET向量。RESET向量出厂固化为指向InitBoot函数,InitBoot函数位于上图中的Bootloader functions区域。 进入InitBoot函数后,开始执行Bootloader模式查询过程,并根据查询选择的模式根据需求判断是否调用接口函数(如CAN、SCI、I2C等)读取“固定大小”内的源程序并搬移到RAM中执行,或者直接进入入口地址(如FLASH启动,地址为FLASH用户可用区域的最后2字的位置),TMS320x2803x FLASH入口地址为0x3F 7FF6。至此,完成一次Bootloader过程。 当仅使用一次引导的程序跳转功能,不使用一次引导复制程序时,上图中条件判断“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函数,开始运行应用程序。 更多细节可以参照:
https://mp.weixin.qq.com/s/vUEiyAy81DWMkMYW4nt1Jw.
.
.
.
.
.
.