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