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中

posted @ 2013-03-14 09:42  此岸幸福  阅读(362)  评论(0)    收藏  举报