C++11 什么是现代C++;如何让constexpr const指针指向嵌入式应用程序的易失性内存位置?
在构建用于在嵌入式微处理器上控制硬件的库时,一项常见任务是操纵特定内存位置的位以控制硬件功能 在AVR处理器中,Atmel(现在的Microchip)提供了可扩展为以下内容的宏: 这可以实现以下功能: 现在在C++11(及更新版本)中,希望用C++11 什么是现代C++;如何让constexpr const指针指向嵌入式应用程序的易失性内存位置?,c++11,casting,c++17,volatile,C++11,Casting,C++17,Volatile,在构建用于在嵌入式微处理器上控制硬件的库时,一项常见任务是操纵特定内存位置的位以控制硬件功能 在AVR处理器中,Atmel(现在的Microchip)提供了可扩展为以下内容的宏: 这可以实现以下功能: 现在在C++11(及更新版本)中,希望用constepr替换几乎所有#define的用法 在GCC C++编译器的旧版本中(4.9),以下编译: #include <avr/io.h> constexpr volatile uint8_t *const PortA = &P
constepr
替换几乎所有#define
的用法
在GCC C++编译器的旧版本中(4.9),以下编译:
#include <avr/io.h>
constexpr volatile uint8_t *const PortA = &PORTA;
我不想解释为什么不能在constepr
上下文中使用reinterpret\u cast
,或者为什么整数到指针的转换是非法的
<现代> C++ > < <代码> CONTXPRPR <代码>指针>代码> > Value<代码>内存的正确方法是什么?< /强> < /P>
我见过一些建议,建议将PORTA
的内存地址存储在constexpr uintptpr\t
中,然后在运行时将其重新解释为volatile uint8\t*const
,以便进行位操作
例如,这可以正常工作,甚至可以按照预期编译为avr gcc
中的单个sbi
指令。
我无法重现您的错误消息错误:重新解释从整数到指针的转换
。我的编译器(g++7.3.0)发出了一条不同的消息-错误:“volatile uint8*{aka volatile unsigned char*}”类型的值“37”不是常量表达式
。这也是非常奇怪的…将volatile uint8\u t&PortA=PortA代码>做你想做的事?@IgorTandetnik这可能是我错过的一件简单的事情。我不知道为什么我以前没有试过。我会尝试更多的东西,然后回来。
PORTA |= 1;
#include <avr/io.h>
constexpr volatile uint8_t *const PortA = &PORTA;
error: reinterpret_cast from integer to pointer
#include <stdint.h>
constexpr uintptr_t PortA = 0x25;
void set() { *((volatile uint8_t *)(PortA)) |= 1; }
const char str[] = "FooBar";
constexpr const char * x = str + 2;