
C言語について質問があるので投稿させていただきました。
現在Renesas製 RXマイコンにてポート制御のプログラムを作成しています。
そこで一点分らない点がありましたのでご教授いただければ幸いです。
現在I/Oポートレジスタの入出力設定を行っています。
レジスタ値を書き換えるだけであれば下記の通りかと思います。
#define PORTA (*(volatile unsigned char *)0x0008C00A)
PORTA = 0x01;
レジスタアドレスを引数として関数に渡し関数内でレジスタ値を書き換えるにはどうすれば
よろしいでしょうか。
void main(void)
{
setPinMode(PORTA);
PORTA.PODR.BIT.B0 = 0x01;
while(1);
}
void setPinMode(uint32_t* portNumber)
{
*portNumber = 0x01;
}
としていますが上手くいきません。
型がおかしい?
ポインタってものが分かってない?
など色々考えてはみたのですが何分初心者なので解決に至っておりません。
よろしければご教授の程よろしくお願いいたします。
No.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) にする
で動くかもしれません.
ありがとうございました。無事点灯しました。因みに教えていただいた内容でやってみたのですが上手くいかず悩んでいましたが結局レジスタアドレスが違うというミスも犯していました。
No.1
- 回答日時:
いつも言ってることですが
「『うまくいかない』の具体的内容は?」
「まずは、エラーメッセージをよく読みましょう」
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+にてプログラムを作っているのですがエラーは出ていませんでした。
型を揃えていませんでした。
結局力不足で回答までたどり着けなかったので別の方法にて実装しました。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語のポインタに直接アドレス...
-
init関数の意味
-
コンストラクタでnewを失敗した...
-
Run-Time Check Failure #3とい...
-
ハンドルはポインタか
-
CopyMemory()をmemcpy()に書き...
-
戻り値で構造体を返すことは可...
-
関数の引数をvoid*でキャストする
-
VB6でのgethostbyaddrの使用方...
-
NULLポインタが0でない処理系と...
-
ハンドル、アドレス、ポインタ...
-
CWnd::EnableWindow()の扱い方
-
アドレス値はどの型にキャスト...
-
基本アルゴリズムの『返す』の...
-
fopne で失敗する原因
-
構造体を値で渡す良い点はあり...
-
参照型で受け取った引数をポイ...
-
アプリを32bitから64bit移行
-
スコープ外でのアドレスの参照...
-
c言語で任意のファイルから読み...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語のポインタに直接アドレス...
-
init関数の意味
-
セグメントエラー
-
Run-Time Check Failure #3とい...
-
ExcelVBAでのkernel32(64bit)
-
戻り値で構造体を返すことは可...
-
fopne で失敗する原因
-
参照型で受け取った引数をポイ...
-
トリプルポインタが必須!とな...
-
ハンドルはポインタか
-
LPSTR型の初期化について
-
ポインターの使用法や利点
-
ポインタについて
-
c言語で任意のファイルから読み...
-
基本アルゴリズムの『返す』の...
-
コンストラクタでnewを失敗した...
-
ハンドル、アドレス、ポインタ...
-
アプリを32bitから64bit移行
-
デバイスハンドルとは?
-
NULLとブランクの違い
おすすめ情報