1. 利用关键字__ramfunc
IAR中提供了关键字来声明将某个函数放在RAM中运行。该函数用关键字
__ramfunc
声明后,编译器将这段程序和其他的需要初始化的变量一起放在一个具有读/写属性的区域(SECTION),系统启动时自动和其他的需要初始化的变量一起被从ROM拷贝到RAM。使用__ramfunc关键字的缺点就是,不能指定具体的RAM位置。
在定义为__ramfunc的函数中调用非__ramfunc函数,会出现下面的警告:“Warning[Ta022]: Possible rom access (array) fromwithin a __ramfunc function ”而且在ramfunc的函数中调用不是ramfunc的函数会降低执行速度。
2.使用链接文件定义段
先在.icf文件中创建一个新段
place in m_func_write_region { section FuncWriteTable };
然后给这段指定地址是在RAM区中
define region m_func_write_region = mem:[from m_data_start to m_data_end];
最后指定需要初始化做复制这到这段
initialize
by copy
在程序启动时自动执行初始化。
initialize by copy { readwrite, section FuncWriteTable };
将程序中的函数放在指定的RAM区中
#pragma location = "FuncWriteTable"//指定接下来的一个变量或者函数在指定的段中
void fun()
{
……
}
下方的可以指定多个函数到指定段
#pragma default_function_attributes = @"FuncWriteTable"//把之后的代码放在指定的段中
void fun1()
{
……
}
void fun2()
{
……
}
#pragma default_function_attributes =//指定的这个段到此结束,用这两句限定指定区域
至此就可以完成指定Flash中的程序到RAM中运行
接下来是对于项目中遇到的片外Flash程序的复制到RAM中的特殊情况
之前的步骤一致,只是要多一个操作
3.指定整个.c文件到RAM
先指定该.c文件编译的得到的.o文件到RAM所在区域内的.text
然后指定在初始化的时候做拷贝
在程序中调用数据区的初始化
__iar_data_init3();
在片外的程度段中需要执行一次这个初始化函数,保证片外Flash也做一次初始化,主要是复制指定的Flash到RAM中,去过缺少则无法完成片外Flash到RAM,这个其实等同于片内Flash的操作,只是片内的初始化已经自动执行额,片外的则需要我们自己操作执行。