天天看点

DSP28335/28035程序烧入flash经验

  在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。