举例说明 嵌入式c 语言的volatile

volatile的作用是什么?

举例说明:

1、写个没用的循环。

常见于单片机流水灯、蜂鸣器等对时间要求不高的地方。

这个代码的现象,应该是先输出 1,等一会,再输出 2。

编译运行,现象跟我们预期的一样。

然后再编译一次,这一次把编译器的优化选项打开,而且直接开到最高等级。

为什么要打开优化选项,很多时候还是为了提高程序的效率。

比如会去除没用的代码、优化循环结构、把常用的变量存放在寄存器中等等。

这段循环的代码,除了浪费时间,没有什么实际的意义,所以编译器会把它优化掉。

如何解决这个问题,在循环变量的前面加上 volatile,防止编译的时候被优化。

编译运行,同样打开优化,延时还是起了作用。

2、多线程

一个全局变量 flag,初始值是 1。

主函数中创建线程,然后进入 while 循环,如果 flag 一直是 1,程序会一直停在这;如果 flag 变成 0,程序会打印 end。

线程函数睡眠 1 秒,然后把 flag 修改成 0。

所以现象应该是,1 秒后答应 end。

运行程序,现象跟我们设想的一样。

再次编译,同样开启优化,这一次,直接变成了死循环,程序不会结束。

为什么线程里面把变量修改了,主线程还察觉不到。

因为优化后,程序为了提高运行效率,可能从缓存或者寄存器中读取数据,读到的还是没有修改的数据。

使用 volatile 同样可以解决问题。

再次编译,同样开启优化。运行程序,1 秒后打印 end,跟我们假设的一样。

有了 volatile,就会从内存中直接读取,一旦数据被其他线程修改,就能立马察觉。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值