- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个读/写一些内存映射寄存器的裸机程序(驱动程序)。例如:
void foo_read(uint64_t reg_base, uint32_t *out_value)
{
*out = READREG(reg_base + 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) 事件驱动框架的代码,开源。具体来说:
Q_UINT2PTR_CAST
宏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/
我无法解决此行中的 Misra 规则 11.6 警告: uint32_t * delay = (uint32_t *)0x40086D0C ; [仅供引用: typedef long unsigned
MISRA 标准不允许在宏定义中使用字符串化运算符在不使用 # 运算符的情况下实现相同概念的替代方法是什么? 最佳答案 实际上并没有任何直接的替代方案——只有变通办法。此建议规则与建议不要使用类似函数
MISRA 标准不允许在宏定义中使用字符串化运算符在不使用 # 运算符的情况下实现相同概念的替代方法是什么? 最佳答案 实际上并没有任何直接的替代方案——只有变通办法。此建议规则与建议不要使用类似函数
我对misra和按位运算有一些理解问题。 我有以下操作: ((in >> bit) & 1u) 这里in有类型 unsigned short和 bit有类型 int . 1u应该是 unsigned
根据 MISRA 规则,我遇到此错误:不能对有符号整数执行按位运算。 typedef unsigned __int8 gUBYTE; typedef gUBYTE gBORDER;
C标准要求,在表达式中使用时,排名低于“int”且其值在“int”范围内的无符号类型的值总是提升为“signed int”。因此,假设如下: uint8_t a,b; if ((a-b) > (uin
我有这个功能: void InitS(unsigned int &numS){ // this function returns a container for unsigned int
我需要一些关于 C++ 内存管理和 MISRA 指南的说明.. 我必须实现一个与 MISRA 兼容的程序,所以我必须遵守一条重要规则:不可能使用"new"运算符(动态内存堆)。 在这种情况下,对于任何
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 6 年前。
我了解 MISRA-C 标准适用于嵌入式固件。当嵌入式 Linux 是您的产品平台时,您的嵌入式应用程序能否/应该开发为符合 MISRA-C 标准?有没有人考虑过这样的练习? 我的一般感觉是,您必
我写了下面一段 MISRA 不喜欢的代码: UartPtr->C &= ((uint8_t)(~SIO_C2_SBK)); 与 #define SIO_C2_SBK ((uint8_t)0x01u)
MISRA 中的规则 2.2 规定“源代码应仅使用 /* ... */ 样式注释”。有谁知道这条规则的基本原理是什么? //出了什么问题风格评论? 最佳答案 MISRA 1998 和 2004 仅支持
类函数宏是 #define ARRAYSIZE(_Array) ((sizeof(_Array)) / (sizeof(_Array[0]))) 显示的错误是: Error[Pm154]: in t
是否可以禁用外部库的 MISRA 检查?我已经尝试过这个,但它似乎不起作用(此 header 使用 C++ 风格的注释和不兼容的 @ 标签)。 #pragma ghs startnomisra #in
我创建了一个函数来添加数组中的下一个数字。代码很简单,如下 int math(int *address, int size) { int sum = 0; for (int i = 0
我遇到了有关环绕错误的 MISRA 标准问题。我试图通过查看互联网上可用的选项来解决它,但仍然无法解决它,因为仍然无法找到一些可行的解决方案。 我提供一个简单的例子来解释我的情况。 由于 MISRA
我正在尝试读取之前写入 NVM 闪存的变量的值。 我的代码是: uintptr_t address = getAddress(); //[MISRA C++ Rule 5-2-8] cast from
MISRA C++ 规则:5_0_3 尝试使用一种符合 MISRA 标准的静态工具分析器,但无法解决。 #include #include using namespace std; int main(
我有以下行(减少到最低限度地展示问题): char version_text[64U] = {'\0'}; 此行生成以下 MISRA 错误: Error[Pm023]: missing element
我有一个读/写一些内存映射寄存器的裸机程序(驱动程序)。例如: void foo_read(uint64_t reg_base, uint32_t *out_value) { *out = R
我是一名优秀的程序员,十分优秀!