将一组函数或变量放在特定部分中
本技术说明介绍了在指定节中放置多个函数或变量的两种方法,而无需使用多个#pragma
位置指令。
讨论
可以使用#pragma
位置将一个函数(或变量)放置在命名节中,例如:
#pragma location="MY_FUNC"
void f(void);
但是,当要放置许多函数(或变量)时,使用#pragma
位置变得不切实际。
将介绍这些方法:
• 使用单个杂注指令放置多个函数/变量。
• 使用链接器放置指令放置对象文件中的多个函数。
使用单个编译指示放置多个函数/变量
有两个可用的编译指示,用于设置函数/变量的声明和定义的默认位置和属性:
•
•#pragma default_variable_attributes
#pragma default_function_attributes
这两个编译指示使得对多个声明和定义使用单个指令成为可能,而不是使用多个#pragma
位置指令。#pragma
如何使用这些杂注指令的示例
在源代码中,将一些函数放在 部分。MY_FUNC
pragma default_function_attributes = @ "MY_FUNC"
int fun1(int x)
{
return x + 1;
}
int fun2(int x)
{
return x - 1;
}
/* Stop placing functions in section MY_FUNC */
#pragma default_function_attributes =
int fun3(int x)
{
return x + x;
}
/* Place following data in section MY_DATA */
#pragma default_variable_attributes = @ "MY_DATA"
int data1;
int data2;
/* Stop placing data in section MY_DATA */
#pragma default_variable_attributes =
int data3;
int main()
{
data1 = fun1(5);
data2 = fun2(5);
data3 = fun3(5);
return data1 + data2 + data3;
}
将以下行添加到链接器配置文件 (.icf) 中,以将指定内存地址范围内的所有数据放在 以下部分中:MY_DATA
define region DATA_region = mem:[from 0x20000000 to 0x20001FFF ];
place in DATA_region { readwrite section MY_DATA };
将以下行添加到链接器配置文件中,以将所有代码放在 指定的内存地址范围的 节中:MY_FUNC
define region FUNC_region = mem:[ from 0x70000 to 0x70FFF ];
place in FUNC_region { readonly section MY_FUNC };
使用链接器放置指令放置对象文件中的多个函数
与使用多个#pragma位置相比,更方便的方法是将函数放在单独的源文件中,并让链接器使用指令中的位置从对象文件中选择所有函数。
请按照下列步骤操作:
- 收集一个(或多个)源文件中的函数。
- 删除之前使用的任何
#pragma
位置指令。 - 编辑文件,并在指令中添加一个包含关键字对象的位置,如下所示。
.icf
将以下行添加到链接器配置文件中,以将源文件中的所有代码放在指定的内存地址范围内:Utilities.c
define region UTILITIES_region = mem:[ from 0x71000 to 0x71FFF ];
place in UTILITIES_region { readonly object Utilities.o };
结论
不需要使用多个#pragma
位置指令将数据/代码放在指定的内存地址范围内。相反,您可以使用上述方法。
有关链接器放置指令的详细信息,请参阅 IAR C/C++开发指南中的标题节选择器。