Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C中正确地丢弃易失性变量内容的替代方法是什么?_C_Casting_Volatile_Misra - Fatal编程技术网

在C中正确地丢弃易失性变量内容的替代方法是什么?

在C中正确地丢弃易失性变量内容的替代方法是什么?,c,casting,volatile,misra,C,Casting,Volatile,Misra,对微控制器编程时,有时需要读取寄存器以重置某些标志。这些寄存器是内存映射的,并在代码中声明为指向volatile的指针 假设下一个代码段为示例: typedef volatile struct _Ifx_SCU { ... uint32_t reg; ... }Ifx_SCU; #define MODULE_SCU ((*(Ifx_SCU*)0xF0036000u)) void foo(void) { ... MODULE_SCU.reg; /* Rea

对微控制器编程时,有时需要读取寄存器以重置某些标志。这些寄存器是内存映射的,并在代码中声明为指向volatile的指针

假设下一个代码段为示例:

typedef volatile struct _Ifx_SCU
{
   ...
   uint32_t reg;
   ...
}Ifx_SCU;


#define MODULE_SCU ((*(Ifx_SCU*)0xF0036000u))


void foo(void)
{
   ... 

   MODULE_SCU.reg; /* Read required to reset bits in reg */

   ...
}
这里必须读取reg以重置其位,没有其他方法重置读取时的其他位,因此,MISRA规则检查器抱怨存在死代码,这是正确的

我的问题是,为了避免出现“死代码”,读取和丢弃**reg值的另一种方法是什么?**因为使用了post中的方法 情况非常相似,我仍然违反了MISRA c 2012规则。我无法更改#define MODULE_SCU或struct中的任何内容,因此需要一种正确的替代方法

我不想在我从这个线程读取时让编译器强制转换为void时保持沉默:因为如果我强制转换为void,那么优化器可能会优化掉该读取,这是不可取的

不要太注意代码片段的正确性,我只是为了说明这个问题而加入它

这里reg必须被读取,以便重置它的位,没有其他 重新设置一些位的方法,而不是读取它们,所以,米斯拉规则 检查器正在抱怨有死代码,这是正确的

死代码是什么也不做的代码。从技术上讲,死代码是一种没有副作用的语句。在这种情况下,
volatile
关键字表示它确实在做某事,它正在读取内存,因此重置位,这是一个明确的副作用

volatile关键字还确保兼容优化器不会删除该行

因此,事实上,MISRA规则检查器是错误的,代码是完美的,不应该被标记


无需找到正确方法的替代方法。

读取对象并丢弃结果的正确方法是:

(void)object;
强制转换实际上是不必要的,但可以防止编译器抱怨(实际上不确定MISRA)。仅供参考:这是一个很好的例子

如果
object
是限定的
volatile
,编译器可能不会优化访问,因为该关键字告诉编译器存在副作用,即使编译器没有看到它。强制转换应用于表达式的结果(“读取”),而不是对象,因此它不会像您的注释所暗示的那样删除限定符


MISRA检查器不应该抱怨,因为该行实际上做了一些事情。(这由
volatile
限定符暗示)。如果工具仍有问题,请将其丢弃。更重要的是,这并不是您第一次遇到问题。

可能重复@Olaf:这并不完全是一个重复,因为除了参考threadWell中所示的方法之外,我正在寻找另一种方法,我认为它实际上是一个重复。因为你也在问,这是不是优化了。不知道你说的“我不能改变…”是什么意思。您不必更改声明。被访问的对象基本上与您的对象相同。您所说的“替代方式?正确方式的替代方式”是什么意思?这个问题应该是,“为什么MISRA规则检查器将其标记为死代码?”?“。这使它更清晰,并避免成为dup@Veltas:请说明得出此结论的标准部分。暗示opposite@Olaf奇怪的是,程序员在键入整个关键字时都会出现打字错误:)而且不必担心向下投票,我想不会you@GlennTeitelbaum:弗洛伊德式滑脱?:-)最后,我想补充一点,死代码的技术描述是一个没有副作用的语句,通常表示错误。在这种情况下,没有死代码。检查者完全忽略volatile并不奇怪,这也会导致大量“无法访问的代码”违规行为。对于
volatile
,是否确实需要
(void)
,或者这只是对不遵从性的一种包扎warnings@Veltas:谢谢;请随意编辑这些打字错误,我有一个蹩脚的键盘;-)@GlennTeitelbaum:实际上,这样的表达式就足够了(我自己使用),但是一些编译器可能会发出警告,所以请注意安全。刚才添加了详细信息。仅供参考,OP提到,强制转换到
void
会导致与以前相同的错误,因此不是一种解决方法。显然,你的主要建议仍然是正确的:扔掉工具。@Veltas:“OP提到,铸造无效会导致与以前相同的错误…”难怪它会导致同样的抱怨。但不管有没有,这都不是错误,也没有理由抱怨。因此,我的答复的最后一段适用。