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条回答
smilingangel
1楼-- · 2019-07-28 17:59
将FLASH分为启动区,和三个应用代码存放区。启动区位于0x05C00 ~ 0x0FF7F,三个应用代码存放区Block0~2分别位于  0x10000 ~ 0x1FFFF、0x20000 ~ 0x2FFFF和0x30000 ~ 0x3FFFF。程序启动时首先跳到启动区运行,然后程序根据标志判断当前应用代码运行在哪一个Block,利用跳转指令跳转到相应的Block区中去运行。
dirtwillfly
2楼-- · 2019-07-28 21:37
本帖最后由 dirtwillfly 于 2015-2-9 22:38 编辑

没太明白你说的“将中断向量拷贝到RAM中运行的方式来处理中断”什么意思。
mcu中有一个中断向量表(这个表不一定是显性的),mcu触发中断信号时,会根据中断号来在中断向量表中查找中断向量的地址,然后前往中断向量的地址读取中断向量中存储的中断服务程序的起始地址,然后就是执行中断服务程序了。
所以,如果改变中断向量的存储地址,要从中断向量表开始改变

dirtwillfly
3楼-- · 2019-07-28 22:35
第二个问题:应该跳转到main函数的起始地址,这里是整个代码的开始
johdon23
4楼-- · 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地址的变量即可。


dirtwillfly
5楼-- · 2019-07-29 03:14
 精彩回答 2  元偷偷看……
vivilzb1985
6楼-- · 2019-07-29 07:57
将CMD文件中的中断向量定义删除,不能编译通过。那么保留原来CMD文件中断向量定义,编译后得到的.txt文件。

一周热门 更多>