こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

指定アドレスにジャンプさせたい場合【C言語】

こんにちわ。
この度、初めてOK Waveから質問させて頂きます。どうぞ宜しくお願い致します。

現在、ルネサス製RX62Nを使ったマイコンボードを使用して、C言語によりプログラムを組んで様々な動作をさせているのですが、「RX62N内部のFlashROMの指定したアドレスにジャンプさせる方法」がうまくいかず、どなたか良い方法を教えて頂きたいと思います。

具体的には、変数Aに格納した値(32bit)をアドレスとして扱い、そのアドレスにジャンプしたいと考えています。

以前、他のかたの質問の回答で、
 typedef void (*FN_PROGRAM)(void);
 FN_PROGRAM pg = (FN_PROGRAM)0x20000000;
 (*pg)();
という記述方法で20000000番地にジャンプできると記載があったため、早速、アドレスを0xFFFC0000に変更して動作させてみたところ、0xFFFC0000番地にジャンプさせる事ができ、大いに役に立ちました。

今回、私の方では、始めから0xFFFC0000番地と決め打ちせず、色々と計算をした後、最終的に決まったアドレスを変数Aに格納し、その格納した値をアドレスとして扱い、そこにジャンプさせる方法をとりたいと考えています。

お手数ですが、上記方法で、良い記述方法があればアドバイス頂けないでしょうか。できれば、使う変数Aの宣言文から教えて頂けると有難いと考えています。
説明が下手で申し訳ありません。C言語初心者ですので皆さまから色々とアドバイス頂けると助かります。よろしくお願い致します。、

投稿日時 - 2012-03-21 12:01:15

QNo.7374991

困ってます

質問者が選んだベストアンサー

手元に実行確認できる環境がないので、下記方法で試してみてください。

要は、計算結果を関数のエントリーアドレスにキャストしてしまえば良いだけだと思います。

なので、
unsigned long func_adr;

などを定義して、飛ばすべきアドレスを計算し、以前の方が教えていただいた様なキャストを使って、

FN_PROGRAM pg = (FN_PROGRAM)func_adr;

で、pgに関数の計算したエントリーアドレスを渡してあげれば出来ると思います。



ただし、アドレス計算で予期しない計算結果になった時に、確実に暴走しますので、

FN_PROGRAM pg[] = { …

と、関数のエントリポイントの配列を定義し、予め用意されているライブラリ分だけ、アドレスを登録しておいて、計算結果によって引数が決まる様な方法もあります。


面倒くさかったら、計算結果をswitch分で分岐させて、計算結果に応じた関数(予めエントリーアドレスを定義した関数名。ライブラリ分全部定義しておく。)に飛ばしてしまう、という方法もあります。多分、これが一番Debugが楽、かつ、コードが読みやすいのではないかと思います。


ご参考に。

投稿日時 - 2012-03-21 12:28:47

お礼

KEIS050162さん、早速のご回答ありがとうございました。
アドバイス頂いた、「unsigned long func_adr」で宣言しておいて「FN_PROGRAM pg = (FN_PROGRAM)func_adr;」と書き換える方法で、計算して求めたアドレスに無事ジャンプする事ができました。

最初、「typedef void (*FN_PROGRAM)(void);」と「FN_PROGRAM pg = (FN_PROGRAM)func_adr;」の2行を、関数に入る前の宣言文のところに記述していたため、コンパイルエラーが発生しましたが、この2行を関数の中に記述するようにしたところエラーがなくなり、func_addrに格納しておいたアドレスへジャンプする事ができました。

この度はアドバイス頂き大変たすかりました。有難うございました。C言語の初心者なので今後も何かと質問を載せる事があるかと思いますが、今後もしご覧になられる機会があればぜひアドバイスのほどよろしくお願いします。

投稿日時 - 2012-03-21 15:03:12

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(1)

あなたにオススメの質問