如何将变量放在内存中的给定绝对地址(使用GCC)

RealView ARM C编译器支持使用at(address)的变量属性将变量放在给定的内存地址:

 int var __attribute__((at(0x40001000))); var = 4; // changes the memory located at 0x40001000 

GCC是否具有类似的变量属性?

我不知道,但你可以轻松地创建一个这样的解决方法:

 int *var = (int*)0x40001000; *var = 4; 

它不是完全相同的东西,但在大多数情况下是一个完美的替代品。 它适用于任何编译器,而不仅仅是GCC。

如果你使用GCC,我假设你也使用GNU ld (当然,这不是确定的)并且ld支持将变量放在你想要的任何地方 。

我想让联系人做这项工作很常见。

受@rib的回答启发,我将补充一点,如果绝对地址是针对某些控制寄存器的,我会在指针定义中添加volatile 。 如果它只是RAM,那没关系。

您可以使用节属性和ld 链接描述文件来定义该节的所需地址。 这可能比您的替代品更混乱,但它是一种选择。

您已回答了问题,在上面的链接中指出:

使用GNU GCC编译器,您可以仅使用指针定义来访问绝对内存位置。 例如:

 #define IOPIN0 (*((volatile unsigned long *) 0xE0028000)) IOPIN0 = 0x4; 

顺便说一句http://gcc.gnu.org/onlinedocs/gcc-4.5.0/gcc/Variable-Attributes.html#Variable%20Attributes

  extern const uint8_t dev_serial[12]; asm(".equ dev_serial, 0x1FFFF7E8"); /* or asm("dev_serial = 0x1FFFF7E8"); */ ... for (i = 0 ; i < sizeof(dev_serial); i++) printf((char *)"%02x ", dev_serial[i]);