DSP开发中memcpy()函数报错:identifier “XXX“ is undefined
在DSP开发中,经常使用memcpy()函数将代码从FLASH存储区间搬移到RAM存储区间,这样做的目的是为了加速DSP程序的运行(存储在RAM的程序运行比在FLASH的程序运行快),往往需要搬运的程序是对时间敏感或者计算量较大的程序。
在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;
编译成功。
更多推荐
所有评论(0)