ray*_*ray 5 c embedded pointers 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;
}
}
Run Code Online (Sandbox Code Playgroud)
在搜索堆栈溢出后,我意识到将temp_value声明为volatile将表示temp_value将更改值.我在这个网站上找不到的是为什么我不能为data_value.value_UInt16使用volatile无符号整数
我将ADC值存储在服务器中,并希望随时访问更新的值.是否有一个额外的类型转换我应该指向temp_value?谢谢阅读.
你volatile uint16_t temp_value对编译器说"我的变量temp_value可能会被你不知道的东西改变"(特别是其他进程访问和写入用于存储变量的内存).除此之外,它还会阻止编译器进行某些优化.
当你这样做时:
data_value.value_UInt16 = &temp_value;
Run Code Online (Sandbox Code Playgroud)
(我认为这value_UInt16是非易失性的)
您将地址分配给volatile非易失性字段:编译器警告您允许对其进行优化,忽略指针对象可能会"通过它不知道的事物"进行更改.
方案:
1)Typecast data_value.value_UInt16 = *(uint16_t*)&temp_value,对编译器说:"我知道我在做什么,我知道我在这里忽略了volatile限定符".
要么,
2)创造value_UInt16一个volatile领域
重要的提示:
你标记了C++和C但是:
volatile 的工作方式与 const 基本相同。这段代码
const int i = 1;
int* iPtr = &i; //error
Run Code Online (Sandbox Code Playgroud)
无效,因为它尝试将指向 const 的指针分配给指向非 const 的指针。相似地,
volatile int i = 1;
int* iPtr = &i; //error
Run Code Online (Sandbox Code Playgroud)
出于同样的原因无效,除了易失性。尽管您的示例不完整,但这就是问题所在。