我一直在与微处理器合作,以从传感器读取温度,并遇到以下有关 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但:
  • 在C++中,这是错误(无效转换),例如here
  • 在C语言中,这是一个警告(您所显示的警告)。
  • 10-01 20:07
    查看更多