在DSP开发中,经常使用memcpy()函数将代码从FLASH存储区间搬移到RAM存储区间,这样做的目的是为了加速DSP程序的运行(存储在RAM的程序运行比在FLASH的程序运行快),往往需要搬运的程序是对时间敏感或者计算量较大的程序。要实现这样的功能,可以分为这几步:

Step1:在链接命令文件(.cmd)文件中定义该程序段的运行和载入地址

通俗来说,就是该段程序平常保存在FLASH的哪块区域,而在单片机上电运行的时候被搬移到RAM的哪块区域运行。以2812为例,InitFlash()函数是DSP281x_SysCtrl.c中的初始化程序。如果想要将它设置运行的时候在RAM中运行,那么在.cmd文件中可以如下配置:

SECTION{
  ...此处省略其他的部分

 ramfuncs          :   LOAD = FLASH_EF,  PAGE = 3             
                         RUN = L1SARAM,    PAGE = 1 
                         LOAD_START(_ramfuncs_loadstart),
                         LOAD_END(_ramfuncs_loadend),
                         RUN_START(_ramfuncs_runstart)
  ...此处省略其他的部分
}

这里定义了一个段ramfuncs,装载的位置是FLASH_EF,而在运行的时候会被放到L1SARAM,关于FLASH_EF、L1SARAM是在.cmd的MEMORY部分定义的,对应实际的存储空间。

Step2:程序中定义段

如何将程序InitFlash()和步骤1的段名ramfuncs对应起来呢,只需要一行代码:

#pragma CODE_SECTION(InitFlash, "ramfuncs");

void InitSysCtrl(void)
{
...此处省略函数具体内容
}

Step3:源文件中调用memcpy()函数

还需要再源文件中调用将代码从FLASH复制到RAM的函数memcpy()。调用这个函数需要rts2800_ml.lib的库,memcpy()大部分习惯放在main()中系统初始化函数之后,例如:

memcpy(	&ramfuncs_runstart,
			&ramfuncs_loadstart,
			&ramfuncs_loadend - &ramfuncs_loadstart);

但是这个时候编译的时候会报错:identifier "ramfuncs_runstart" is undefined。

需要额外在使用memcpy的源文件开头声明外部变量:

extern Uint16 ramfuncs_runstart;
extern Uint16 ramfuncs_loadstart;
extern Uint16 ramfuncs_loadend;

编译成功。

Logo

欢迎加入 MCP 技术社区!与志同道合者携手前行,一同解锁 MCP 技术的无限可能!

更多推荐