Ho un 16 bit variabile data
, cioè:È possibile ottenere un puntatore al byte inferiore in modo indipendente dall'endian?
volatile uint16_t data;
ho bisogno per completare questo valore in base al contenuto di due registri a 8 bit su un sensore esterno. Questi sono accessibili tramite I2C/TWI.
mio TWI di routine è asincrona *, ed ha la firma:
bool twi_read_register(uint8_t sla, uint8_t reg, uint8_t *data, void (*callback)(void));
Questa legge il valore di reg
su sla
in *data
, poi chiama callback()
.
se conoscessi la uint16_t
è stato organizzato in memoria come, ad esempio, MSB LSB
, quindi ho potuto fare:
twi_read_register(SLA, REG_MSB, (uint8_t *)&data, NULL);
twi_read_register(SLA, REG_LSB, (uint8_t *)&data + 1, NULL);
Tuttavia, non mi piace la cottura dipendenza endian nel mio codice. C'è un modo per raggiungere questo in modo indipendente dall'endian?
(nota a margine: la mia soluzione effettiva al momento comporta l'uso di una struttura, cioè:
typedef struct {
uint8_t msb;
uint8_t lsb;
} SensorReading;
ma io sono curioso di sapere se ho potuto farlo con un semplice uint16_t
)
EDIT
(* per asincrono intendo split-phase, ovvero *data
verrà impostato in futuro, a quel punto il callee verrà notificato tramite la funzione callback
se richiesto)
Perché vuoi per vincolare a voi stessi di puntatore accesso al valore a 16 bit? La maggior parte lo farebbe con shift e add o o operatori. Tuttavia, se si vuole veramente farlo con i puntatori, è possibile utilizzare macro che rilevano e compensano l'endianità. –
No non puoi ... affidabile. Utilizzare una maschera e spostare se si desidera codice affidabile e portatile. –
in realtà neanche la maschera e il turno funzionano, vero? –