3

このコードは、Microchip社のPIC32MXマイクロプロセッサ用です。彼らのコンパイラは本質的にGCC3.4です。

私はGCCの__packed__属性を使用してビットフィールドをユニオンにパックし、後でunsigned charSPIまたはI2Cを介して送信するための(つまり、型のパンニング)としてそれらを取得する傾向があります。この動作はすべて私の実装によって定義されており、完全に機能します。私はこれを100行ほどのマスキングとシフトよりも好みます:)

私の質問は:__packed__以下のコードに冗長な属性がありますか?一見、トップレベルの組合員は免除できると思いますが、よくわかりません。または、ネストされた構造体でそれらを除外できますか?

// Remember that bitfields cannot straddle word boundaries!
typedef struct
{
    /// Some flag #1
    unsigned FlagOne            : 1 __attribute__((packed));
    /// Some flag #2
    unsigned FlagTwo            : 1 __attribute__((packed));
    /// A chunk of data
    unsigned SomeData           : 5 __attribute__((packed));

    // and so on, maybe up to 32 bits long depending on the destination

} BlobForSomeChip;

/// This kind of type-punning is implementation defined. Read Appendix A (A7, A12) of
/// the MPLAB C Compiler for PIC32 MCUs manual.
typedef union
{
    /// Access the members of this union to set flags, etc
    BlobForSomeChip blobdata __attribute__((packed));

    /// As a byte for sending via SPI, I2C etc
    unsigned char bytes[4] __attribute__((packed));

} BlobData;
4

1 に答える 1

2

まず、でコンパイルすることをお勧めし-Wallます。

今:

  1. BlobForSomeChip構造体には7ビットが宣言されています。通常、アラインメントのために4バイトの長さになりますが、パックされた属性を使用すると、1バイトの長さになります。
  2. unsigned char[4]梱包できません。何があっても、常に4バイトの長さになります。

要するに:

  1. struct BlobForSomeChip=1バイト
  2. unsigned char[4]=4バイト
  3. BlobData= 4バイト(最大のメンバーのサイズ)。

結論として、のパックされた属性BlobDataは必要ありません。GCCは、使用されている場合は単にそれらを無視します-を使用して出力を参照してください-Wall

于 2010-08-26T02:00:21.290 に答える