变量定义有三个修饰符值得注意,虽然它们与标准C是相同的,但是在嵌入式C语言中又有不同的含义。
1) static
在子函数中static用声明的变量是局部变量,但是退出这个子函数后其值不消失。下一次调用这个函数时仍可以访问到原来的值。注意,在子函数中声明的static变量只对声明他的函数可见,别的函数是不可以使用的。如果static变量是在模块中声明的,那么只有本模块的函数可以使用它,别的模块中的函数是不能访问的。
void MyFunction (void)
{
static char myVar = 0; //用 static声明的局部变量
myVar = myVar + 1;
}
void main (void)
{
MyFunction(); //调用之前myVar = 0,调用之后myVar = 1
MyFunction(); //调用之前myVar = 1,调用之后myVar = 2
}
2) volatile
如果一个变量的值可能会被程序操作之外的其它操作所改变,那么你必需用volatile 声明。在嵌入式系统中其它操作是:中断服务程序的操作、硬件动作的操作。
用volatile声明的变量是不会被编译器优化掉的,如:
volatile unsigned char PortA @0x0000;
PORTA做为一个输入端口,其值是由外部设备决定的,由于外部设备的变化是随机的,因此第一次读取的值和第二次读取的值很可能不同,所以我们把它声明为volatile变量。
a = PORTA;
a = PORTA;
由于PORTA是用volatile声明的变量,编译器不会把它优化成一句,而如果不是volatile声明的编译器就会将第二句优化掉,从而程序将会忽略输入端口的变化。
通常把嵌入式设备的所有外围器件寄存器都声明为volatile 的。
3) const
修饰符 const 可以用在任何变量之前, 告诉编译器把此变量存储在ROM中。ROM_VAR段是定位 const 变量的默认段
语法格式:#pragma CONST_SEG <段名>
例如:
#pragma DATA_SEG DEFAULT
#pragma CONST_SEG DEFAULT
static int a;//变量 a 存放在默认的 RAM 段 DEFAULT_RAM 中,DEFAULT_RAM是段名
static const int c0 = 10;//变量 c0 存放在默认的 ROM 段 ROM_VAR 中,ROM_VAR是段名
此时编译器选项-Cc必需是打开的。如果编译器选项-Cc必需是关闭的,则变量a和c0都定位在DEFAULT_RAM中。
例如:
#pragma DATA_SEG MyVarSeg
#pragma CONST_SEG MyConstSeg
static int a; //变量 a 存放在段MyVarSeg中,MyVarSeg是段名
static const int c0 = 10; //变量 c0 存放在段 MyConstSeg 中,MyConstSeg是段名
此时编译器选项-Cc必需是打开的。如果编译器选项-Cc必需是关闭的,则变量a和c0都定位在MyVarSeg中。