全部博文(92)
分类: 嵌入式
2010-06-07 17:38:03
const和const volatile关键字
const 关键字
关键字“const”,C语言中命名最差的关键字,并不表示恒量,而是代表“只读”。在
嵌入式系统中,有很大的不同,这一会应会明白。
Const声明可用于任何变量,它告诉编译器将其存贮在ROM代码。编译器保留了那个位置
程序存贮器地址。由于位于ROM中,其值不能改变。
由于它作为常量工作,必须赋一初值。如:const double PI = 3.14159265;
Const 变量与明显的常数相对,很多原文要求用const变量代替明显的常数。例如:
用const unsigned char channels = 8;代替#define CHANNELS 8 。
本方法的基本原理是在调试器内部,你能检查一个const变量,然而一个明显的常数不
可访问。不幸的是,在很多8位机上你将为这一好处付出极大的代价。这两个主要代价是:
• 一些编译器在RAM中创建一个真实的变量来支持cost变量,这是一个极大的惩罚。
• 一些编译器如CodeWarrior,知道变量为const,将把变量存贮在ROM中。无论怎样,
变量仍作为变量处理和访问,典型地用某些变址寻址(16位)的方式。与直接寻址(8位)方
式相比,这种方法通常很慢。
Const的用法:
const unsigned short a;
unsigned short const a;
const unsigned short *a;
unsigned short * const a;
const volatile 关键字
现在讨论一个深奥的问题,一个变量既能是常量,又能是可变量吗?如果是这样,这意
味什么,怎样使用?答案是“能”。
这个修饰符应该用于能出乎意料地改变的任何存贮器位置,因此需要volatile限定语,
由于const该变量是只读的。
最明显的例子是硬件状态寄存器,象SCI状态寄存器SCS1。这个寄存器包含信号状态标志,
如发送空、发送完成、接收满以及其它。这是一个可变寄存器由于这些标志的改变依赖于串行
通信的状态,这也是只读,由于标志不能被程序直接改写,它们只对模块的状态作出响应。
这个状态寄存器最佳声明方法是:
const volatile unsigned char SCS1 @0x0016