こんにちは、OSOSと申します。RA2 CPUを使った製品の開発を行っており、CPUの初期化機能を持った「ブートローダ」と製品に必要な機能を持った「アプリケーション」の2つのプログラムをあわせもった構成で開発を行っています。しかし、ブートローダからアプリケーションへのジャンプ処理の一部にうまくいかない箇所があり、困っております。問題としては、ブートローダからアプリケーションへジャンプする直前に、スタックポインタをFSPに含まれている「__set_MSP」関数を使って、スタックポインタのアドレスをアプリケーション用のアドレスへ移そうとしたところNMIのスタックポインタモニタエラーが発生するという状況です。参考として、実際に組んでいるコード例を以下に示します。
そもそも、NMIのスタックポインタモニタエラーの情報も RAのマニュアルを見ても不足して悩んでいる状況でもあります。上記について何か気になることがある方、あるいは、CortexMのスタックポインタモニタエラーについてご存じの方がいらっしゃいましたら、何でも構いませんのでご指摘いただけないでしょうか。なお、アプリケーション・ブートローダはそれぞれ単独で動作確認できており、また、スタックポインタのアドレスをあえて同じ値を「__set_MSP」関数で書き換えてもモニタエラーが発生します。このことから、設定したアドレスがおかしいというよりも スタックポインタの書き換え方に何か注意点があるのでは? と疑っているところです
OSOSです。> わわい様追加のご意見ありがとうございます。出張から帰ってこれたのでようやく皆様のご意見をもとに色々試すことができました。結論から言いますと、どうにか期待した通り、プログラムから別プログラムへの遷移ができるようになりました。
必要だったことは、スタックポインタの変更前に下記の一行が必須だったようでした。
「R_MPU_SPMON->SP[0].CTL = 0;」
ARMコアの特権モードなど色々設定を試してもなかなかうまくいかず…
スタックポインタの書き換えに関して試してみました。
(マイコンはRA2L1)
最初のNOPの箇所ではSP=0x2000_0488でした。これを、__set_MSP()で、書き換えました。
2つめのNOPでは、SP=0x2000_0400に書き換わっていました。このときに、NMIハンドラには飛ばず、以降のwhileループは実行されました。
(SPEST=0のままでした)
単純に__set_MSP()でSPを書き換えたら必ずエラーになる訳ではなさそうです。(何かエラーとなる他の要因があるのかと思われます。)
エラーが再現したら、
MSPMPUCTL.ENABLE=0に設定して、どうなるかを確認したかったのですが。
MSPMPUCTL.ENABLE=0に設定した場合、エラーが検出されなくなるかも?と思いました。
(ただ、エラーが検出されなくなっても、それが対策として正解かどうかは微妙かと思われます。)
(FSPのデフォルトではメインスタックサイズは0x400なので、その値を大きくすると状況が変わるかも知れません。)