3.4 常量与变量
在程序运行过程中,常量(Constants)的值保持不变,而变量(Variables)的值可以发生变化。常量和变量有多种形式和大小,也有多种不同的存储形式。立即数是一种特殊的常量,整形立即数可以用不同进制形式来表示,以不同的前缀加以区分。如数字12,在CVAVR编译器中,用十进制表示时不用前缀;用二进制表示时要以0b或0B开头,如0b1100;用十六进制表示时要以0x或0X开头,如0x0C;还有不常用的以0开头的八进制,如014。
常量定义有两个关键字:const或flash,区别在于存放的空间位置不同。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进行程序调试时非常有用。