前面介绍了如何利用MCC生成Bootloader和Application的过程,此种方法简单方便,如果需要更复杂的功能,可以在此框架下进行完善。下面将介绍采用修改链接文件.gld实现基本的Bootloader和Application功能。
链接文件描述
MPLAB XC16目标链接器可基于重定位目标代码和任意归档/库文件生成用于dsPIC DSC和PIC24 MCU系列器件的二进制代码。大多数情况下都不需要直接调用链接器,因为编译器驱动程序xc16-gcc会自动使用所有必须的参数执行链接器。直接使用链接器并不简单,通常只有那些具有扎实的编译器和链接知识的用户才应尝试这么做(Bootloader相对不好做呀)。链接描述文件控制链接过程的各个方面,包括:
(1)分配数据存储器和程序存储器;
(2)将段从输入文件映射到输出文件;
(3)构造特殊数据结构(如中断向量表);
(4)分配目标器件的绝对SFR地址。
链接文件在整个编译过程所处的位置如下:
比如对默认链接文件的程序进行编译后观察Program Memroy,入口地址默认跳转至0x200进行程序的执行,前面6个是不可屏蔽陷阱向量(0x000E地址保留),后面是中断向量详细,均按照默认地址进行分配。
创建Boot项目
1.在MPLAB X IDE里面新建一个Boot Project(与新建普通项目过程一致),使能Timer1和AN0中断;重新再编译,观察Program Memory,可以发现对应IVT地址发生了变化。
2.修改.gld文件
链接描述文件在X:\Program Files\Microchip\xc16\v1.50\support\dsPIC33C\gld跟目录下,现在对默认gld的“.ivt __IVT_BASE :”部分进行修改。0x2000是从Page5开始,为什么每次加4?是因为每个GOTO语句占用两条指令,前面篇章有介绍。
添加修改好的gld链接文件。
对项目进行重新编译,观察Program Memory,可以看到IVT地址均发生了变化,产生了0x2000的偏移。
至此,Boot项目建立完毕。
创建Application项目
1.同样在MPLAB X IDE新建一个App Project,使能AN0和Timer1中断,这时需要将Bootloader的中断关闭,如果在bootloader和application里面都有同样的中断,会产生编译错误。
2.修改gld文件IVT偏移地址,Reset地址为0x2000,IVT地址被重映射为0x2004开始,Application入口地址为0x2400,长度0x29B00.
此处Application的Flash起始地址是0x2000,如果没有通知编译器在该位置放置一个reset跳转指令,而是由程序默认把初始化代码放在该处,这样做会有一定风险,编译器有一定的概率将其他代码放在了Flash起始位置,所以需要在gld文件中指定reset=0x2000,并不要屏蔽Reset Instruction.
修改Configuration Words部分。
修改默认gld里面“.ivt __IVT_BASE :”部分如下,在修改的时候一定要对照datasheet里面的中断IVT地址一一对应,否则会出错。
添加gld文件到项目文件。
编译成功后观察Program Memory,入口地址0x2000跳转到0x2402执行Application程序,同时T1中断和AN0中断也分别跳转到不同的地址去执行中断函数。
Bootloader和application分别添加修改后的GLD,可以看到Timer1 IVT地址0x0016产生偏移地址后为0x002028,在Application执行Timer1中断后,发生中断后通过GOTO指令跳转至0x2B74地址去执行中断函数。
在Application项目中添加Boot Project。
编译会发现出错,如下:
主要是因为链接器将为启用的中断生成一个默认向量,这就是为什么尽管Bootloader通过修改GLD文件设置了固定值,但仍由应用程序设置了值的原因。 应用程序设置了“ 002B74”,而Bootloader设置了“ 002028”。
同时在属性设置里面需要将创建默认中断ISR Unlock,如下:
另外在Application GLD中需要对使能中断名进行重新命名,同时中断函数也要改成一致。
重新进行编译,观察Application Flash Program Memory,IVT地址被重映射,偏移地址是0x2000,Application入口地址是0x2402.
至此,通过GLD修改完成了Bootloader IVT重映射和存储空间的再分配。