====== 共用体の応用 ======
前回までに構造体、共用体、ビットフィールドの使い方を見てきましたが、今回は共用体の実際のプログラムでの主な使われ方を見ていきましょう。
みなさんはマイコンのレジスタをいじるときに"."演算子を使ったのは覚えてますか。ポートが入力か出力かを設定するときのやつです。たとえば、SH7125ならこんな風なコードを最初に書きますよね。
PFC.PAIORL.WORD = 0xffff; //ポートAすべてを出力に
PFC.PAIORL.BYTE.H = 0xff; //ポートAの上位BYTEを入力に = 8から15ビットまでを入力に (こんな書き方できるの知ってた?)
PFC.PAIORL.BIT.B7 = 0; //ポートAの7ビット目を入力に
PFC.PAIORL.BIT.B8 = 0; //ポートAの8ビット目を入力に
PFC.PAIORL.BIT.B5 = 0; //ポートAの5ビット目を入力に
このときにポートAのレジスタを一気に設定するWORDと一つずつ設定するBITがあるわけですが、これっていったいどんな仕組みになっているんでしょうかね。次の共用体を見てください。これはFEWで自動生成されるiodefine.hの一部です。この話がわかるとiodefine.hをのぞくことで、どうやってレジスタをいじればいいかがわかるようになります。(まあ、データシートも見ないとだめですけど)
union { /* PAIORL */
unsigned short WORD; /* Word Access */
struct { /* Byte Access */
unsigned char H; /* High */
unsigned char L; /* Low */
} BYTE; /* */
struct{ /* Bit Access */
unsigned char B15:1; /* Bit 15 */
~~~~~~~~一部省略、理系ならわかるよね~~~~~~~~
unsigned char B1 :1; /* Bit 1 */
unsigned char B0 :1; /* Bit 0 */
} BIT; /* */
} PAIORL; /* */
この共用体がタネです。共用体というのはデータの格納場所を共有するわけですよね。ビットフィールドで作った1bitの変数16コと、1byteの変数(unsignede char)2つと2byte(unsignede short)の変数って同じデータの幅を持っているわけです。だから、どれかに値を代入したら、他のメンバーの値も変わってしまうという共用体の性質をうまく利用しているわけです。ここで一つ重要なことでリトルエンディアンとかビッグエンディアンとか言う言葉があるということを覚えておいてください。これは何かというと、ビットフィールドの変数が下位ビットから代入されるか、それとも上位ビットから代入されるかということです。詳しくは自分で調べてください。