C语言基础:volatile关键字的作用


前言

我本人之前一直是写Windows程序的,最近由于公司项目的原因开始接触嵌入式程序。我发现在嵌入式程序中,volatile关键字用的很多,在写Windows程序时,我几乎没用过该关键字,只知道它是防止代码优化的。这篇文章就简要说下该关键字的作用。


一、volatile关键字怎么用

volatile关键字只能修改变量,不能修饰函数。如下

volatile int flag=0;
int volatile flag=0;

二、volatile使用场景

1.中断

在嵌入式编程中,经常有以下的场景。在中断函数中设置全局变量的值,在周期调用函数中,根据该全局变量执行不同的操作。也就是说通过该全局变量传递,中断到达的事件。
代码如下(示例):

bool isrFlag = false;

void task()
{
	while(!isrFlag)
	{
		//do something
	}

	//do other thing
}

interrupt void io_isr
{
	isrFlag=true;
}

上面的代码,在没有做代码优化的情况下,会运行的非常好。
但是加了代码优化,就会出现task一直在while循环里执行,不会跳到//do other thing的部分。
出现以上情况的原因是,编译器判断while循环是个死循环,因为!isrFlag条件一直成立。
编译器就将其优化成不判断条件,一直循环执行//do something.
这个时候就需要volatile关键字,修饰isrFlag。告诉编译器关于isrFlag变量的代码,不要做优化,老老实实的每次去读变量的值,进行条件判断。

2.多线程

多线程跟以上中断的情况类似,当使用全局变量作为多线程同步的手段时,再有代码优化的存在,就会出现中断中一样的情况。再次不做赘述。


总结

根据上面的描述可以看出,volatile关键字是跟代码优化息息相关的。如果没有编译器代码优化,就没有volatile关键字。但是也不要因噎废食,就不要代码优化了。代码优化的存在,可以提升代码效率,提高内存使用率等好处。做好volatile及代码优化的平衡即可。

  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值