指针数组(*(volatile unsigned long*)0x40004000)

rob*_*ant 9 c c++ gcc

我很难搞清楚如何解决以下问题.我在一个内存非常少的嵌入式系统上,希望最大限度地减少内存使用量.指针总是让我感到困惑,并且总会这样做.

我有一大堆寄存器地址定义:

#define GPIO_PORTA_BASE      (*((volatile unsigned long *)0x40004000))
#define GPIO_PORTB_BASE      (*((volatile unsigned long *)0x40005000))
//etc..
Run Code Online (Sandbox Code Playgroud)

这些寄存器可直接访问.例如:

GPIO_PORT_BASE &= 0x01;
Run Code Online (Sandbox Code Playgroud)

我需要的是一个包含上述寄存器的数组,以便我可以轻松地将它们映射到索引.例如:

not_sure_what_to_declare_the array_as port_base_array[] {
   GPIO_PORTA_BASE,
   GPIO_PORTB_BASE,
   //etc
}
Run Code Online (Sandbox Code Playgroud)

我最终需要做的是这样的事情:

volatile unsigned long *reg;
*reg_a = port_base_array[0];
reg_a &=0x1;
Run Code Online (Sandbox Code Playgroud)

我正在使用gcc来编译arm cortex m3的代码.

任何见解将不胜感激.

Xeo*_*Xeo 9

我不知道为什么@Etienne删除了他的答案,但它包含了基本信息:地址被转换为volatile unsigned long *.这就是你需要的数组.

typedef volatile unsigned long* reg_addr;

reg_addr registers[] = {
  &GPIO_PORTA_BASE,
  &GPIO_PORTB_BASE,
  // ...
};
Run Code Online (Sandbox Code Playgroud)

我们需要再次获取地址(&GPIO_PORTA_BASE),因为宏会自动取消引用它们.访问:

*registers[i] &= your_value;
Run Code Online (Sandbox Code Playgroud)