【发布时间】:2011-11-20 20:19:15
【问题描述】:
我很难弄清楚如何解决以下问题。我在一个内存很少的嵌入式系统上,并希望最大限度地减少内存使用量。 指针总是让我很困惑,而且永远都会这样做。
我有一大堆寄存器地址的定义:
#define GPIO_PORTA_BASE (*((volatile unsigned long *)0x40004000))
#define GPIO_PORTB_BASE (*((volatile unsigned long *)0x40005000))
//etc..
这些寄存器可以直接访问。例如:
GPIO_PORT_BASE &= 0x01;
我需要的是一个包含上述寄存器的数组,以便我可以轻松地将它们映射到索引。例如:
not_sure_what_to_declare_the array_as port_base_array[] {
GPIO_PORTA_BASE,
GPIO_PORTB_BASE,
//etc
}
我最终需要做的是这样的事情:
volatile unsigned long *reg;
*reg_a = port_base_array[0];
reg_a &=0x1;
我正在使用 gcc 为 arm cortex m3 编译代码。
任何见解将不胜感激。
【问题讨论】:
-
到底是什么问题?
-
...问题很清楚。他试图将
(*((volatile unsigned long *)0x40004000))放入一个数组中。有什么难理解的? -
附注:在开始使用
volatile之前,请阅读this,这表明编译器优化器无法正确处理 volatile 并且存在潜在危险。即使在 linux 内核中也是frowned upon。还有丹尼斯·里奇本人didn't like it。