在对微控制器进行编程时,有时需要读取寄存器以重置某些标志。这些寄存器是内存映射的,并在代码中声明为指向 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值以避免出现“死代码”的另一种方法?** 因为使用帖子中的方法将 volatile 表达式的结果转换为 void 具有非常相似的在这种情况下,我仍然违反了 MISRA c 2012 规则。我无法从#define MODULE_SCU或结构中更改任何内容,因此正确的替代方法是可行的方法。
当我从这个线程中读到时,我不想让编译器强制转换为 void:什么是 void 强制转换?因为如果我强制转换为 void,那么优化器可能会优化掉该读取,这是不可取的。
不要太在意片段的正确性,我只是为了说明问题而包含它