Estoy escribiendo un código de sistema para un sistema integrado sin protección de memoria (en un ARM Cortex-M1, compilando con gcc 4.3) y necesito leer/escribir directamente en un registro mapeado en memoria. Hasta ahora, mi código es el siguiente:¿Cuál es el código más corto para escribir directamente en una dirección de memoria en C/C++?
#define UART0 0x4000C000
#define UART0CTL (UART0 + 0x30)
volatile unsigned int *p;
p = UART0CTL;
*p &= ~1;
¿Hay alguna forma más corta (más corta en el código, quiero decir) que no utiliza un puntero? Yo buscando una manera de escribir el código de asignación real tan corto como este (que estaría bien si tuviera que usar más #defines):
*(UART0CTL) &= ~1;
Cualquier cosa que probado hasta ahora terminó con gcc quejándose de que pudiera no asigna algo a la lvalue ...
'#define UART0CT' a' #define X'? –
@The Machine Charmer: +1, gracioso. No creo que el OP significase más corto en una moda de código de golf, pero, bueno. :-) –
El estándar C * requiere * un molde explícito en ordetr para asignar un entero distinto de cero al puntero. Su código, en su forma actual, solo es válido en GCC, pero está roto desde el pedante punto de vista C. Por lo tanto, lo quiera o no, tendrá que alargarlo si realmente desea mantenerlo como válido C. Por supuesto, si desea una solución específica de GCC, es una historia diferente. – AnT