IAR 下将函数指定到RAM中

  • Post author:
  • Post category:其他




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的操作,只是片内的初始化已经自动执行额,片外的则需要我们自己操作执行。



版权声明:本文为leumber原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。