0

次のパケット ヘッダーの C++ コードを作成する必要がありました。

元画像リンク、上記JPEGのPNG版。

上記のパケット形式用に私が書いた構造体コードを次に示します。uint8_t または uint16_t ビット フィールドが正しいかどうかを知りたい

    struct TelemetryTransferFramePrimaryHeader
    {
        //-- 6 Ocets Long --//

        //-- Master Channel ID (2 octets)--//
        uint16_t TransferFrameVersionNumber : 2;
        uint16_t SpacecraftID : 10;
        uint16_t VirtualChannelID : 3;
        uint16_t OCFFlag : 1;

        //-----------------//

        uint8_t MasterChannelFrameCount;
        uint8_t VirtualChannelFrameCount;

        //-- Transfer Frame Data Field Status (2 octets) --//

        uint16_t TransferFrameSecondaryHeaderFlag : 1;
        uint16_t SyncFlag : 1;
        uint16_t PacketOrderFlag : 1;
        uint16_t SegmentLengthID : 2;
        uint16_t FirstHeaderPointer : 11;

        //-----------------//

    };

LSB -> MSB が struct に確実に保持されるようにするにはどうすればよいですか?

私は混乱し続け、読んでみましたが、さらに混乱してしまいました。

PS: 私は 32 ビット プロセッサを使用しています。

4

3 に答える 3

5

ビット フィールドを使用するときにビットがどのようにマッピングされるかは、実装によって異なります。そのため、正確な CPU とコンパイラ (およびもちろんコンパイラのバージョン) を知る必要があります。

要するに; これをしないでください。このような場合、ビット フィールドはあまり使用できません。

代わりに、必要に応じて単語を宣言し、その中にビットを設定して、手動で行います。

于 2014-07-11T12:52:15.393 に答える
2

このように構築しようとする人は誰でもstruct罪の状態にあります。

たとえば、C99 標準には次のように記載されています。

実装では、ビットフィールドを保持するのに十分な大きさのアドレス指定可能なストレージ ユニットを割り当てることができます。十分なスペースが残っている場合、構造内の別のビットフィールドの直後に続くビットフィールドは、同じユニットの隣接するビットにパックされます。十分なスペースが残っていない場合、収まらないビットフィールドを次のユニットに配置するか、隣接するユニットとオーバーラップするかは実装定義です。ユニット内のビットフィールドの割り当て順序 (上位から下位、または下位から上位) は実装定義です。アドレス可能なストレージ ユニットのアラインメントは指定されていません。

コンパイラが (たとえば) uint32_t の単位でビット フィールドを構築し、フィールドが最初のフィールド LS ビットに配置されていると予測できたとしても、対処すべきエンディアン性はまだあります。

だから...アンワインドが言うように...手でやってください!

于 2014-07-11T13:01:15.503 に答える
1

これを行うべきではないことに同意します。ただし、STMicroelectronics はビットフィールドを使用して Cortex-M3/M4 マイクロコントローラ レジスタのビットにアクセスします。そのため、ユーザーが STMicroelectronics Cortex-M3/M4 ライブラリを使用できるようにするコンパイラ ベンダーは、最下位ビットから始まるビットフィールドの割り当てをサポートする必要があります。私のコンパイラではこれがデフォルトですが、オプションでもあるため、必要に応じて逆にすることもできます。

于 2014-07-11T15:30:10.753 に答える