首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何设置指向物理地址的常数指针

如何设置指向物理地址的常数指针
EN

Stack Overflow用户
提问于 2017-05-08 11:18:56
回答 2查看 2.4K关注 0票数 12

在嵌入式编程中,通常需要设置指向物理地址的指针。地址是不可重定位和固定的。这些不是由链接器设置的,因为它们通常表示寄存器,或者在这种情况下表示位于OPT存储器中预定地址的校准数据。该数据是在芯片制造商首次在生产中测试该设备时设置的。

所以第一次尝试是:

代码语言:javascript
运行
复制
static constexpr uint16_t *T30_CAL = reinterpret_cast<uint16_t *>(0x1FFFF7B8u);

但这会导致GCC领导下的后续警告/错误,根据标准(c++ 14),这是非法的。

..xyz/xxxx/校准.xyz:23:40:错误:从整数到指针的reinterpret_cast

现在我可以伪造它了

代码语言:javascript
运行
复制
constexpr uint32_t T30_ADDR = 0x1FFFF7B8u;
static constexpr inline uint16_t *T30_CAL(){ 
  return reinterpret_cast<uint16_t *>(T30_ADDR);
}

编译时没有警告但是.

我想GCC可以随意地把它编译成一个函数,而不是一个警察,尽管它每次都是这样做的。

是否有一种更简单、更符合标准的方法来做到这一点?

对于嵌入式代码,这些定义一直都是必需的,所以如果有一种不需要函数定义的简单方法来实现这些定义,那就太好了。

对前几个问题的回答通常会导致这样的回答,即这在标准中是不允许的,就这样留下了。

这不是我真正想要的。我需要一种兼容的方式来使用C++生成指向固定地址的编译时间常数指针。我想在不使用宏的情况下这样做,因为它会向我的代码中散布会导致遵从性检查器问题的强制转换。它导致需要在多个地方而不是一个地方获得遵从性异常。每个异常都是一个过程,需要时间和精力。

Constexpr保证,在嵌入式系统中,常量放置在.text部分(flash),而const没有。它可以放置在有价值的内存中,并由.bss启动代码初始化。通常,嵌入式设备比RAM具有更多的闪存。另外,在RAM中访问变量的代码通常效率要低得多,因为它通常涉及对嵌入式目标(如ARM )的至少两个内存访问。一个加载变量的RAM地址,另一个从变量的位置加载实际的常量指针值。Constexpr导致将常量指针直接编码到指令流中,或者导致单个常量负载。

如果这只是一个实例,它不会是一个问题,但是通常有许多不同的外围设备,每个外围设备都通过自己的寄存器集来控制,这就成了一个问题。

许多嵌入式代码的结果是读取和写入外围寄存器。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-07-16 21:44:30

用这个代替:

代码语言:javascript
运行
复制
static uint16_t * const T30_CAL = reinterpret_cast<uint16_t *>(0x1FFFF7B8u);

GCC将把T30_CAL存储在ARM目标上,而不是内存上。关键是“const”必须位于“*”之后,因为T30_CAL才是const,而不是T30_CAL所指向的。

票数 5
EN

Stack Overflow用户

发布于 2018-07-15 10:12:25

正如注释中已经指出的:reinterpret_cast is not allowed in a constant expression,这是因为编译器必须能够在编译时计算constexpr,但是reinterpret_cast可能使用运行时指令来完成它的工作。

您已经建议使用宏。这对我来说似乎是一个很好的方法,因为编译器肯定不会产生任何开销。但是,我不建议使用第二种隐藏reinterpret_cast的方法,因为正如您所说的,会生成一个函数。这个函数可能比一个额外的指针占用更多的内存。

无论如何,在我看来,最合理的方法就是声明一个const指针。一旦使用优化,编译器就会将内存位置插入到可执行文件中,而不是使用变量。(见https://godbolt.org/g/8KnUKg )

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43846311

复制
相关文章

相似问题

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