我一直在与微处理器合作,以从传感器读取温度,并遇到以下有关 volatile 声明的警告。
“分配从指针目标类型中丢弃'volatile'限定符”
我收到的温度只有一个值,直到重启程序,该值才会改变。
volatile uint16_t temp_value = 0;
if (value_type == UA_TYPE_UInt16)
{
data_value.value_UInt16 = &temp_value; // warning*******
switch (handle)
{
case HANDLE_TEMP1:
temp_value = ADC_GetConversionValue(ADC3);
break;
}
}
搜索堆栈溢出后,我意识到将temp_value声明为volatile将表示temp_value将更改值。我在此站点上找不到的是为什么我不能对data_value.value_UInt16使用易失的无符号整数
我将ADC值存储在服务器中,并希望随时访问更新后的值。我是否还有其他指向temp_value的类型转换?谢谢阅读。
最佳答案
您的volatile uint16_t temp_value
对编译器说:“您不知道的事情可能会更改我的变量temp_value
”(尤其是其他进程访问和写入用于存储该变量的内存)。除其他外,它阻止编译器进行某些优化。
当您这样做时:
data_value.value_UInt16 = &temp_value;
(我假设
value_UInt16
是非 volatile 的)您将
volatile
的地址分配给一个非 volatile 字段:编译器警告您允许对其进行优化,忽略,该pointe对象可能“由于它不知道的事情而改变了”。解决方案:
1)Typecast
data_value.value_UInt16 = *(uint16_t*)&temp_value
,对编译器说:“我知道我在做什么,我知道我在这里忽略了volatile限定符”。或者,
2)也将
value_UInt16
设为volatile
字段重要说明:
您标记了C++和C但: