47

Cortex-M4 マイクロコントローラーにいくつかのコードがあり、バイナリ プロトコルを使用して PC と通信したいと考えています。packed現在、GCC 固有の属性を使用してパックされた構造体を使用しています。

大まかな概要は次のとおりです。

struct Sensor1Telemetry {
    int16_t temperature;
    uint32_t timestamp;
    uint16_t voltageMv;
    // etc...
} __attribute__((__packed__));

struct TelemetryPacket {
    Sensor1Telemetry tele1;
    Sensor2Telemetry tele2;
    // etc...
} __attribute__((__packed__));

私の質問は:

  • MCU とクライアント アプリの構造体にまったく同じ定義を使用すると仮定するTelemetryPacketと、上記のコードは複数のプラットフォーム間で移植できますか? (私は x86 と x86_64 に興味があり、Windows、Linux、および OS X で実行する必要があります。)
  • 他のコンパイラは、同じメモリ レイアウトでパックされた構造体をサポートしていますか? どの構文で?

編集

  • はい、パックされた構造体が非標準であることは知っていますが、それらの使用を検討するのに十分便利なようです。
  • 私は C と C++ の両方に興味がありますが、GCC がそれらを異なる方法で処理するとは思いません。
  • これらの構造体は継承されず、何も継承しません。
  • これらの構造体には、固定サイズの整数フィールドと、他の同様のパックされた構造体のみが含まれます。(私は前にフロートでやけどをしたことがあります...)
4

9 に答える 9

-2

常にではない。別のアーキテクト プロセッサにデータを送信する場合、エンディアン、プリミティブ データ型などを考慮する必要があります。ThriftまたはMessage Packを使用することをお勧めします。そうでない場合は、代わりに自分で Serialize メソッドと DeSerialize メソッドを作成してください。

于 2017-07-18T10:29:42.960 に答える