MSP430在线升级的思考和问题请教!!!

2019-07-28 17:29发布

本帖最后由 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文件
   
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
12条回答
johdon23
2019-07-29 01:29
本帖最后由 johdon23 于 2015-2-10 09:11 编辑
dirtwillfly 发表于 2015-2-9 22:37
没太明白你说的“将中断向量拷贝到RAM中运行的方式来处理中断”什么意思。
mcu中有一个中断向量表(这个表 ...

Hi,dirtwillfly:
     是这样的,MSP5438A的中断向量可以选择存放在Flash或RAM中,由SYSCTL寄存器的SYSRIVECT位来控制(见附件)。


       只所以要将中断向量放到RAM中去,是因为我帖子中描述的,我需要将程序存放到大于0xFFFF的空间。


       而如果将中断向量放到Flash中,那么它们将位于0xff80~0xffff。这样程序就无法调用中断向量。


       将中断向量放到RAM中之后,只需要在启动的时候,将中断服务程序的入口地址赋给保存在相关RAM地址的变量即可。


一周热门 更多>