c - 在 C 中正确丢弃 volatile 变量内容的替代方法是什么?

标签 c casting volatile misra

在对微 Controller 进行编程时,有时需要读取寄存器以重置某些标志。这些寄存器是内存映射的,并在代码中声明为指向 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 值的替代方法是什么以避免出现“死代码”?** 因为使用帖子中的方法 Casting the results of a volatile expression to void 情况非常相似,我仍然违反了 MISRA c 2012 规则。我无法更改 #define MODULE_SCU 或结构中的任何内容,因此正确的替代方法是可行的方法。

我不想只是让编译器转换为 void 静音,因为我从这个线程中读取:What does void casting do?因为如果我转换为 void,那么优化器可能会优化掉读取的内容,这是不可取的。

不要太在意代码片段的正确性,我只是把它包括在内以说明问题

最佳答案

Here reg has to be read in order to reset it's bits, there is no other way to reset some bits other thatn reading them, So, MISRA rule checker is complaining that there is dead code and it's right.

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

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

所以,事实上 MISRA 规则检查器是错误的,代码完全没问题,不应该被标记。

没有必要寻找正确方法的替代方法。

关于c - 在 C 中正确丢弃 volatile 变量内容的替代方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31951051/

相关文章:

c# - 使用 "generic value"将对象转换为 KeyValuePair?

java - 为什么我不能将 Map<TypeA, TypeB> 转换为 Map<Object, Object>

c++ - 副作用/ volatile /复制构造函数/析构函数

C:使用具有 "getter"函数和中断的静态 volatile

c - 为什么 gcc/clang 默认知道链接到 libc?

c - 结构体和指向指针的指针

c - 如何计算文本文件中相互重叠的单词

python - 在 Python 2.7 中向字符串添加单引号

c - 如果 volatile 对线程没有用,为什么原子操作需要指向 volatile 数据的指针?

c - 如何运行另一个程序,通过 stdin 传递数据,并在 Linux 中获取其 stdout 输出?