背景介绍
本文描述了如何在指定存储器地址存放变量、常量和函数两种方法。
Pragma预编译指令和操作数@
Pragma预编译指令用于控制编译过程,如存储器分配、是否允许使用扩展关键字、是否允许输出警告信息等。IAR C\C++编译器提供的预编译指令符合ISO/ANSI C标准,适当使用Pragma预编译指令可使源程序更为清晰,同时编译后生成的目标代码也更简洁。
下面我们介绍Pragma预编译指令中的一个:
#pragma Location={address|NAME}
该指令用于指定在指令后面声明的变量的绝对地址,可选参数address为绝对地址,NAME为用户定义的存储器段名。变量必须以关键字 __no_init 或const声明。
采用操作符@或预编译指令#pragma Location可以将全局和静态变量定位到一个绝对地址,或者将函数或变量定位到一个指定的存储器段中。绝对定位变量必须采用关键字 __no_init 或const进行声明,并且不能带有初始式:
例如:
__no_init int x @ 0x1000;
或者
#pragma Location =0x1004
__no_init const int beta;
指定存储器段可以是预定义的存储器段,也可以是用户自定义的存储器段。也可以是编译器选项__section
将变量或函数定位到一个指定存储器段。
例如:
__no_init int alpha@“NOINIT”; /* 在用户自定义存储器段中定位数据变量 */
或者
#pragma Location =“CONSTANTS”
const int beta;
void f(void)@“FUNCTIONS”; /* 在指定存储器段中定位函数 */
void g(void)@“FUNCTIONS”;
{
}
或者
#pragma Location =“CONSTANTS”
void h(void);