预处理器宏:从整数内容创建指针

Preprocessor Macro : Make pointer from integer content

我想制作一个预处理器宏,将表示地址的整数转换为指针。用于MCU开发。

例如,寄存器定义为

#define SOME_REGISTER 0x05 // This the the address of SOME_REGISTER

所以我定义了下面的宏:

#define REG_ADDR(reg) (*((volatile uint8_t*) reg))

当我不想使用它时

volatile uint8_t * reg_ptr = REG_ADDR(SOME_REGISTER)

当然,我收到 makes pointer from integer without a cast [-Wint-conversion] 警告

有干净的方法吗?

提前致谢

您可以重复使用已经存在的、经过验证的代码,这些代码是通过适当的许可发布的。
例如,您可以使用来自 Arm 的 mmio.h 代码,您可以在 Arm Trusted Firmware 的 git 存储库中找到它,在 include/lib 目录中。

在您的示例中,您将使用 mmio.h 中的 mmio_read_8() 函数:

static inline uint8_t mmio_read_8(uintptr_t addr)
{
    return *(volatile uint8_t*)addr;
}

结果代码为:

volatile uint8_t * reg_ptr = mmio_read_8((uintptr_t) SOME_REGISTER);

通常,您只需将此类寄存器定义为 #define SOME_REGISTER (*(volatile uint8_t*) 0x05),而无需额外的步骤。

编译器消息出现是因为宏是用 * 取消引用编写的,因此它可以用作常规变量。所以你 read/write 直接到寄存器,中间没有局部指针变量。

如果这不是您想要的,那么要么不要那样使用寄存器,要么将代码更改为:

volatile uint8_t* reg_ptr = &REG_ADDR(SOME_REGISTER);

调用方的&和宏内部的*会相互抵消