社区
单片机/工控
帖子详情
volatile在程序中的作用!!
赵何祺
2013-03-30 06:13:35
求教volatile在程序中的作用!!
...全文
515
4
打赏
收藏
volatile在程序中的作用!!
求教volatile在程序中的作用!!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
4 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
jdygrdzh
2013-04-01
打赏
举报
回复
不过还是可能访问了cache,如果被访问的区域没有被禁止cache的话。这个不是volatile和编译器能决定的
lbing7
2013-04-01
打赏
举报
回复
简单的说:这个关键字就是告诉编译器,这个变量不能优化。必须每次访问都真实去访问该变量的物理空间。
schlafenhamster
2013-04-01
打赏
举报
回复
单片机有cache的问题,请参考:
http://wenku.baidu.com/view/20f5e079168884868762d6e8.html
schlafenhamster
2013-03-30
打赏
举报
回复
volatile 实例讲解 volatile的本意是一般有两种说法--1.“暂态的”;2.“易变的”。 这两种说法都有可行。但是究竟volatile是什么意思,现举例说明(以Keil-c与a51为例 例子来自Keil FQA),看完例子后你应该明白volatile的意思了,如果还不明白,那只好 再看一遍了。 例1. void main (void) { volatile int i; int j; i = 1; //1 不被优化 i=1 i = 2; //2 不被优化 i=1 i = 3; //3 不被优化 i=1 j = 1; //4 被优化 j = 2; //5 被优化 j = 3; //6 j = 3 } --------------------------------------------------------------------- 例2. 函数: void func (void) { unsigned char xdata xdata_junk; unsigned char xdata *p = &xdata_junk; unsigned char t1, t2; t1 = *p; t2 = *p; } 编译的汇编为: 0000 7E00 R MOV R6,#HIGH xdata_junk 0002 7F00 R MOV R7,#LOW xdata_junk ;---- Variable 'p' assigned to Register 'R6/R7' ---- 0004 8F82 MOV DPL,R7 0006 8E83 MOV DPH,R6 ;!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 注意 0008 E0 MOVX A,@DPTR 0009 F500 R MOV t1,A 000B F500 R MOV t2,A ;!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 000D 22 RET 将函数变为: void func (void) { volatile unsigned char xdata xdata_junk; volatile unsigned char xdata *p = &xdata_junk; unsigned char t1, t2; t1 = *p; t2 = *p; } 编译的汇编为: 0000 7E00 R MOV R6,#HIGH xdata_junk 0002 7F00 R MOV R7,#LOW xdata_junk ;---- Variable 'p' assigned to Register 'R6/R7' ---- 0004 8F82 MOV DPL,R7 0006 8E83 MOV DPH,R6 ;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 0008 E0 MOVX A,@DPTR 0009 F500 R MOV t1,A ;a处 000B E0 MOVX A,@DPTR 000C F500 R MOV t2,A ;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 000E 22 RET 比较结果可以看出来,未用volatile关键字时,只从*p所指的地址读一次 如在a处*p的内容有变化,则t2得到的则不是真正*p的内容。 --------------------------------------------------------------------- 例3 volatile unsigned char bdata var; // use volatile keyword here sbit var_0 = var^0; sbit var_1 = var^1; unsigned char xdata values[10]; void main (void) { unsigned char i; for (i = 0; i < sizeof (values); i++) { var = values[i]; if (var_0) { var_1 = 1; //a处 values[i] = var; // without the volatile keyword, the compiler // assumes that 'var' is unmodified and does not // reload the variable content. } } } 在此例中,如在a处到下一句运行前,var如有变化则不会,如var=0xff; 则在 values[i] = var;得到的还是values[i] = 1; --------------------------------------------------------------------- 应用举例: 例1. #define DBYTE ((unsigned char volatile data *) 0) 说明:此处不用volatile关键字,可能得不到真正的内容。 --------------------------------------------------------------------- 例2. #define TEST_VOLATILE_C //*************************************************************** // verwendete Include Dateien //*************************************************************** #if __C51__ < 600 #error: !! Keil 版本不正确 #endif //*************************************************************** // 函数 void v_IntOccured(void) //*************************************************************** extern void v_IntOccured(void); //*************************************************************** // 变量定义 //*************************************************************** char xdata cValue1; //全局xdata char volatile xdata cValue2; //全局xdata //*************************************************************** // 函数: v_ExtInt0() // 版本: // 参数: // 用途:cValue1++,cValue2++ //*************************************************************** void v_ExtInt0(void) interrupt 0 { cValue1++; cValue2++; } //*************************************************************** // 函数: main() // 版本: // 参数: // 用途:测试volatile //*************************************************************** void main() { char cErg; //1. 使cErg=cValue1; cErg = cValue1; //2. 在此处仿真时手动产生中断INT0,使cValue1++; cValue2++ if (cValue1 != cErg) v_IntOccured(); //3. 使cErg=cValue2; cErg = cValue2; //4. 在此处仿真时手动产生中断INT0,使cValue1++; cValue2++ if (cValue2 != cErg) v_IntOccured(); //5. 完成 while (1); } //*************************************************************** // 函数: v_IntOccured() // 版本: // 参数: // 用途: 死循环 //*************************************************************** void v_IntOccured() { while(1); } 仿真可以看出,在没有用volatile时,即2处,程序不能进入v_IntOccured(); 但在4处可以进入v_IntOccured();
Java多线程
中
【
volatile
】关键字的
作用
!
Java多线程
中
【
volatile
】关键字的
作用
!
C语言
中
volatile
关键字的
作用
!!!
一.前言 1.编译器优化介绍: 由于内存访问速度远不及CPU处理速度,为提高机器整体性能,在硬件上引入硬件高速缓存Cache,加速对内存的访问。另外在现代CPU
中
指令的执行并不一定严格按照顺序执行,没有相关性的指令可以乱序执行,以充分利用CPU的指令流水线,提高执行速度。以上是硬件级别的优化。再看软件一级的优化:一种是在编写代码时由
程序
员优化,另一种是由编译器进行优化。编译器优化常用的
C++
中
volatile
的
作用
代码编译环境:Windows7 32bits+VS2012。
volatile
是“易变的”、“不稳定”的意思。
volatile
是C的一个较为少用的关键字,它用来解决变量在“共享”环境下容易出现读取错误的问题。 1.
volatile
的
作用
定义为
volatile
的变量是说这变量可能会被意想不到地改变,即在你
程序
运行过程
中
一直会变,你希望这个值被正确的处理,每次从内存
中
去读这个值,而不是因编译器...
c语言
volatile
关键字在单片机
中
的
作用
c语言
volatile
关键字在单片机
中
的
作用
volatile
的意思是“易失的,易改变的”。这个限定词的含义是向编译器指明变量的内容可能会由于其他
程序
的修改而变化。通常在
程序
中
申明了一个变量时,编译器会尽量把它存放在通用寄存器
中
,例如ebx。当CPU把其值放到ebx
中
后就不会再关心对应内存
中
的值。若此时其他
程序
(例如内核
程序
或一个
中
断)修改了内存
中
它的值,ebx
中
的值并不会随之更新。为了...
C语言
中
volatile
关键字的
作用
volatile
的
作用
是作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值。 如上代码,如果选择编译器优化,可能会被编译成如下代码(当然不是在C语言层面上优化,而是在汇编过程优化,只是使用C
程序
举例): 因为在仅仅从main主函数来看,a == b是必然的,那么在什么情况,a 和 b不是必然相等呢?
volatile
常见的几个面试题:1、一个参数既可以是const还可以是
volatile
吗?可以,例如只读的状态寄存器。它是
volatile
因为它可能被意想不到地改变。它是 con
单片机/工控
27,375
社区成员
28,770
社区内容
发帖
与我相关
我的任务
单片机/工控
硬件/嵌入开发 单片机/工控
复制链接
扫一扫
分享
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章