Search code examples
c++cgccsystems-programming

What's the shortest code to write directly to a memory address in C/C++?


I'm writing system-level code for an embedded system without memory protection (on an ARM Cortex-M1, compiling with gcc 4.3) and need to read/write directly to a memory-mapped register. So far, my code looks like this:

#define UART0     0x4000C000
#define UART0CTL  (UART0 + 0x30)

volatile unsigned int *p;
p = UART0CTL;
*p &= ~1;

Is there any shorter way (shorter in code, I mean) that does not use a pointer? I looking for a way to write the actual assignment code as short as this (it would be okay if I had to use more #defines):

*(UART0CTL) &= ~1;

Anything I tried so far ended up with gcc complaining that it could not assign something to the lvalue...


Solution

  • I'd like to be a nitpick: are we talking C or C++ ?

    If C, I defer to Chris' answer willingly (and I'd like the C++ tag to be removed).

    If C++, I advise against the use of those nasty C-Casts and #define altogether.

    The idiomatic C++ way is to use a global variable:

    volatile unsigned int& UART0 = *((volatile unsigned int*)0x4000C000);
    volatile unsigned int& UART0CTL = *(&UART0 + 0x0C);
    

    I declare a typed global variable, which will obey scope rules (unlike macros).

    It can be used easily (no need to use *()) and is thus even shorter!

    UART0CTL &= ~1; // no need to dereference, it's already a reference
    

    If you want it to be pointer, then it would be:

    volatile unsigned int* const UART0 = 0x4000C000; // Note the const to prevent rebinding
    

    But what is the point of using a const pointer that cannot be null ? This is semantically why references were created for.