Search code examples
cvariablesgccarmkeil

How to place a variable at a given absolute address in memory (with GCC)


The RealView ARM C Compiler supports placing a variable at a given memory address using the variable attribute at(address):

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

Does GCC have a similar variable attribute?


Solution

  • I don't know, but you can easily create a workaround like this:

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

    It's not exactly the same thing, but in most situations a perfect substitute. It will work with any compiler, not just GCC.

    If you use GCC, I assume you also use GNU ld (although it is not a certainty, of course) and ld has support for placing variables wherever you want them.

    I imagine letting the linker do that job is pretty common.

    Inspired by answer by @rib, I'll add that if the absolute address is for some control register, I'd add volatile to the pointer definition. If it is just RAM, it doesn't matter.