嵌入式 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。我不明白第一种情况发生了什么...

问题中的信息无法说明全部细节,但是:

  1. 如果源代码包含 GPIOA_AHB 作为标识符,它将最初被替换为 ((GPIOA_AHB_Type *)GPIOA_AHB_BASE)
  2. 接下来会发生什么取决于 GPIOA_AHB_TypeGPIOA_AHB_BASE 本身是否是宏。
  3. 如果有 #define GPIOA_AHB_BASE 0x10000 语句,则该值将插入替换文本中。类似地,如果有 #define GPIOA_AHB_Type uint8_t,则该值将插入替换文本中,导致代码包含:

    ((uint8_t *)0x10000)
    
  4. 可以取消引用该值,并且会发生实际引用 GPIO 总线和设备的内存读取。

根据 GPIOA_AHB 的定义,我可以得出结论,它用于引用 GPIO/AHB 设备的寄存器。

访问这些寄存器的表示法是GPIOA_AHB->some_register

如果您按照第二种情况中的描述定义了 GPIOA_AHB,那么它只是一个普通数字。如果不先将其转换为描述该设备内寄存器偏移量的结构 (GPIOA_AHB_Type) 或手动添加该设备寄存器内每个寄存器的偏移量 space,您将无法使用它来引用寄存器.