私は 16 ビット PIC 用のファームウェアに取り組んでおり、C (Microchip C30 コンパイラ) で書いています。デバイスが外部デバイスから長いバイト リストを受信し、それらのバイトを構造体にコピーしようとしています。構造は次のように定義されます。
typedef struct __attribute__((__packed__)) {
char F1Nickname[17];
char F2Nickname[17];
DWORD F1CurrentPos;
DWORD F2CurrentPos;
WORD F1CurrentTemp;
WORD F2CurrentTemp;
DWORD F1MaxPos;
DWORD F2MaxPos;
BYTE F1TempCompOn;
BYTE F2TempCompOn;
BYTE CheckSum;
} deviceStatus;
構造内の合計バイト数が奇数になると、プログラムがフリーズして AddressError サービス ルーチンに引っかかるという奇妙な問題がありました。構造体に余分なバイトを追加するだけで問題を解決できますが、それは応急処置のようです。
コンパイラが変数の間にフィラー バイトを挿入しないようにしたかったので、packed 属性を構造体に配置しました。その場合、受信した文字配列からコピーすると、構造体の値が正しくなくなります。
また、aligned という属性があることも知っています。整列は構造体の先頭を偶数バイトに整列させるだけですか、それとも構造体のすべての項目を偶数バイトに整列させますか? ここで、aligned 属性が必要だと思いますか? この構造体にaligned属性を追加する場合、データを送信しているデバイスの構造体にも追加する必要がありますよね? 現時点では、どちらも上記とまったく同じ方法で定義されています。
整列された属性を追加する場合、packed 属性を削除する必要がありますか? 彼らは基本的に反対のことをしていませんか?