为什么C中需要volatile?它是用来干什么的?它能做什么
volatile告诉编译器不要优化与volatile变量有关的任何内容
使用它至少有三个常见的原因,所有这些都涉及到变量的值可以在不通过可见代码进行操作的情况下更改的情况:当您与更改值本身的硬件交互时;当另一个线程运行时,它也使用变量;或者当有一个信号处理程序可能改变变量的值时
假设您有一小块硬件映射到RAM的某个地方,它有两个地址:一个命令端口和一个数据端口:
类型定义结构
{
int命令;
int数据;
我很忙;
}MyHardwareGadget;
现在您要发送一些命令:
void SendCommand(MyHardwareGadget*小工具,int命令,int数据)
{
//小工具正忙,请稍候:
同时(小工具->;正忙)
{
//在这里什么都不要做。
}
//首先设置数据:
小工具->;数据=数据;
//写入命令将启动操作:
小工具->;命令=命令;
}
看起来很简单,但可能会失败,因为编译器可以自由更改数据和命令的写入顺序。这将导致我们的小工具使用以前的数据值发出命令。还可以查看“在忙时等待”循环。那个将被优化掉。编译器会尽量聪明,只读取一次isBusy的值,然后进入无限循环。那不是你想要的
解决这个问题的方法是将指针gadget声明为volatile。这样,编译器将被迫执行您编写的操作。它不能删除内存分配,不能在寄存器中缓存变量,也不能更改分配顺序
这是正确的版本:
void SendCommand(易失性MyHardwareGadget*小工具,int命令,int数据)
{
//小工具正忙,请稍候:
同时(小工具->;正忙)
{
//在这里什么都不要做。
}
//首先设置数据:
小工具->;数据=数据;
//写入命令将启动操作:
小工具->;命令=命令;
}