【C2000 LaunchPad】在FLASH里运行
在FLASH里运行程序,只是将程序烧写到FLASH中,与在RAM里运行没
有本质的区别。但是在FLASH里运行需要设置等待周期,对于对时间要求严
格的过程,需要拷贝到RAM中运行,以达到最高速度。这样,如果对程序处
理不当,就有可能使在RAM中运行正常的程序烧入FLASH中后就无法正常运
行。关于这方面的内容需要看这两个:《TMS
Compiler User's Guide》、《TMS
及其它相关文件。
下面在前几节实例的基础上,向大家介绍如何在FLASH里运行程序。
一、更换CMD文件
1、使用F28027.COM文件。
在Project Explorer窗口右击项目名称,在出现的右键菜单里选择Properties,
更换CMD文件方法如下:
也可以在Project Explorer窗口右击F28027.COM文件,在出现的右键菜单里
选择Properties,将这个文件包含在工程中:
2、去掉28027_RAM_lnk.cmd文件。右击28027_RAM_lnk.cmd在出现的右
键菜单里选择Properties,并将它打上勾:
3、F2802x_Headers_nonBIOS.cmd不管在什么情况下都是要用的。它是定
义内部特殊寄存器用的,如CPU定时器寄存器。这些是固定不变的。
二、将需要在RAM中运行的过程拷贝到RAM中。
首先定义哪些过程(函数)需要在RAM里运行,然后使用MemCopy()将
它们搬到RAM中。
1、定义ramfuncs的过程
这里的关键字“ramfuncs”是在CMD文件中定义的:
ramfuncs : LOAD = FLASHA,
RUN = PRAML0,
LOAD_START(_RamfuncsLoadStart),
LOAD_END (_RamfuncsLoadEnd),
/* LOAD_SIZE(_RamfuncsLoadSize),*/
RUN_START(_RamfuncsRunStart),
PAGE = 0
由上可见,在烧写时,将定义的ramfuncs部分写在FLASHA里,系统运
行时再拷贝到PRAML0里运行,这里的RamfuncsLoadStart等,是由编
译器生成的。在文件的开头或包含的头文件中需要加上声明:
extern Uint16 RamfuncsLoadStart;
extern Uint16 RamfuncsLoadEnd;
extern Uint16 RamfuncsRunStart;
定义ramfuncs的过程是使用#pragma宏指令:
#pragma CODE_SECTION(SCITXINTA_ISR, "ramfuncs");
#pragma CODE_SECTION(SCIRXINTA_ISR, "ramfuncs");
以上两行代表将SCITXINTA_ISR()及SCIRXINTA_ISR()作为ramfuncs。
对于其它需要指定ramfuncs的过程,参照此方法。
注意:使用#pragma宏指令,要在该过程所在的文件中使用,否则无效。
可以在MAP文件中查看。
以上两行如果不在当前文件中使用,而放在主文件中时,map文件是这样的
ramfuncs 0
如果把这两行放在过程所在的文件中时,MAP文件是这样的:
ramfuncs 0
对于使用汇编语言编制的程序,则使用sect命令,如F2802x_usDelay()过程:
.def _DSP28x_usDelay
.sect "ramfuncs"
.global __DSP28x_usDelay
_DSP28x_usDelay:
SUB ACC,#1
BF _DSP28x_usDelay,GEQ ;; Loop if ACC >= 0
LRETR
此时的sect命令的使用,也是在过程所在的当前文件中。
2、将过程从FLASH拷贝到RAM中。
使用以下方法:
MemCopy(&RamfuncsLoadStart, &RamfuncsLoadEnd, &RamfuncsRunStart);
原形如下:
void MemCopy(Uint16 *SourceAddr, Uint16* SourceEndAddr, Uint16* DestAddr)
{
while(SourceAddr < SourceEndAddr)
{
*DestAddr++ = *SourceAddr++;
}
return;
}
3、初始化FLASH,设置等待时钟数。此函数使用TI提供的,不需要更改。