¿Es posible acceder genéricamente a los registros semánticamente conectados?

0

Tengo un módulo SPI que tiene una función de inicializador:

static volatile uint8_t *registerOut, *registerIn, *registerDir;
static uint8_t clock, dataIn, dataOut;

void SpiInit(volatile uint8_t *pRegisterOut, volatile uint8_t *pRegisterIn,
             volatile uint8_t *pRegisterDir, uint8_t pClock, uint8_t pDataIn,
             uint8_t pDataOut)
{
    registerOut = pRegisterOut;
    registerIn = pRegisterIn;
    registerDir = pRegisterDir;

    clock = pClock;
    dataIn = pDataIn;
    dataOut = pDataOut;

    /* access registers */
    *registerOut |= (1<<dataOut) | (1<<clock); /* set dataOut pin and clock as output */

    /* etc. */
}

Un ejemplo de llamada se vería así:

SpiInit(&PORTB, &PINB, &DDRB, PB2, PB1, PB0);

Ahora me pregunto si hay una manera de no tener que pasar todos los registros que están conectados semánticamente ( PORTB , PINB y DDRB ). Me gustaría pasar solo una referencia PORTx y de alguna manera derivar a sus registros conectados PINx y DDRx .

    
pregunta arminb

2 respuestas

0

Concatenación del preprocesador.

#define PORTREGS(let) &PORT ## let, &PIN ## let, &DDR ## let

 ...

SpiInit(PORTREGS(B), PB2, PB1, PB0);
    
respondido por el Ignacio Vazquez-Abrams
0

Pasa un índice a una matriz de struct{volatile uint8_t *registerOut, *registerIn, *registerDir;} en su lugar.

Luego, la llamada se convierte en SpiInit(SPIB, PB2, PB1, PB0); , donde SPIB es su propia constante, que es el índice de la entrada con {&PORTB, &PINB, &DDRB}

    
respondido por el ratchet freak

Lea otras preguntas en las etiquetas