打印

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

[复制链接]
2971|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 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文件
   

Ref.zip

19.3 KB

相关帖子

沙发
smilingangel| | 2015-2-9 22:09 | 只看该作者
将FLASH分为启动区,和三个应用代码存放区。启动区位于0x05C00 ~ 0x0FF7F,三个应用代码存放区Block0~2分别位于  0x10000 ~ 0x1FFFF、0x20000 ~ 0x2FFFF和0x30000 ~ 0x3FFFF。程序启动时首先跳到启动区运行,然后程序根据标志判断当前应用代码运行在哪一个Block,利用跳转指令跳转到相应的Block区中去运行。

使用特权

评论回复
板凳
dirtwillfly| | 2015-2-9 22:37 | 只看该作者
本帖最后由 dirtwillfly 于 2015-2-9 22:38 编辑

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

使用特权

评论回复
地板
dirtwillfly| | 2015-2-9 22:39 | 只看该作者
第二个问题:应该跳转到main函数的起始地址,这里是整个代码的开始

使用特权

评论回复
5
johdon23|  楼主 | 2015-2-10 09:00 | 只看该作者
本帖最后由 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地址的变量即可。


Interrupt vector.png (172.74 KB )

SYSRIVECT

SYSRIVECT

使用特权

评论回复
6
dirtwillfly| | 2015-2-10 19:52 | 只看该作者
johdon23 发表于 2015-2-10 09:00
Hi,dirtwillfly:
     是这样的,MSP5438A的中断向量可以选择存放在Flash或RAM中,由SYSCTL寄存器的SYSRIV ...

学习了,我还真没这样用过:handshake
这样用的时候,原来中断向量的地址是不是就失效了?

使用特权

评论回复
7
vivilzb1985| | 2015-2-10 22:10 | 只看该作者
将CMD文件中的中断向量定义删除,不能编译通过。那么保留原来CMD文件中断向量定义,编译后得到的.txt文件。

使用特权

评论回复
8
firstblood| | 2015-2-11 23:00 | 只看该作者
复位中断向量所能跳转的最大地址为0xFFFF,所以程序启动时需要先运行到存放在低于0x10000地址的启动区,再从启动区利用BRA指令,跳转到相应的Block中去运行。

使用特权

评论回复
9
johdon23|  楼主 | 2015-2-12 09:29 | 只看该作者
dirtwillfly 发表于 2015-2-10 19:52
学习了,我还真没这样用过
这样用的时候,原来中断向量的地址是不是就失效了?
...

   我的理解是:
   默认的中断向量是保存在Flash的0xff80~0xffff地址。当程序运行在大于0x10000空间时,默认的中断向量就用不上了。定位在大于0x10000空间的中断复位程序在编译时,会得到一个大于0x10000的入口地址,那么我在程序启动时,将这个入口地址赋给RAM区,然后将中断向量的控制改为由RAM产生。这样程序在运行时,就可以从RAM中获得正确的中断复位程序的入口地址,从而跳转过去执行了。

使用特权

评论回复
10
dirtwillfly| | 2015-2-12 09:56 | 只看该作者
johdon23 发表于 2015-2-12 09:29
我的理解是:
   默认的中断向量是保存在Flash的0xff80~0xffff地址。当程序运行在大于0x10000空间时, ...

感谢指教,长知识了

使用特权

评论回复
11
angerbird| | 2015-2-26 21:31 | 只看该作者
将FLASH分为启动区,和三个应用代码存放区。启动区位于0x05C00 ~ 0x0FF7F,三个应用代码存放区Block0~2分别位于  0x10000 ~ 0x1FFFF、0x20000 ~ 0x2FFFF和0x30000 ~ 0x3FFFF。

使用特权

评论回复
12
cowboy2014| | 2015-2-28 07:55 | 只看该作者
budongbangding

使用特权

评论回复
13
smilingangel| | 2015-2-28 14:44 | 只看该作者
在线升级的需要考虑单片机内部flash的地址的。。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

34

主题

71

帖子

0

粉丝