Westbrook
认证:VIP会员
所在专题目录 查看专题
dsPIC33 BootLoader(4)-基于MCC配置Boot区
dsPIC33 BootLoader(5)-基于MCC生成应用程序
Bootloader演示
dsPIC33 Bootloader(6) -开发时需要考虑的一些关键问题
dsPIC33 BootLoader(7)-修改链接描述文件GLD
dsPIC33 Bootloader(8)-Hex文件解析
作者动态 更多
10分钟教你快速完成数字电源的闭环控制
2022-04-02 17:26
数字电源学习板演示
2022-02-19 13:36
手把手教你学数字电源系列视频(22)- 数字控制的软件流程
2022-02-19 13:28
手把手教你学数字电源系列视频(21)- 设计数字补偿器(LDE执行)
2022-02-19 13:28
手把手教你学数字电源系列视频(20)- 设计数字补偿器(AB系数计算)
2022-02-19 13:27

dsPIC33 BootLoader(7)-修改链接描述文件GLD

前面介绍了如何利用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重映射和存储空间的再分配。

声明:本内容为作者独立观点,不代表电子星球立场。未经允许不得转载。授权事宜与稿件投诉,请联系:editor@netbroad.com
觉得内容不错的朋友,别忘了一键三连哦!
赞 3
收藏 3
关注 767
成为作者 赚取收益
全部留言
0/200
成为第一个和作者交流的人吧