介绍
本技术说明描述了两种在不使用几个#pragma location指令的情况下将多个函数或变量放置在指定节中的方法。
讨论区
可以使用#pragma location将一个函数(或变量)放置在命名节中,例如:
#pragma location = “ MY_FUNC”
void f (void );
但是,当要放置许多函数(或变量)时,使用#pragma位置将变得不切实际。
将描述这些方法:
•使用单个pragma指令放置多个函数/变量。
•使用链接器放置指令从目标文件放置多个功能。
使用单个pragma指令放置多个函数/变量
有两个可用的pragma指令,用于设置默认位置,以及用于函数/变量的声明和定义的属性:
•#pragma default_variable_attributes
•#pragma default_function_attributes
通过这两个pragma指令,可以将单个#pragma指令用于多个声明和定义,而不是使用多个#pragma location指令。
有关如何使用这些pragma指令的示例
在您的源代码中,将一些函数放在MY_FUNC部分中。
#pragma default_function_attributes = @ “ MY_FUNC”
int fun1 (int x ){ return x + 1 ; }
int fun2 (int x ){ return x - 1 ; }
/ *停止在MY_FUNC节中放置函数* /
#pragma default_function_attributes =
int fun3 (int x ){ return x + x ; }
/ *将以下数据放在MY_DATA节中* /
#pragma default_variable_attributes = @ “ MY_DATA”
int data1 ; int data2 ;
/ *停止在MY_DATA节中放置数据* /
#pragma default_variable_attributes =
int data3 ;
int main (){
data1 = fun1 (5 );
data2 = fun2 (5 );
DATA3 = FUN3 (5 );
返回数据1 + data2 + data3 ;
}
将以下行添加到链接器配置文件(.icf)中,以将所有数据放入MY_DATA部分中指定的内存地址范围内:
定义区域DATA_region = mem :[从0x20000000到0x20001FFF ];
放置在DATA_region {读写部MY_DATA };
将以下行添加到链接器配置文件中,以将所有代码放在MY_FUNC节中指定的内存地址范围内:
定义区域FUNC_region = mem :[从0x70000到0x70FFF ];
地方在FUNC_region {只读部my_func,并将};
使用链接器放置指令从目标文件放置多个功能
与使用多个#pragma位置相比,更方便的方法是将函数放在单独的源文件中,并让链接程序使用place in指令从目标文件中选择所有函数。
按着这些次序:
1.将功能收集在一个(或多个)源文件中。
2.删除您先前使用的任何#pragma位置指令。
3.编辑.icf文件,并在指令中添加一个包含关键字对象的位置,如下所示。
将以下行添加到链接器配置文件中,以将源文件Utilities.c中的所有代码放在指定的内存地址范围内:
定义区域UTILITIES_region = mem :[从0x71000到0x71FFF ];
地方在UTILITIES_region {只读对象工具。ö };
结论
您无需使用多个#pragma location指令将数据/代码放置在指定的内存地址范围内。相反,您可以使用上述方法。
有关放在中的链接器放置指令的更多信息,请参阅IAR C / C ++开发指南中的标题“部分选择器”。