Ich habe eine 16-Bit-Variable data
, das heißt:Kann man auf endian-unabhängige Weise einen Zeiger auf das untere Byte bekommen?
volatile uint16_t data;
Ich brauche diesen Wert auf den Inhalt von zwei 8-Bit-Register auf einem externen Sensor basierend aufzufüllen. Auf diese wird über I2C/TWI zugegriffen.
Meine TWI Routine ist async * und hat die Unterschrift:
bool twi_read_register(uint8_t sla, uint8_t reg, uint8_t *data, void (*callback)(void));
Dieser Wert von reg
auf sla
in *data
liest, dann ruft callback()
.
Wenn ich wusste, dass die uint16_t
als, sagen wir, MSB LSB
im Speicher angeordnet wurde, dann könnte ich tun:
twi_read_register(SLA, REG_MSB, (uint8_t *)&data, NULL);
twi_read_register(SLA, REG_LSB, (uint8_t *)&data + 1, NULL);
aber ich weiß nicht wie Endian-Abhängigkeit in meinen Code zu backen. Gibt es einen Weg, dies endian-unabhängig zu erreichen?
(Nebenbemerkung: meine eigentliche Problemumgehung zur Zeit eine Struktur beinhaltet die Verwendung, das heißt:
typedef struct {
uint8_t msb;
uint8_t lsb;
} SensorReading;
aber ich bin neugierig, wenn ich es mit einem einfachen uint16_t
tun könnte)
EDIT
(* durch async ich meine split-phase, dh *data
wird zu einem bestimmten Zeitpunkt in der Zukunft festgelegt werden, an diesem Punkt wird der Angerufene über die callback
Funktion notified werden, wenn angefordert)
Warum wollen Sie sich beschränken wollen Wert Zeiger Zugriff auf den 16-Bit? Die meisten würden dies mit shift und add oder or oder operators machen. Wenn Sie es jedoch wirklich mit Zeigern machen möchten, könnten Sie Makros verwenden, die die Endian-Ness erkennen und kompensieren. –
Nein, kann nicht ... zuverlässig. Verwenden Sie eine Maske und verschieben Sie, wenn Sie zuverlässigen und tragbaren Code möchten. –
tatsächlich die Maske und die Verschiebung funktioniert auch nicht, oder? –