1

在嵌入式 C 中,我遇到了以下(以及更多类似的)示例:

#define GPIOA_AHB         ((GPIOA_AHB_Type          *) GPIOA_AHB_BASE)

GPIOA_AHB_BASE 是一个地址,它是之前定义的。这段代码究竟做了什么?我知道定义是预处理器的指令,因此它用定义中给出的值替换所有实例。例如,

 #define GPIOA_AHB   GPIOA_AHB_BASE

将用已定义的任何值 GPIOA_AHB_BASE 替换 GPIOA_AHB。我不明白在第一种情况下发生了什么......

4

2 回答 2

2

无法从问题中的信息中说明完整的详细信息,但是:

  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 总线和设备的内存读取。

于 2015-01-28T20:31:15.653 回答
1

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

访问这些寄存器的符号是GPIOA_AHB->some_register.

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

于 2015-01-28T20:34:42.163 回答