阅读 54

volatile关键字的原理与作用,volatile struct

以前知道violate的作用,是可变的意思。 因为变量有可能意外地变化,所以使用的时候一定要使用最新的数据。 许多编译器在编译程序的过程中优化程序以提高执行效率,因此如果变量的值不是最新的,而是使用已存在于高速缓存中的值,则可能会出现莫名其妙的错误。 因此,对一些易变的变量进行violate修饰后,编译器在编译中不优化读写这一变量,而是用于1进程间参数传输2特殊功能寄存器。 volatile的意思是,例如有两个线程正在运行。 第一个线程初始化并将变量a加载到高速缓存中后,第二个线程现在更改了a的值。 如果a未由volatile限定,则在第一个线程中使用a时,可能会在正在使用的缓存中使用未更改的值。 (这只是可能性。 因为多线程的执行没有人能保证结果是什么。 这涉及不同的系统。 如果使用volatile限定,则可以确保每次都取a的值不是从缓存中取,而是真正从对应的内存地址取。 volatile的真正含义是,因为对寄存器的访问速度超过RAM,所以编译器通常会进行优化以减少对外部RAM的访问。 例如,静态输入I=0; intmain(void )…while(1) (if ) I ) dosomething ); }/* interruptserviceroutine.*/void ISR _2(void ) { i=1; }程序的真谛是在发生ISR_2中断时在main中调用dosomething函数,但由于编译器判断在main函数中没有修正I,所以只进行一次从I向某个寄存器的读取*** 如果对每次判断if时只使用该寄存器中的“I副本”的dosomething可能不会永远持续的变量进行volatile限定,编译器将确保该变量的读写***不会得到优化。 在这个例子中I也应该这样解释。

一般来说,volatile需要1、将volatile添加到由中断服务程序更改的其他程序检测到的变量中; 2、多任务环境下各任务间共享的标志应加volatile; 3、内存映射的硬件寄存器中通常也要放入volatile的说明。 这是因为每次其读写都有可能具有不同的含义; 另外,在这些情况下,经常也需要同时考虑数据完整性,相互关联的一些标志被读一半并中断改写。 1可以通过关闭中断来实现,2可以禁止任务调度,3只能依靠硬件的优秀设计。


文章分类
代码人生
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐