c++ - 指针数组,如 (*(volatile unsigned long *)0x40004000)

标签 c++ c gcc

我很难弄清楚如何解决以下问题。我在一个内存很少的嵌入式系统上,想尽量减少内存使用。 指针总是让我感到困惑,而且将永远如此。

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

#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 编译我的代码。

如有任何见解,我们将不胜感激。

最佳答案

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

typedef volatile unsigned long* reg_addr;

reg_addr registers[] = {
  &GPIO_PORTA_BASE,
  &GPIO_PORTB_BASE,
  // ...
};

我们需要再次获取地址 (&GPIO_PORTA_BASE),因为宏会自动解除对它们的引用。访问方式:

*registers[i] &= your_value;

关于c++ - 指针数组,如 (*(volatile unsigned long *)0x40004000),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8204405/

相关文章:

c++ - R包错误错误: ‘std::Rf_beta’ has not been declared #define beta Rf_beta

c++ - 数组的加减法

使用 lambda 的 C++ 回调因 bad_function_call 而失败

c++ - 如何在C++中动态更新UTextureRenderTarget2D?

c - 跨平台 C 应用程序的 UTF8 支持

c - 在构建时声明指针结构

gcc - 如何更改 Cygwin 终端中使用的语言?

c++ - 在 C++ 中将 std::wstring 写入文件的多平台方法

c - 在 C 中用其对应的字符串替换预定义的整数

ios - 在 iOS 应用程序中的 fgets 上获取 EXC_BAD_ACCESS