本帖最后由 johdon23 于 2015-2-9 16:30 编辑
背景介绍:
我正在做的一个项目要求实现在线升级功能。使用的是MSP430F5438A芯片。我的基本思路是,将FLASH分为启动区,和三个应用代码存放区。启动区位于0x05C00 ~ 0x0FF7F,三个应用代码存放区Block0~2分别位于 0x10000 ~ 0x1FFFF、0x20000 ~ 0x2FFFF和0x30000 ~ 0x3FFFF。程序启动时首先跳到启动区运行,然后程序根据标志判断当前应用代码运行在哪一个Block,利用跳转指令跳转到相应的Block区中去运行。
在线升级的方式是通过串口协议,将不同Block的目标文件写入到对应的Block地址。
由于三个应用代码存放的地址超过了0xFFFF,所以需要将中断向量拷贝到RAM中运行的方式来处理中断;
并且由于复位中断向量所能跳转的最大地址为0xFFFF,所以程序启动时需要先运行到存放在低于0x10000地址的启动区,再从启动区利用BRA指令,跳转到相应的Block中去运行。
问题:
1. 为了编译得到位于三个不同区间的目标文件,需要对CMD文件进行修改,将代码定位到Block0~2的区间。这里有个问题,就是因为我已经将中断向量拷贝到RAM中运行的方式来处理中断,那么CMD文件中原来定义的从0xffd2地址开始存放的中断向量还有没有意义?我试图将CMD文件中的中断向量定义删除,不能编译通过。那么保留原来CMD文件中断向量定义,编译后得到的.txt文件。我是否可以将文件中包含的从0xffd2~0xffff地址的内容删除,保留余下部分。然后通过串口将文件写入到对应的区间,这样程序能正常运行吗?
比如对于Block1的文件,我希望它是存放在0x10000~0x1ffff区间的,所以将cmd文件中相关地址全部定义到0x10000~0x1ffff区间。但是编译之后得到的.txt文件是从0xffd2开始的。那么我将从0xffd2~0xffff地址的数据删除,得到一个新的.txt文件。再通过串口,将这个新的.txt文件从地址0x10000开始,全部写入到MCU的Flash中。重新启动后,从启动区跳转到Block1的起始地址开始运行,程序是否能够正确运行?
2. 上述跳转到Block的过程中,是应该跳到每个Block的起始地址,还是应该跳转到main函数的起始地址?
比如,Block1的起始地址是0x10000,存放在Block1中的应用程序的main函数的起始地址是0x10266,那么在启动区要跳转到Block1时,是应该跳转到0x10000地址,还是0x10266地址呢?
附件包含了自定义的CMD文件,已经编译得到的map和txt文件
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>