我正在尝试读取之前在NVM闪存中写入的变量的值。
我的代码是:
uintptr_t address = getAddress();
//[MISRA C++ Rule 5-2-8] cast from unsigned int to pointer
uint16_t value = *(reinterpret_cast<uint16_t*>(address)); 问题是在MISRA中不允许从uintptr_t到指针的转换。有谁知道访问这个内存的方法吗?
我违反了米斯拉的一条重要规则。使用动态存储器(闪存的内容是动态的,所以数据的地址是可变的)。如果你想声明一个指向闪存地址的常量指针,并在写入数据后对其进行访问,这是唯一的原因。
如果不是为了打破它们,规则是什么?:)
发布于 2014-09-08 19:39:18
在我看来。对于这个问题,我只有两个“解决方案”:
1.-不要遵从MISRA。
2.-在动态环境中使用静态地址:
在编译时:
const Table1 table1 __attribute__ ((section (".table1space")));
const Table2 table2 __attribute__ ((section (".table2space")));定义链接器脚本中所需的部分。
在运行时:
当为table1调用动态分配时。返回静态table1地址,依此类推。
发布于 2019-09-25 16:26:07
MISRA C++ (必需)规则5-2-8试图阻止你做导致未指明行为的事情。等效的MISRA C:2012指南是(咨询)规则11.4
一般来说,将整数转换为指针是不可取的,因为存在各种可能的问题,尤其是与对齐有关的问题。
MISRA C指南有一些额外的叙述
在可能的情况下,应避免在指针和整数类型之间进行
强制转换,但在寻址内存映射寄存器或其他硬件特定功能时,可能需要这样做。
处理此问题的正确方法是引发偏差。这记录了为什么你需要这样做的原因,但也会让你考虑的后果,并向表明你正在减轻它们。
发布于 2014-09-08 17:04:12
如果getAddress()返回一个整型类型,该类型实际上应该像指针一样使用,那么让我们假设它是2字节对齐的,因为您的数据是uint16_t
uintptr_t offset = getAddress();
assert(offset % sizeof(uint16_t) == 0);
uint16_t* address = 0;
address += offset / sizeof(uint16_t);
uint16_t value = *address;https://stackoverflow.com/questions/25720358
复制相似问题