嵌入式系统中volatile 的使用的意义
2011-08-30 11:25
411 查看
如果一个变量的值可能会被程序操作之外的其它操作所改变,那么你必需用volatile 声明。在嵌入式系统中其它操作是:中断服务程序的操作、硬件动作的操作。用volatile声明的变量是不会被编译器优化掉的
例如:
#define PortA ( * ( volatile unsigned int * ) 0x0000 )
这样 PortA 成为一个地址在0x0000的unsigned char类型变量。这个定义看起来很复杂,其实它也可以分解成几个很简单的部分来看。 ( volatile unsigned int * )是C语言中的强制类型转换,它的作用是把0x0000这个纯粹的十六进制数转换成为一个(地址)指针,其中volatile并不是必要的,它只是告诉编译器,这个值与外界环境有关,不要对它优化。接下来在外面又加了一个*号,就表示0x0000内存单元中的内容了。经过这个宏定义之后,PortA就被可以做为一个普通的变量来操作,所有出现PortA的地方编译的时候都被替换成(
* ( volatile unsigned int * ) 0x0000 ),外面一层括号是为了保证里面的操作不会因为运算符优先级或者其它不可预测的原因被改变而无法得到预期的结果。
PORTA做为一个输入端口,其值是由外部设备决定的,由于外部设备的变化是随机的,因此第一次读取的值和第二次读取的值很可能不同,所以我们把它声明为volatile变量。
a = PORTA;
a = PORTA;
由于PORTA是用volatile声明的变量,编译器不会把它优化成一句,而如果不是volatile声明的编译器就会将第二句优化掉,从而程序将会忽略输入端口的变化。
通常把嵌入式设备的所有外围器件寄存器都声明为volatile 的。
这种定义方法适合所有的C编译器,可移植性好,但PortA并不是一个真正的变量,只是一个宏名,当你调试一个程序的时候,无法在调试窗口观察它的值。另外连接器也失去了灵活性,它得防止其它变量跟此变量冲突。
例如:
#define PortA ( * ( volatile unsigned int * ) 0x0000 )
这样 PortA 成为一个地址在0x0000的unsigned char类型变量。这个定义看起来很复杂,其实它也可以分解成几个很简单的部分来看。 ( volatile unsigned int * )是C语言中的强制类型转换,它的作用是把0x0000这个纯粹的十六进制数转换成为一个(地址)指针,其中volatile并不是必要的,它只是告诉编译器,这个值与外界环境有关,不要对它优化。接下来在外面又加了一个*号,就表示0x0000内存单元中的内容了。经过这个宏定义之后,PortA就被可以做为一个普通的变量来操作,所有出现PortA的地方编译的时候都被替换成(
* ( volatile unsigned int * ) 0x0000 ),外面一层括号是为了保证里面的操作不会因为运算符优先级或者其它不可预测的原因被改变而无法得到预期的结果。
PORTA做为一个输入端口,其值是由外部设备决定的,由于外部设备的变化是随机的,因此第一次读取的值和第二次读取的值很可能不同,所以我们把它声明为volatile变量。
a = PORTA;
a = PORTA;
由于PORTA是用volatile声明的变量,编译器不会把它优化成一句,而如果不是volatile声明的编译器就会将第二句优化掉,从而程序将会忽略输入端口的变化。
通常把嵌入式设备的所有外围器件寄存器都声明为volatile 的。
这种定义方法适合所有的C编译器,可移植性好,但PortA并不是一个真正的变量,只是一个宏名,当你调试一个程序的时候,无法在调试窗口观察它的值。另外连接器也失去了灵活性,它得防止其它变量跟此变量冲突。
相关文章推荐
- 嵌入式系统中volatile 的使用的意义
- 嵌入式Linux系统下使用DHCP,为开发板自动分配IP地址
- 转:嵌入式编程(以STM32为例)中的volatile,const意义及应用场景
- 在嵌入式Linux系统中使用摄像头
- 使用 QEMU 进行嵌入式系统开发
- 嵌入式系统内存使用情况评估方法探究
- 使用NFS文件系统与嵌入式设备传输文件
- 使用嵌入式 Linux 进行实时系统开发
- 《Linux内核分析》 week4作业-使用嵌入式汇编调用一个系统调用
- 2017070506嵌入式开发系统概述和开发工具的使用
- 嵌入式编程(以STM32为例)中的volatile,const意义及应用场景
- 嵌入式系统数据库选型以及sqlite数据库使用
- QWebView使用嵌入式系统崩溃
- 基于 Linux 和 MiniGUI 的嵌入式系统软件开发指南(四) 使用 GDI 函数
- 嵌入式Linux系统移植-使用crosstool创建自己的交叉编译器
- 使用busybox制作最基本的嵌入式(yaffs)文件系统
- 龙尚3G、4G模块嵌入式Linux系统使用说明【转】
- (单片机原理与应用)proteus(嵌入式系统设计仿真与开发平台)的使用和编译环境(汇编版)
- 嵌入式系统中看门狗的使用总结
- openssl for uclinux(嵌入式系统中使用openssl)