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