gpt4 book ai didi

c - 处理内存访问时避免将整数转换为指针的最佳方法 (MISRA 2008)

转载 作者:太空宇宙 更新时间:2023-11-03 23:43:16 27 4
gpt4 key购买 nike

我有一个读/写一些内存映射寄存器的裸机程序(驱动程序)。例如:

void foo_read(uint64_t reg_base, uint32_t *out_value)
{
*out = READREG(reg_base + FOO_REG_OFFSET);
}
  • reg_base 是内存映射设备的基地址(64 位地址)
  • FOO_REG_OFFSET 是寄存器的偏移量(#define FOO_REG_OFFSET
    0x00000123
    )。寄存器“foo”是 32 位“宽”。

READREG 定义如下:

#define READREG(address)    (*(uint32_t*)(address))

正如您所猜测的那样,MISRA 2008 对从 unsigned long long 到指针的转换不满意(报告了 5-2-7/5-2-8)。我的问题是:访问内存和消除 MISRA 警告的最佳/适当方法是什么?我试图在转换为指针之前转换为 uintptr_t,但是 This didn't help .

谢谢。

最佳答案

这里有几件事 - 首先,您对 READ_REG 的定义缺少 volatile - 它应该类似于

#define READREG(address)    (*(uint32_t volatile *)(address))

其次 - 这当然是特定于 CPU 的 - 一般来说,从奇数地址(偏移量 0x123)读取 32 位值是行不通的 - 至少它会很慢(多个总线周期),并且在许多架构上,您会遇到处理器异常。 (顺便说一句,请注意指针算法在这里没有发挥作用,因为这 2 个值是在转换为指针之前添加的。)

回答你原来的问题:

what is the best/appropriate way to access memory and get rid of MISRA warnings

好吧 - 你违反了 MISRA 规则(在这种情况下你必须这样做,我们都经历过......)所以你会收到警告.

因此,您需要做的是以有纪律、系统且易于识别的方式抑制警告。在我看来,没有比 Quantum Platform 更好的例子和解释了。 (QP) 事件驱动框架的代码,开源。具体来说:

  • 查看 QP's MISRA Compliance有关如何处理的示例的矩阵——例如,只需在 PDF 中搜索 Q_UINT2PTR_CAST
  • 检查 QP 的实际源代码 - 例如 macro that wraps/encapsulates such "int to ptr" casts (通过这种方式,它们以一种易于识别的方式完成,并且易于在一个地方更改/抑制警告)
  • 最后,检查 PC-Lint 配置文件 qpc.lnt,您可以在其中的一个地方查看如何/在何处抑制警告。这在 this app note 中有解释。 , 第 6.3 节:

6.3 Rule 5-2-8(req)

An object with integer type or pointer to void type shall not be converted to an object with pointer type.

The QP/C++ applications might deviate from rule 5-2-8 when they need to access specific hard-coded hardware addresses directly. The QP/C++ framework encapsulates this deviation in the macro Q_UINT2PTR_CAST(). The following code snippet provides a use case of this macro: #define QK_ISR_EXIT() . . . \ *Q_UINT2PTR_CAST(uint32_t, 0xE000ED04U) = \

我没有时间谈论 MISRA 警告抑制、合规性问题等,但以上内容为您提供了所需的一切。

附言不确定您指的是哪个 MISRA 准则——对于 C,有 2004 年和 2012 年的准则,对于 C++,有 2008 年的准则(我知道,快到 2017 年了!)

关于c - 处理内存访问时避免将整数转换为指针的最佳方法 (MISRA 2008),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40307281/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com