首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从原始内存中读取值(符合MISRA)

从原始内存中读取值(符合MISRA)
EN

Stack Overflow用户
提问于 2014-09-08 16:45:11
回答 4查看 1.3K关注 0票数 1

我正在尝试读取之前在NVM闪存中写入的变量的值。

我的代码是:

代码语言:javascript
复制
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到指针的转换。有谁知道访问这个内存的方法吗?

我违反了米斯拉的一条重要规则。使用动态存储器(闪存的内容是动态的,所以数据的地址是可变的)。如果你想声明一个指向闪存地址的常量指针,并在写入数据后对其进行访问,这是唯一的原因。

如果不是为了打破它们,规则是什么?:)

EN

回答 4

Stack Overflow用户

发布于 2014-09-08 19:39:18

在我看来。对于这个问题,我只有两个“解决方案”:

1.-不要遵从MISRA。

2.-在动态环境中使用静态地址:

在编译时:

代码语言:javascript
复制
const Table1 table1 __attribute__ ((section (".table1space")));
const Table2 table2 __attribute__ ((section (".table2space")));

定义链接器脚本中所需的部分。

在运行时:

当为table1调用动态分配时。返回静态table1地址,依此类推。

票数 1
EN

Stack Overflow用户

发布于 2019-09-25 16:26:07

MISRA C++ (必需)规则5-2-8试图阻止你做导致未指明行为的事情。等效的MISRA C:2012指南是(咨询)规则11.4

一般来说,将整数转换为指针是不可取的,因为存在各种可能的问题,尤其是与对齐有关的问题。

MISRA C指南有一些额外的叙述

在可能的情况下,应避免在指针和整数类型之间进行

强制转换,但在寻址内存映射寄存器或其他硬件特定功能时,可能需要这样做。

处理此问题的正确方法是引发偏差。这记录了为什么你需要这样做的原因,但也会让你考虑的后果,并向表明你正在减轻它们。

票数 1
EN

Stack Overflow用户

发布于 2014-09-08 17:04:12

如果getAddress()返回一个整型类型,该类型实际上应该像指针一样使用,那么让我们假设它是2字节对齐的,因为您的数据是uint16_t

代码语言:javascript
复制
uintptr_t offset = getAddress();
assert(offset % sizeof(uint16_t) == 0);
uint16_t* address = 0;
address += offset / sizeof(uint16_t);
uint16_t value = *address;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25720358

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档