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

时间:2020-04-14 12:22:07

标签: pointers macros embedded avr

我想创建一个预处理器宏,该宏将代表地址的整数转换为指针。这是用于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]警告

有一种干净的方法吗?

多谢

2 个答案:

答案 0 :(得分:4)

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

出现编译器消息是因为宏是使用*取消引用编写的,因此可以将其用作常规变量。因此,您将直接对寄存器进行读/写操作,而中间没有任何本地指针变量。

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

volatile uint8_t* reg_ptr = &REG_ADDR(SOME_REGISTER);

调用方的&和宏中的*将相互抵消。

答案 1 :(得分:1)

您可以重复使用使用适当许可发布的,已存在的,经过验证的代码。
例如,您可以使用Arm的mmio.h代码,可以在include/lib目录中的Arm受信任固件的git存储库中找到它。

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

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);