我很难搞清楚如何解决以下问题.我在一个内存非常少的嵌入式系统上,希望最大限度地减少内存使用量.指针总是让我感到困惑,并且总会这样做.
我有一大堆寄存器地址定义:
#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的代码.
任何见解将不胜感激.
我不知道为什么@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)