次のように指定された構造があります
- メンバー 1、16 ビット
- メンバー 2、32 ビット
- メンバー 3、32 ビット
ファイルから読み取るものです。ファイルから構造体に直接読み込みたい。
問題は、次の構造体宣言のために ARM Cortex M3 で作業しているため、C コンパイラが変数 m1、m2、および m3 を 32 ビットのワード境界に揃えることです。
typedef struct
{
uint16_t m1;
uint32_t m2;
uint32_t m3;
}something;
ファイルから直接読み取ると、m2 と m3 に間違った値が入力され、余分な 2 バイトも読み取られます。
私はハッキングして、現在問題なく動作する次のものを使用しています:
typedef struct
{
uint16_t m1;
struct
{
uint16_t lo;
uint16_t hi;
}m2;
struct
{
uint16_t lo;
uint16_t hi;
}m3;
}something;
ただし、これは非常に汚いハックのように見えます。コンパイラに m2 と m3 の半分を別の単語に強制するよりクリーンな方法を望みますが、最適ではないかもしれません。
arm-none-eabi-gcc を使用しています。ビット パッキングについては知っていますが、この最適化を回避できません。
編集:ビットパッキングについて十分に知らなかったことがわかりました:D