理解一部分代码

时间:2014-02-12 16:53:09

标签: c macros microcontroller

以下是微控制器代码的一部分,我无法理解。

#define GPIO_PORTF_DIR_R        (*((volatile unsigned long *)0x40025400))

int main (void){
     GPIO_PORTF_DIR_R = 0x0E;
...}

据我所知,GPIO_PORTF_DIR_R不是可行的,而(*((volatile unsigned long *)0x40025400))是指向的地址的内容。 那么如何使用GPIO_PORTF_DIR_R作为变量。这里发生了什么。

3 个答案:

答案 0 :(得分:4)

#define声明一个预处理器宏。这意味着在编译之前,GPIO_PORTF_DIR_R将在代码中的任何位置替换为宏的内容。所以你实际编译的代码将是

(*((volatile unsigned long *)0x40025400)) = 0x0E;

这意味着将0x0E写入该地址。

如果您希望通过名称引用某些(复杂)数值,则通常会使用预处理器宏。这允许您在必要时集中更改该值,但在代码中具有有意义的名称,而无需为其提供变量。

答案 1 :(得分:3)

常量值0x40025400用作内存地址。似乎在您的平台(微控制器)上,该地址是memory-mapped general-purpose I/O port

代码等同于此,如果它使其更具可读性:

// pointer to memory address 0x40025400
volatile unsigned long *p = 0x40025400;

// set that value in memory
*p = 0x0E;

答案 2 :(得分:3)

TL;博士。赋值不是变量,而是归于内存中的特定位置。

这里的宏可以被认为只是替代它的使用。

#define GPIO_PORTF_DIR_R (*((volatile unsigned long *)0x40025400))
int main (void) {
  GPIO_PORTF_DIR_R = 0x0E;
...

可以改写为

int main (void) {
  (*((volatile unsigned long *)0x40025400)) = 0x0E;
...

这只是取消引用内存地址0x40025400并为其指定值0x0E。