您的位置:控制工程论坛网论坛 » 嵌入式系统 » 变量定义修饰符

mcumao

mcumao   |   当前状态:离线

总积分:1503  2025年可用积分:0

注册时间: 2006-01-20

最后登录时间: 2007-06-11

空间 发短消息加为好友

变量定义修饰符

mcumao  发表于 2006/3/30 18:17:42      974 查看 0 回复  [上一主题]  [下一主题]

手机阅读

变量定义有三个修饰符值得注意虽然它们与标准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必需是关闭的,则变量ac0都定位在DEFAULT_RAM中。

例如

#pragma DATA_SEG MyVarSeg

#pragma CONST_SEG MyConstSeg

static int a; //变量 a 存放在段MyVarSegMyVarSeg是段名

static const int c0 = 10; //变量 c0 存放在段 MyConstSeg MyConstSeg是段名

此时编译器选项-Cc必需是打开的。如果编译器选项-Cc必需是关闭的,则变量ac0都定位在MyVarSeg中。

1楼 0 0 回复