嵌入式 C #define
embedded C #define
在嵌入式 C 中,我 运行 进入以下(以及更多类似的)示例:
#define GPIOA_AHB ((GPIOA_AHB_Type *) GPIOA_AHB_BASE)
GPIOA_AHB_BASE是一个地址,之前已经定义好了。这段代码究竟做了什么?我知道定义是预处理器的指令,因此它用定义中给定的值替换所有实例。例如,
#define GPIOA_AHB GPIOA_AHB_BASE
会将 GPIOA_AHB 替换为已定义的任何值 GPIOA_AHB_BASE。我不明白第一种情况发生了什么...
问题中的信息无法说明全部细节,但是:
- 如果源代码包含
GPIOA_AHB
作为标识符,它将最初被替换为 ((GPIOA_AHB_Type *)GPIOA_AHB_BASE)
。
- 接下来会发生什么取决于
GPIOA_AHB_Type
或 GPIOA_AHB_BASE
本身是否是宏。
如果有 #define GPIOA_AHB_BASE 0x10000
语句,则该值将插入替换文本中。类似地,如果有 #define GPIOA_AHB_Type uint8_t
,则该值将插入替换文本中,导致代码包含:
((uint8_t *)0x10000)
可以取消引用该值,并且会发生实际引用 GPIO 总线和设备的内存读取。
根据 GPIOA_AHB
的定义,我可以得出结论,它用于引用 GPIO/AHB
设备的寄存器。
访问这些寄存器的表示法是GPIOA_AHB->some_register
。
如果您按照第二种情况中的描述定义了 GPIOA_AHB
,那么它只是一个普通数字。如果不先将其转换为描述该设备内寄存器偏移量的结构 (GPIOA_AHB_Type
) 或手动添加该设备寄存器内每个寄存器的偏移量 space,您将无法使用它来引用寄存器.
在嵌入式 C 中,我 运行 进入以下(以及更多类似的)示例:
#define GPIOA_AHB ((GPIOA_AHB_Type *) GPIOA_AHB_BASE)
GPIOA_AHB_BASE是一个地址,之前已经定义好了。这段代码究竟做了什么?我知道定义是预处理器的指令,因此它用定义中给定的值替换所有实例。例如,
#define GPIOA_AHB GPIOA_AHB_BASE
会将 GPIOA_AHB 替换为已定义的任何值 GPIOA_AHB_BASE。我不明白第一种情况发生了什么...
问题中的信息无法说明全部细节,但是:
- 如果源代码包含
GPIOA_AHB
作为标识符,它将最初被替换为((GPIOA_AHB_Type *)GPIOA_AHB_BASE)
。 - 接下来会发生什么取决于
GPIOA_AHB_Type
或GPIOA_AHB_BASE
本身是否是宏。 如果有
#define GPIOA_AHB_BASE 0x10000
语句,则该值将插入替换文本中。类似地,如果有#define GPIOA_AHB_Type uint8_t
,则该值将插入替换文本中,导致代码包含:((uint8_t *)0x10000)
可以取消引用该值,并且会发生实际引用 GPIO 总线和设备的内存读取。
根据 GPIOA_AHB
的定义,我可以得出结论,它用于引用 GPIO/AHB
设备的寄存器。
访问这些寄存器的表示法是GPIOA_AHB->some_register
。
如果您按照第二种情况中的描述定义了 GPIOA_AHB
,那么它只是一个普通数字。如果不先将其转换为描述该设备内寄存器偏移量的结构 (GPIOA_AHB_Type
) 或手动添加该设备寄存器内每个寄存器的偏移量 space,您将无法使用它来引用寄存器.