了解嵌入式系统中指针的使用

时间:2014-03-25 11:08:07

标签: c pointers embedded

以下是代码的一部分:

#define GPIO_PORTF_DATA_BITS_R  ((volatile unsigned long *)0x40025000)
#define LED_BLUE 0x04
#define LED_GREEN 0x08
#define LED_RED 0x02

GPIO_PORTF_DATA_BITS_R[LED_BLUE | LED_GREEN | LED_RED] = (LED_GREEN | LED_RED)

由于我对指针的了解很少,它相当于

volatile unsigned long *p = 0x40025400;
p[0x0E] = 0x0A;

如果我是正确的,那么p [0x0E]是什么意思或在这里做什么?

2 个答案:

答案 0 :(得分:3)

在C中,索引运算符[]具有以下语义:a[b]表示*(a + b),因此a {{1}必须评估到一个地址。

因此,您的示例意味着b,即它访问一个寄存器,该寄存器与0x40025400处的基址相距偏移0xe * *(0x40025400 + 0xe) = 0xa。缩放是因为指针指向sizeof (unsigned long),并且指针算术总是按指向的类型的大小进行缩放。

答案 1 :(得分:0)

同意@Lundin。定义LED_BLUE, LED_GREEN, LED_RED都是2的幂和LED控制通常只需要一点点开启或关闭暗示这些定义是掩码。

建议您需要以下内容。

void LED_Red_On(void) {
  *GPIO_PORTF_DATA_BITS_R |= LED_RED;
}

void LED_Green_Off(void) {
  *GPIO_PORTF_DATA_BITS_R &= ~((unnsigned long)LED_GREEN);
}

...