こんにちは、OSOSと申します。RA2 CPUを使った製品の開発を行っており、CPUの初期化機能を持った「ブートローダ」と製品に必要な機能を持った「アプリケーション」の2つのプログラムをあわせもった構成で開発を行っています。しかし、ブートローダからアプリケーションへのジャンプ処理の一部にうまくいかない箇所があり、困っております。問題としては、ブートローダからアプリケーションへジャンプする直前に、スタックポインタをFSPに含まれている「__set_MSP」関数を使って、スタックポインタのアドレスをアプリケーション用のアドレスへ移そうとしたところNMIのスタックポインタモニタエラーが発生するという状況です。参考として、実際に組んでいるコード例を以下に示します。
そもそも、NMIのスタックポインタモニタエラーの情報も RAのマニュアルを見ても不足して悩んでいる状況でもあります。上記について何か気になることがある方、あるいは、CortexMのスタックポインタモニタエラーについてご存じの方がいらっしゃいましたら、何でも構いませんのでご指摘いただけないでしょうか。なお、アプリケーション・ブートローダはそれぞれ単独で動作確認できており、また、スタックポインタのアドレスをあえて同じ値を「__set_MSP」関数で書き換えてもモニタエラーが発生します。このことから、設定したアドレスがおかしいというよりも スタックポインタの書き換え方に何か注意点があるのでは? と疑っているところです
OSOSです。> わわい様追加のご意見ありがとうございます。出張から帰ってこれたのでようやく皆様のご意見をもとに色々試すことができました。結論から言いますと、どうにか期待した通り、プログラムから別プログラムへの遷移ができるようになりました。
必要だったことは、スタックポインタの変更前に下記の一行が必須だったようでした。
「R_MPU_SPMON->SP[0].CTL = 0;」
ARMコアの特権モードなど色々設定を試してもなかなかうまくいかず…
OSOSです。皆様、早速のご指摘ありがとうございます。
いただいたコメントの一つ一つを確認していこうとしていたのですが、私のほうが今朝から突如開発を中断して出張することになってしまったので、プログラムの確認をできるのが数日後になってしまいそうです。
コメントいただけたこと本当に感謝しております。また落ち着いてから確認させていただきます。
> ほや 様海外コミュの情報ありがとうございます。ソースコードもあるようですので内容確認してみます。まさにブートローダ機能の箇所のARM資料もお教えいただいたのでちゃんと読んでみようと思います。
> tf 様わざわざ再現実験まで試していただき、ありがとうございます。実はブートローダと称する一つ目に起動するソフトウェアは、アップデート機能も持つためRAM上で動作するよう、デフォルトのFSPサンプルからリンカスクリプト周りを調整しています。tf様の環境で起きなかったということは、RAMに実行コードを移したことによる問題かもしれないと思って、そのあたりも見直してみようと思います。
> omuraisu49 様メモリサイズの都合上、ルネサスのMCUboot機能が使えないため頭から飛んでいましたが、たしかに一部の内容であれば参考になるかもしれないので読ませていただきます。情報ありがとうございます。
> わわい様ご指摘ありがとうございます。仰る通り、当初はスタック位置が変わることが原因とも思って、static変数でジャンプ先を指定するなども試してみたのですがうまくいかなかったです。アセンブリも一つずつ調べながら書いたところがあるので、やはりこの点ももう少し調べなおしてみようと思います。
わわいです
ちと蛇足ですが
このような場合、コンパイルオプションにアセンブルリストを出力するオプションがありますんで、その出力を確認し、また、統合開発環境(e2studio)で1命令ごとのステップ実行を行ってどこがどういう動作をしていくか確認することです
こういうイレギュラーなこと(関数中でのスタック変更)を行う場合は特に、コンパイラの実装で動作が変わる場合がありますんで、そこらへんをきっちり抑えておく必要があります