最近在研究DSP遇到了一个问题,程序能在RAM中正常运行,但写入到FLASH中后不能运行.
花了几天的时间后来终于搞定,今天在这里与大家一起来分享一下经验.
DSP程序写入到FLASH中无法运行的原来一般来说有下面几种原因:
1、CMD文件配置错误
2、编译选项不正确
3、定义了在RAM中运行的函数,但在调用函数之前没有将其复制到RAM中,使程序跑飞。
4、FLASH寄存器配置不正确
如果你能解决上面的四方面的问题,你的程序一定能在FLASH中跑起来。下面教你怎样处理这些问题
一、CMD文件配置不正确。
这个可能性很小,因为CMD文件配置非常简单,如果你对CMD文件不太了解,请先学习一些这方面的知识,此处不讲,假设你对CMD文件已经了解。FLASH中运行的CMD文件与在ARM中运行的CMD文件不相同,具体不同点请查阅TI公司的文档SPRA958F(Runnung an Application from Internal Flash Memory on the TMS320F28XX DSP),这里面讲的非常清楚,包括Non-BIOS/BIOS 工程。我相信只要你认真看完那本大约40页的书,你一定能排除是CMD配置错误引起程序不能运行的原因,如果你到这一步你的程序能正常运行了,那恭喜你你是最幸运的,如果没有正常运行,不要急,慢慢来,下面还有更好的解决办法在等你。
二、编译选项不正确
这个原因对一些经验不足的同志来说可能被忽略,请看下图
在编译选项中有一个优化等级的配置选项(上图的红 {MOD}圈内的),如果你的程序不能运行你可以将他设置为None,即为不优化,设置好后保存,再重新编译你的工程,再将程序写入到FLASH中看看能不能运行。如果程序能运行,恭喜你,你也是幸运。因为你比上面的同志多学了一招,会受益终生的,如果不能运行那你更好幸运,说明你的程序原因不在这里,你还可以学习更多的知识。你会比别人更强。
三、定义了在RAM中运行的函数,但在调用函数之前没有将其复制到RAM中,使程序跑飞。
如果你定义了RAM函数,如TI公司头文件中自带InitFlash函数,这些函数会以CODE_SECTION申明。如下
#pragma CODE_SECTION(InitFlash, "ramfuncs");
在CMD文件中的SECTIONS段中应该有下面这样的说明
ramfuncs : LOAD = FLASHD,
RUN = RAML0,
LOAD_START(_RamfuncsLoadStart),
LOAD_END(_RamfuncsLoadEnd),
RUN_START(_RamfuncsRunStart),
PAGE = 0
在你的C文件中应该有外部变量的申明。如下
extern Uint16 RamfuncsLoadStart;
extern Uint16 RamfuncsLoadEnd;
extern Uint16 RamfuncsRunStart;
当然上面说的那些在SPRA958F(Runnung an Application from Internal Flash Memory on the TMS320F28XX DSP)中都有说明。
最重要的下面的函数调用
InitFlash();
MemCopy(&RamfuncsLoadStart, &RamfuncsLoadEnd, &RamfuncsRunStart);(这个MenCopy用的TI头文件中)
你必须执行上面的函数,在你调用那些定义在RAM中运行的函数之前,否则活神仙也不能帮你解决问题。
到这里的时候我相信你一定能松一口气了,因为你的问题应该已经解决了(只要你没有误解我的意思),先恭喜不管你有没有解决问题,因为就算你没有解决问题你也学到了一点点东西吧。
4、FLASH寄存器配置不正确
这种可能性很少,也可以会不会出现,只要你用的是TI公司的头文件(没有被修改过)我相信就不会出现这问题,TI的默认配置就可以正常运行只是你应该调用InitFlash();这个函数,哈哈你不要忘记了上面说的第三个可能性哦MemCopy。
关天FLASH的配置我就不说了你自己看TI的文档吧,根据你自己的需要配置。