我想创建一个预处理器宏,该宏将代表地址的整数转换为指针。这是用于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]
警告
有一种干净的方法吗?
多谢
答案 0 :(得分:4)
通常,您只需将寄存器定义为#define SOME_REGISTER (*(volatile uint8_t*) 0x05)
,而无需执行额外的步骤。
出现编译器消息是因为宏是使用*
取消引用编写的,因此可以将其用作常规变量。因此,您将直接对寄存器进行读/写操作,而中间没有任何本地指针变量。
如果这不是您想要的,则不要使用那样的寄存器,或者将代码更改为此:
volatile uint8_t* reg_ptr = ®_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);