RA CPUのスタックポインタの書き換えについて

こんにちは、OSOSと申します。

RA2 CPUを使った製品の開発を行っており、
CPUの初期化機能を持った「ブートローダ」と
製品に必要な機能を持った「アプリケーション」の2つのプログラムを
あわせもった構成で開発を行っています。

しかし、ブートローダからアプリケーションへのジャンプ処理の一部に
うまくいかない箇所があり、困っております。

問題としては、ブートローダからアプリケーションへジャンプする直前に、スタックポインタを
FSPに含まれている「__set_MSP」関数を使って、スタックポインタのアドレスを
アプリケーション用のアドレスへ移そうとしたところ
NMIのスタックポインタモニタエラーが発生するという状況です。



参考として、実際に組んでいるコード例を以下に示します。

そもそも、NMIのスタックポインタモニタエラーの情報も RAのマニュアルを見ても
不足して悩んでいる状況でもあります。

上記について何か気になることがある方、あるいは、CortexMのスタックポインタモニタエラーについて
ご存じの方がいらっしゃいましたら、何でも構いませんのでご指摘いただけないでしょうか。


なお、アプリケーション・ブートローダはそれぞれ単独で動作確認できており、また、スタックポインタの
アドレスをあえて同じ値を「__set_MSP」関数で書き換えてもモニタエラーが発生します。
このことから、設定したアドレスがおかしいというよりも スタックポインタの書き換え方に何か注意点が
あるのでは? と疑っているところです

Parents
  • スタックポインタの書き換えに関して試してみました。

    (マイコンは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なので、その値を大きくすると状況が変わるかも知れません。)

Reply
  • スタックポインタの書き換えに関して試してみました。

    (マイコンは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なので、その値を大きくすると状況が変わるかも知れません。)

Children
No Data