3.4 常量与变量

在程序运行过程中,常量(Constants)的值保持不变,而变量(Variables)的值可以发生变化。常量和变量有多种形式和大小,也有多种不同的存储形式。立即数是一种特殊的常量,整形立即数可以用不同进制形式来表示,以不同的前缀加以区分。如数字12,在CVAVR编译器中,用十进制表示时不用前缀;用二进制表示时要以0b或0B开头,如0b1100;用十六进制表示时要以0x或0X开头,如0x0C;还有不常用的以0开头的八进制,如014。

常量定义有两个关键字:constflash,区别在于存放的空间位置不同。const默认常量在内存中,而flash强制常量存储在程序存储器Flash中。如要定义一个比较大的固定数组或表,由于内存空间有限,通常要用到flash关键字。常量表达式在编译时自动求解,其语法与举例如下:

    const <type definition> <identifier>= constant expression;
    例如:const  int    b = 4 231+5;
          const  float  pi = 3.1415;
          const  char  c = 'd';                          // 字符
          const  char  str [] = "This is a string constant";   //字符数组/字符串
    flash<type definition><identifier>=constant expression;  //强制常量存在Flash中
    例如:flash  int  integer_array0[]={0,1,2,3};

变量定义的语法如下:

    <type definition>  <identifier>  [= constant  expression];
    例如:char  i;
          int    j;
          long  a=123111;
          int  multidim_array[2][3]={ {1,2,3},{4,5,6} };

变量常常有如下的不同用途和类型:

全局变量:程序中所有函数都可以使用的变量,在main()函数之前定义;

局部变量:在某函数内定义,只能在函数内使用的变量,出函数后变量所占内存释放;

静态变量:用static定义的局部变量,出函数时变量内存保留,再入函数时,变量值不变;

外部变量:用extern关键字声明,表示在函数外部已定义过的变量;

寄存器变量:用register关键字定义,强制变量在AVR单片机的32个工作寄存器中;

        register  char  x;         // 字符型变量x分配在某一个寄存器中
        register  int  y @10;      // 整型变量y强制分配在工作寄存器R10, R11中

寄存器变量是AVR单片机特有的,变量存储在寄存器中要比在内存中处理速度更快,但工作寄存器数量很少,所以寄存器变量还是要尽量节省使用。另外,由于汇编语言可以直接操作寄存器,所以,也可以用寄存器变量在汇编语言和C语言程序间传递数据。

非寄存器变量:用volatile关键字定义,强制变量不存储在32个工作寄存器中;

EEPROM变量:用eeprom关键字定义,强制变量存储在EEPROM中。

位变量:用bit声明,只占一个二进制位,存储在R2~R14寄存器中的特殊全局变量。

    bit  <identifier>;
    bit  alfa=1;            // 存储在R2中bit0
    bit  beta;              // 存储在R2中bit1

编译器在编译过程中会产生全局变量存储器分配映像文件,其中包含了程序中详细的SRAM地址分配、工作寄存器分配、EEPROM分配和函数地址等信息。文件使用“.map”后缀,这个文件在用AVR Studio Debugger进行程序调试时非常有用。