I、すなわち、data
16ビット変数がある:エンディアンに依存しない方法で下位バイトへのポインタを取得できますか?
volatile uint16_t data;
Iは、外部センサ上の2つの8ビット・レジスタの内容に基づいて、この値を移入する必要があります。これらはI2C/TWIを介してアクセスされます。
マイTWIルーチンは非同期*で、署名を持っています
bool twi_read_register(uint8_t sla, uint8_t reg, uint8_t *data, void (*callback)(void));
これは、*data
にsla
上reg
の値を読み取り、その後callback()
を呼び出します。
私はuint16_t
が、私は何ができる、MSB LSB
、たとえば、などのメモリに配置されていた知っていた場合は、次の
twi_read_register(SLA, REG_MSB, (uint8_t *)&data, NULL);
twi_read_register(SLA, REG_LSB, (uint8_t *)&data + 1, NULL);
しかし、私は自分のコードにエンディアン依存性を焼く好きではありません。これをエンディアンに依存しない方法で実現する方法はありますか?
(サイドノート:現時点での私の実際の問題を回避するには、構造体を使用することを含む、すなわち:
typedef struct {
uint8_t msb;
uint8_t lsb;
} SensorReading;
が、私はシンプルuint16_t
でそれを行うことができれば、私は好奇心が強い)
EDIT
(* asyncはスプリットフェーズを意味します。つまり、将来、ある時点で*data
が設定されます。要求された場合、callback
関数を介して着信通知が通知されます)
は、なぜあなたは16ビット値へのアクセスをポインタに自分自身を制限したいですか?ほとんどの人はshiftとaddまたはor演算子でこれを行います。しかし、実際にポインタでそれをやりたければ、エンディアンを検出し補うマクロを使用することができます。 –
いいえ、信頼できません。信頼性と移植性の高いコードが必要な場合は、マスクとシフトを使用してください。 –
実際にはマスクとシフトがうまくいきませんか? –