什么时候应该使用volatile修饰符?

点击上方的嵌入式开发圈,请记住关注我们! & nbsp;& nbsp;& nbsp; volatile修饰符告诉编译器不要对变量参与的操作执行某些优化。

volatile修饰符需要在两种特殊情况下使用:第一种情况涉及内存映射的硬件(例如图形适配器,就像计算机内存的一部分一样),第一种情况涉及共享内存(共享内存,这是两个或两个以上同时运行的程序使用的内存。

& nbsp;& nbsp;& nbsp;大多数计算机具有一系列寄存器,这些寄存器的访问速度比计算机的主存储器要快。

好的编译器可以执行称为“冗余加载和存储删除”的优化。

(冗余加载和存储删除),也就是说,编译器将在程序中查找和删除两种类型的代码:一类是可以删除以从内存中加载数据的指令,因为相应的数据已存储在其中。

登记册;另一个是可以删除以将数据存储在内存中的指令,因为相应的数据在再次更改之前就已更改。

它可以一直保存在寄存器中。

& nbsp;& nbsp;如果指针变量指向普通内存以外的其他位置(例如外围设备的内存映射端口),则优化冗余进行装载和存储可能是有害的。

例如,为了调整操作时间,可以使用以下功能:time_t ; nbsp; int& nbsp; a){int n; int x;然后time_t; x = O;然后,=(n = O;  n< 10.00;& nbsp; n ++)的t-& nbsp;& nbsp; x = x + a& nbsp;返回t-& gt; value-then;}& nbsp; <& nbsp;& nbsp;在上述函数中,变量t-& gt实际上是一个硬件计数器,其值随时间增加。

此函数执行将a的值与x相加的操作的1000倍,然后返回在执行这1000次加法期间添加了t-> value的值。

如果不使用volatile修饰符,那么聪明的编译器可能会认为函数执行期间t-> value不会改变,因为函数中的t-value语句中没有显式的更改。

以这种方式,编译器将认为没有必要再次从存储器读取t-值,然后再减去,因为答案总是为0。

该函数,导致该函数的返回值始终为0。

储存也可能对其有害。

共享内存通常用于实现两个程序之间的相互通信。

通信,即让一个程序将数据存储在共享内存中,并让另一个程序从该内存中读取数据。

如果编译器优化了从共享内存加载数据或将数据存储到共享内存的代码,则程序之间的通信将受到影响。

魏东山嵌入式Linux课程推荐商业合作支持我,请告诉我!

欢迎您的咨询