bootloader即引导程序,在学嵌入式中也有这个概念。今天又是纠结了一天的概念和流程,总算有个初步的认识,先把它记下来。
这里有必要清楚什么叫二次bootloader。首先dsp上电复位后,会触发复位中断,中断指向固化在片内ROM中的bootloader代码。这是出厂就存在的引导程序,不可修改。它实现的功能是查询bootloader模式规定的接口,初始化该接口,并从该接口中读取“固定大小”内的源程序并搬移到内存RAM的0地址执行。这个过程叫一次引导。至于为什么要搬到RAM执行程序,因为内存读取速度远比flash等快。注意此时的bootloader不会初始化与模式无关的外设。
小程序只需要一次引导,但一般程序规模大于这个“固定大小(一般64K或1K)”,这时候程序员就在原接口储存器编写一个新的引导程序,这个引导程序不会超过这个“固定大小”,而源程序则放在另外一处,这样在新的bootloader程序中实现搬移源程序的工作。这样当系统复位时,第一次引导把接口中的第二次引导程序复制到RAM中执行,复位结束后,在RAM的0地址中执行第二次引导,将目的源程序复制到RAM中执行。即第二次引导实现真正的代码搬移,第一次引导是第二次引导的引导。
整个引导程序模块有以下部分:
1、存储区、代码段和数据段的配置;
该部分即链接命令cmd文件,具体语法可查阅。
2、编写二次引导程序,生成复制表;
因为一次引导程序没有初始化C语言环境,所以二次引导程序一般只能用汇编语言编写。程序中包括三部分:
a. 配置需要的外设寄存器,例如EMIF寄存器。
b. 定义复制引导表,并根据表信息用代码实现源代码的搬移。
(所谓引导表,可以理解为复制代码时需要的格式要求)
c. 跳转到C程序入口函数c_int00(),它最后会调用main函数。
3、COFF文件转化为hex和bin文件。
烧写需要hex和bin格式,需要进行转化。需要编写boot引导表格式生成cmd文件,注意这个cmd文件不是链接命令的那种。然后调用软件自带的exe程序,以cmd文件为参数,对引导程序和源程序一起编译产生的.out文件进行格式转换,转换后可以烧写入flash。
最后,对于引导表的生成有两种方法,一种是显式的说明大小、地址等,一种是借助链接cmd文件相关指令。我也没实践过,先记着吧。