赞
踩
在DSP程序烧入flash后,为了使得程序运行时间和ram中一样,需要将程序搬运到ram里面。网上通常教的方法是利用memcopy函数,将需要搬迁到Ram的函数从Flash搬运至Ram中。
在main.c写
#pragma CODE_SECTION(adca1_interrupt_isr,"ramfuncs");//指定某函数在ram里运行
MemCopy(&RamfuncsLoadStart, &RamfuncsLoadEnd, &RamfuncsRunStart);
InitFlash();
如果adca1_interrupt_isr包含了所有的程序,而且没有程序调用的话,这样确实是使得所有的算法都运行到了ram里面,但是如果adca1_interrupt_isr中有几个函数A,B,C,D。它们写在了另一个文件vector.c中,那么这时候,A,B,C,D这几个函数的代码其实仍然是在flash中运行的。这样,程序的执行时间会变得和ram中不同。也就是说,这种方法只能将指定的函数搬运至Ram,这一函数调用的子函数并不会被搬运。
为了实现真正搬运所需的全部函数,需要对CMD文件进行修改。
ramfuncs : LOAD = FLASHD,
RUN = RAML0,
LOAD_START(_RamfuncsLoadStart),
LOAD_END(_RamfuncsLoadEnd),
RUN_START(_RamfuncsRunStart),
LOAD_SIZE(_RamfuncsLoadSize),
PAGE = 0
{
-l rts2800_fpu32.lib<boot.obj>(.text) /**/
-l rts2800_fpu32_fast_supplement.lib<cos_f32.obj>(.text)
-l rts2800_fpu32_fast_supplement.lib<sin_f32.obj>(.text)
-l rts2800_fpu32_fast_supplement.lib<sqrt_f32.obj>(.text)
-l rts2800_fpu32_fast_supplement.lib<div_f32.obj>(.text)
}
以上修改中,将三角函数,开方,除法等函数所在文件对应生成的obj文件,链接到了ram里面。将编译生成的obj文件用连接符l使得它们被分配到FLASH加载RAM运行区域,使得对于时间要求较高的程序真正运行在RAM当中,这样整个程序就和ram里面跑基本效率差不多。
总结下来,做法是针对需要移到ram运行的程序A,B,C,D,将这部分测序对应生成的obj文件A.obj,B.obj,C.obj,D.obj链接过去。
ramfuncs : LOAD = FLASHD,
RUN = RAML0,
LOAD_START(_RamfuncsLoadStart),
LOAD_END(_RamfuncsLoadEnd),
RUN_START(_RamfuncsRunStart),
LOAD_SIZE(_RamfuncsLoadSize),
PAGE = 0
{
-l rts2800_fpu32.lib<boot.obj>(.text) /**/
-l A.obj(.text)
-l B.obj(.text)
-l C.obj(.text)
-l D.obj(.text)
}
有的教程中,提到通过修改cmd文件让所有函数都直接在ram运行,这样我觉得是不好的。因为有时候我们用的芯片要烧入flash可能就是因为ram空间不够了,这时候把所有程序都搬运区ram运行,那么就和直接ram运行没区别了。像28335的ram比较大,影响不大,但是对28035这样ram比较小的dsp,ram空间会不足。
有部分对时间要求不强的程序,在ram运行,属于浪费了ram。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。