C变量中的常用关键字
C中变量定义的三个修饰符
变量定义有三个修饰符值得注意,虽然它们与标准C是相同的,但是在嵌入式C语言中又有不同的含义。
1) static
在子函数中用static声明的静态变量依然是局部变量,但是退出这个子函数后其值不消失。换一种理解是,只在第一次调用Function1函数的时候,才执行静态变量初始化操作"x = 0;",在第二次,第三次...调用到Function1的时候,就不再对静态变量x进行初始化操作了。下面的两个函数调用Function1和Function2很好的说明了static关键字的作用。另外两个函数中的局部变量名都定义成了x,但是它们并不会相互影响,因为局部变量的作用范围仅限于定义它的函数内。
#include "msp430g2553.h" /* 定义一个全局变量y,用于接收函数的返回值 */ unsigned char y; unsigned char Function1(void) { /* 用 static声明的局部变量 */ static unsigned char x = 0; x = x + 1; return x; } unsigned char Function2(void) { /* 普通的局部变量 */ unsigned char x = 0; x = x + 1; return x; } void main(void) { /* 调用Function1------- */ y = Function1(); /* y=1 */ y = Function1(); /* y=2 */ y = Function1(); /* y=3 */ /* 调用Function2------- */ y = Function2(); /* y=1 */ y = Function2(); /* y=1 */ y = Function2(); /* y=1 */ }
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中

浙公网安备 33010602011771号