Volatile限制符在嵌入式C程序设计的运用

本文深入探讨了volatile关键字的含义、作用原理及常见应用场景。解释了它如何阻止编译器优化,确保程序中特定变量的值始终从实际内存读取,而非依赖于可能过期的缓存值。此外,文章还提供了实例代码演示volatile关键字的正确使用方法,旨在帮助开发者避免潜在的程序错误。

volatile的本意为“暂态的”、“易变的”,该说明符祈祷一直编译器优化的作用。

说明:访问内部高速缓存CACHE 比 访问外部RAM 快很多,编译器优化会尽量减少存取访问外部RAM(是否可以理解为变量一般都存放在外部RAM中的?)。

1.若没有加上volatile限制符的变量,程序运行会自动从原先已经存在内部高速缓存CACHE,而不是外部RAM->变量存放的地方提取该变量的值。若在此期间,该变量的值发生变化,则程序得到的值可能是原先改变前的值,即原先是x=0,中途变为了x=1,有可能程序在后面再次用到该值的时候会误认为是x=0。

--------------->编译器将一些认为不会再变化的变量 事先放在在 内部高速缓存CACHE 中,而这些变量若再发生变化,只会改变存放在RAM变量的值,而不会去改变其在 内部高速缓存CACHE 的值。

2.若加上volatile限制符的变量,程序就会老老实实去访问 存储在外部RAM 的变量的值,不再取巧。

总而言之:被volatile声明的变量在程序运行时,每次都会从实际内存中读取最新的数据,而不是使用的内部高速缓存CACHE的暂存的数据。


volatile常使用在:

A:存储器映射的硬件寄存器中。

B:中断服务程序中修改的供其他程序检测的变量中。

C:多任务环境下各任务间共享的标志中。


-------------------------------------------->上代码!

例如:

char x=0,y=0,z=0;

//读取0x5400000内容,放入x变量

x=Read(0x5400000);

y=x;

x=Read(0x5400000);

z=x;

-----------------------------------------------------

编译器会优化为:

x=Read(0x5400000);

y=x;

//若程序运行到这里,Read(0x5400000)的值发生改变,则z的值将不会随着改变。

z=x;

----------------------------------------------------

应该改为:

volatile char x;

char y=0,z=0;

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值