Hola,
tengo estos macros:
#define LEDS *((volatile uint32_t *) 0x00010000)
#define BUTTONS *((volatile uint32_t *) 0x00010004)
perfecto, sirve para poder leer y escribir en esas posiciones, por ejemplo, puedo hacer:
LEDS = ~BUTTONS;
Anda perfecto, siguiente, querría dado:
#define SEQUENCER *((volatile uint32_t *) 0x00010030)
poder hacer algo así como:
uint32_t idx= 0;
SEQUENCER[idx] = 0x1;
++idx;
SEQUENCER[idx] = 0x7;
++idx;
SEQUENCER[idx] = 0x2;
pero mi conocimiento de C es en el mejor de los casos intermedio y de punteros y casting, no hace falta que diga nada...
Plan B:
Luego, pensando un poquito llegué a que esto podría funcionar:
*((volatile uint32_t *) 0x00010030 ) = 0x3;
*((volatile uint32_t *) 0x00010030 + 1) = 0x3;
*((volatile uint32_t *) 0x00010030 + 2) = 0x3;
*((volatile uint32_t *) 0x00010030 + 3) = 0x3;
pero se pierde la homogeneidad con el resto del código y queda ese número hardcodeado.
Plan C,
una variante, probablemente la mejor:
#define SEQUENCER 0x00010030
*((volatile uint32_t *) SEQUENCER ) = 0x3;
*((volatile uint32_t *) SEQUENCER + 1) = 0x3;
*((volatile uint32_t *) SEQUENCER + 2) = 0x3;
*((volatile uint32_t *) SEQUENCER0 + 3) = 0x3;
.
Plan D:
Luego, pensando un poquito más, horrible, IDX es global y no hay indicación en la sintaxis de que esté recorriendo una array:
uint32_t IDX = 0;
#define SEQUENCER *((volatile uint32_t *) 0x00010030 + IDX)
SEQUENCER = 0x3;
++IDX;
SEQUENCER = 0x7;
Los Planes B en adelante compilan, no sé si realmente funcionan pues aún no hice el hardware, pero bueno, apostemos a que sí.
Entiendo que tendría que prestar especial atención
si va de uno en uno o de cuatro en cuatro, pero eso vendrá luego..
Si alguien me tirara alguna pista u opinión, le estaría muy agradecido. Debe haber un patrón para esto pero no sé qué palabras usar para buscarlo.
Estas son las variantes que he probado para el Plan A:
programs/fulldemo/../memmap.h:13:21: error: invalid type argument of unary '*' (have 'uint32_t' {aka 'long unsigned int'})
13 | #define SEQUENCER *((volatile uint32_t *) 0x00010030)
programs/fulldemo/main.c:234:11: note: in expansion of macro 'SEQUENCER'
234 | SEQUENCER[sequencer_size] = 0x1;
| ^~~~~~~~~
programs/fulldemo/../memmap.h:13:21: error: invalid type argument of unary '*' (have 'uint32_t' {aka 'long unsigned int'})
13 | #define SEQUENCER *((volatile uint32_t *) 0x00010030)
programs/fulldemo/main.c:235:12: note: in expansion of macro 'SEQUENCER'
235 | *SEQUENCER[sequencer_size] = 0x1;
| ^~~~~~~~~
programs/fulldemo/main.c:236:12: error: invalid type argument of unary '*' (have 'uint32_t' {aka 'long unsigned int'})
236 | (*SEQUENCER)[sequencer_size] = 0x1;
In file included from programs/fulldemo/main.c:19:
programs/fulldemo/../memmap.h:13:21: error: invalid type argument of unary '*' (have 'uint32_t' {aka 'long unsigned int'})
13 | #define SEQUENCER *((volatile uint32_t *) 0x00010030)
programs/fulldemo/main.c:237:11: note: in expansion of macro 'SEQUENCER'
237 | SEQUENCER[sequencer_size] = 0x1;
| ^~~~~~~~~
programs/fulldemo/main.c:238:38: error: lvalue required as left operand of assignment
238 | SEQUENCER + sequencer_size = 0x1;
| ^
programs/fulldemo/main.c:239:40: error: lvalue required as left operand of assignment
239 | (SEQUENCER + sequencer_size) = 0x1;
| ^
programs/fulldemo/main.c:240:12: error: invalid type argument of unary '*' (have 'uint32_t' {aka 'long unsigned int'})
240 | (*SEQUENCER + sequencer_size) = 0x1;
programs/fulldemo/main.c:241:12: error: invalid type argument of unary '*' (have 'uint32_t' {aka 'long unsigned int'})
241 | (*(SEQUENCER) + sequencer_size) = 0x1;
| ^~~~~~~~~~~~
programs/fulldemo/main.c:242:11: error: invalid type argument of unary '*' (have 'uint32_t' {aka 'long unsigned int'})
242 | *(SEQUENCER + sequencer_size) = 0x1;
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Gracias y saludos