C语言中Volatile关键字用法及作用

一、volatile关键字原理

提醒编译器,该关键字后面的变量随时会发生改变,在编译后的程序中,存储或读取该变量时,编译器不会对它进行优化处理,会直接从变量内存地址中直接处理数据。从而可以对特殊地址的稳定访问。

二、volatile用法

简单地说就是防止编译器对代码进行优化。比如如下程序:

Dat[2]=0x55;

Dat[2]=0x56;

对外部硬件而言,上述2条语句分别表示不同的操作,会产生2种不同的动作,但是编译器却会对上述2条语句进行优化,认为只有Dat[2]=0x56(即忽略前1条语句,只产生1条机器代码)。如果键入volatile,则编译器会逐一地进行编译并产生相应的机器代码(产生2条代码)。 

再举一个例子:

int a = 10;

int b = a;

int c = a;

编译器在执行这段代码时会发现a变量未做相关操作,它会自动把上次读取a的值直接赋值给c,这时如果a是寄存器变量或者端口数据时,就会容易出问题,这时需要添加volatile变量如下:

volatile int a = 10;

int b = a;

int c = a;

这时,每次读取a变量的值都是直接从内存地址中获取。

 

一般在什么情况出现:

1)并行设备的硬件寄存器

2)一个中断服务子程序中会访问到的非自动变量(Non-automatic variables)

3)多线程应用中被几个任务共享的变量

一般说来,volatile用在如下的几个地方:
  1) 中断服务程序中修改的供其它程序检测的变量,需要加volatile;

当变量在触发某中断程序中修改,而编译器判断主函数里面没有修改该变量,因此可能只执行一次从内存到某寄存器的读操作,而后每次只会从该寄存器中读取变量副本,使得中断程序的操作被短路。
  2) 多任务环境下各任务间共享的标志,应该加volatile;

在本次线程内, 当读取一个变量时,编译器优化时有时会先把变量读取到一个寄存器中;以后,再取变量值时,就直接从寄存器中取值;当内存变量或寄存器变量在因别的线程等而改变了值,该寄存器的值不会相应改变,从而造成应用程序读取的值和实际的变量值不一致 。
  3) 存储器映射的硬件寄存器通常也要加volatile说明,因为每次对它的读写都可能由不同意义;

假设要对一个设备进行初始化,此设备的某一个寄存器为0xff800000。for(i=0;i< 10;i++) *output = i;前面循环半天都是废话,对最后的结果毫无影响,因为最终只是将output这个指针赋值为9,省略了对该硬件IO端口反复读的操作。

 

注意:频繁地使用volatile很可能会增加代码尺寸和降低性能,因此要合理的使用volatile。

 

内容部分摘自网络

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
C语言是一种广泛应用于系统软件和应用程序开发的编程语言。它有包括32个关键字在内的一些固定的标识符,这些关键字在编程有着特殊的含义和用法。 下面是这些关键字的含义及用法的简要介绍: 1. auto:该关键字用于定义自动变量,它在函数内部声明的变量默认为自动变量。 2. break:用于断循环或开关语句的执行。 3. case:用于定义开关语句的某个具体情况。 4. char:用于声明字符变量。 5. const:用于定义常量,其值不能被修改。 6. continue:用于跳过循环剩余的语句,继续执行下一次迭代。 7. default:定义开关语句的默认情况。 8. do:开始一个do-while循环。 9. double:声明双精度浮点数变量。 10. else:用于在条件不满足时执行的分支。 11. enum:用于定义一个枚举类型。 12. extern:用于声明外部变量或函数。 13. float:声明浮点数变量。 14. for:开始一个for循环。 15. goto:用于无条件跳转到代码的标记处。 16. if:用于条件判断,执行分支。 17. int:声明整数变量。 18. long:声明长整数变量。 19. register:用于声明寄存器变量。 20. return:用于从函数返回一个值。 21. short:声明短整数变量。 22. signed:声明有符号整数类型。 23. sizeof:返回变量或数据类型的大小。 24. static:用于定义静态变量或函数。 25. struct:用于定义结构体类型。 26. switch:开始一个开关语句。 27. typedef:用于定义新的数据类型。 28. union:用于定义联合类型。 29. unsigned:声明无符号整数类型。 30. void:用于声明无返回值的函数或空指针。 31. volatile:用于声明易变的变量。 32. while:开始一个while循环。 这些关键字的理解和正确使用对于编写高效、可读性强的C语言代码至关重要。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值