- ベストアンサー
I/Oレジスタアドレスを関数に引数として渡す方法
- C言語において、I/Oレジスタアドレスを関数に引数として渡す方法を知りたいです。
- 現在Renesas製RXマイコンでポート制御のプログラムを作成しています。I/Oポートレジスタの入出力設定を行っていますが、レジスタアドレスを引数として関数に渡し、関数内でレジスタ値を書き換える方法を教えてください。
- ポインタ型を使用して関数内でレジスタ値を書き換えようとしていますが、上手くいきません。初心者なので、解決方法を教えていただけると幸いです。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
組み込みだとちょっと違うところがあるかもしれませんが, 普通の C なら setPinMode(PORTA); はエラーにならないでしょう>#1. 実引数は (volatile な) unsigned char, 仮引数は uint32_t * と型は違いますが, ISO C では整数からポインタに変換できる (ただしその結果は未保証) ので, これに従う限りコンパイルは通ってしまいます. 親切なコンパイラなら警告くらいは出すかな? ただ, PORTA が unsigned char を期待するのに対し setPinMode が uint32_t を要求するのでこの関数自体が危険です. 例えば「8ビット幅のポートに 32ビットの値を書き込む」ようなことになったりするわけですが, このときハードウェア的にどう動くかはわかりません. とりあえず ・setPinMode(PORTA); を setPinMode(&PORTA); にする ・void setPinMode(uint32_t* portNumber) を void setPinMode(volatile unsigned char* portNumber) にする で動くかもしれません.
その他の回答 (1)
- kmee
- ベストアンサー率55% (1857/3366)
いつも言ってることですが 「『うまくいかない』の具体的内容は?」 「まずは、エラーメッセージをよく読みましょう」 PORTAの定義がそのままなら (*(volatile unsigned char *)0x0008C00A) というのは 0x0008C00A という数値を (volatile unsigned char *)型(volatileな unsigned char へのポインタ)と解釈 →それに * がついているので、ポインタが指す場所にあるデータ(volatileな unsigned char へのポインタが指す場所なので、volatileな unsigned char 型)になります。 void setPinMode(uint32_t* portNumber) に対して setPinMode(PORTA); // PORTAはunsigned char型) とすれば、もちろん、型が一致しません。 ・型をそろえる ・渡したいのはポインタ ・PORTAは実体であって、ポインタではない というあたりを落ち着いて考えれば解決できるはずです。 > ポインタってものが分かってない? そう思っているのなら、まずは、ポインタをマスターしましょう
お礼
>「まずは、エラーメッセージをよく読みましょう」 cubesuite+にてプログラムを作っているのですがエラーは出ていませんでした。 型を揃えていませんでした。 結局力不足で回答までたどり着けなかったので別の方法にて実装しました。 ありがとうございました。
お礼
ありがとうございました。無事点灯しました。因みに教えていただいた内容でやってみたのですが上手くいかず悩んでいましたが結局レジスタアドレスが違うというミスも犯していました。