2017年10月3日火曜日

1byteを重複して分割する方法

こんにちは、2年制御長のヒロです。

今回はとうロボで使った通信用共用体の解説です。
マスタースレイブ間でのUSART通信時に1byte単位で送るのに情報圧縮をしよう、ということで共用体とビットフィールドを組み合わせて使ってみました。ここで1byteを場合に応じて、分割する領域を変える必要があったため、2つの構造体を使用しています。具体的なソースコードは以下のようになります。

typedef union air{
  unsigned char data:8;
  struct{
    unsigned char operate:3;
    unsigned char info:5;
  };
  struct{
    unsigned char invalid:3;/*operateと同じ内容使わない*/
    unsigned char num:4;/*個体識別番号*/
    unsigned char state:1;
  };
}air;


typedef union air{
  unsigned char data:8;
  struct{
    unsigned char operate:3;
    unsigned char info:5;
  };
  struct{
    unsigned char invalid:3;/*operateと同じ内容使わない*/
    unsigned char num:4;/*個体識別番号*/
    unsigned char state:1;
  };
}air;

dataは通信時に使用します。中身は後に出てくる二つの構造体に酔って変動します。oprerateは操作を指定するのに使用します。マクロで操作を記述しておくとさらに見やすくなります。infoはnumとstateを使用しない操作を指定したときにその分のビットをまとめてより情報量を多くするのに使いました。

構造体の性質上、識別子の名前からなんのデータを取り扱っているか分りやすい点、ビットフィールドを使うので桁あふれが起こらないという点で便利ですが、いちいち指定するのがめんどかったりします。ビット演算だけで行う方がいいかもしれません。

0 件のコメント: