预处理器宏:从整数内容创建指针
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 = ®_ADDR(SOME_REGISTER);
调用方的&
和宏内部的*
会相互抵消
我想制作一个预处理器宏,将表示地址的整数转换为指针。用于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 = ®_ADDR(SOME_REGISTER);
调用方的&
和宏内部的*
会相互抵消