如何将变量放在内存中的给定绝对地址(使用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]);