重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
这期内容当中小编将会给大家带来有关C语言中volatile 关键字有什么用,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。
创新互联公司专注为客户提供全方位的互联网综合服务,包含不限于网站制作、成都做网站、洪山网络推广、小程序定制开发、洪山网络营销、洪山企业策划、洪山品牌公关、搜索引擎seo、人物专访、企业宣传片、企业代运营等,从售前售中售后,我们都将竭诚为您服务,您的肯定,是我们最大的嘉奖;创新互联公司为所有大学生创业者提供洪山建站搭建服务,24小时服务热线:13518219792,官方网址:www.cdcxhl.com
一、关键字 volatile 是什么?
volatile是一个类型修饰符(type specifier)。
volatile的作用是作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值。
volatile变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。
---来自百度百科
volatile的定义,应该在(读书)学习时都看过无数遍,但我相信绝大部分人都没有深刻理解其中含义。
当你真正编程、开发项目之后,你就会进一步理解其中含义。
二、volatile关键字对编译器优化的影响
我们都知道编译器有优化代码的功能,我们常用的集成开发环境(Keil、 IAR等)都有优化选项。
如果不使用关键字 volatile 申明变量,则编译器可能会对变量的访问并生成非预期的代码或删除预期的功能。
1.何时使用volatile?
常见使用volatile声明的情况:
访问内存映射外设。
在多个线程之间共享全局变量。
在中断例程或信号处理程序中访问全局变量。
比如,在STM32代码中:
#define __O volatile /*!< Defines 'write only' permissions */ #define __IO volatile /*!< Defines 'read / write' permissions */
浏览代码,你会发现,很多地方都使用了“__IO”,也就是volatile.
在跑系统的项目中,线程间共享的全局变量,建议都加上volatile关键字,这一点,很多人没有在意。
2.不使用volatile时可能出现的问题
如果未将变量用volatile声明,则编译器会假定其值不能在其定义的范围之外进行修改。
因此,编译器可能会执行不需要的优化。这可以通过多种方式表现出来:
在轮询硬件时,代码可能会陷入循环。
多线程代码可能会表现出奇怪的行为。
优化可能会导致删除实现故意时序延迟的代码。
举例:
自己写一个延时函数:
void Delay(int Cnt) { int i; while(Cnt--) { i++; for(i=0; i<10; i++); } }
你在不同优化等级情况下,延时时间可能会不一样;
同样的代码,你在Keil 和 IAR环境下编译出来的延时时间也可能不一样。
上述就是小编为大家分享的C语言中volatile 关键字有什么用了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注创新互联行业资讯频道。