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

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

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

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

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



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

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

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


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

Parents
  • OSOSです。
    皆様、早速のご指摘ありがとうございます。

    いただいたコメントの一つ一つを確認していこうとしていたのですが、
    私のほうが今朝から突如開発を中断して出張することになってしまったので、
    プログラムの確認をできるのが数日後になってしまいそうです。

    コメントいただけたこと本当に感謝しております。また落ち着いてから確認させていただきます。

    > ほや 様
    海外コミュの情報ありがとうございます。ソースコードもあるようですので内容確認してみます。まさにブートローダ機能の箇所のARM資料もお教えいただいたのでちゃんと読んでみようと思います。

    > tf 様
    わざわざ再現実験まで試していただき、ありがとうございます。
    実はブートローダと称する一つ目に起動するソフトウェアは、アップデート機能も持つためRAM上で動作するよう、デフォルトのFSPサンプルからリンカスクリプト周りを調整しています。
    tf様の環境で起きなかったということは、RAMに実行コードを移したことによる問題かもしれないと思って、そのあたりも見直してみようと思います。

    > omuraisu49 様
    メモリサイズの都合上、ルネサスのMCUboot機能が使えないため頭から飛んでいましたが、たしかに一部の内容であれば参考になるかもしれないので読ませていただきます。情報ありがとうございます。

    > わわい様
    ご指摘ありがとうございます。仰る通り、当初はスタック位置が変わることが原因とも思って、static変数でジャンプ先を指定するなども試してみたのですがうまくいかなかったです。アセンブリも一つずつ調べながら書いたところがあるので、やはりこの点ももう少し調べなおしてみようと思います。

  • わわいです

    ちと蛇足ですが

    このような場合、コンパイルオプションにアセンブルリストを出力するオプションがありますんで、その出力を確認し、また、統合開発環境(e2studio)で1命令ごとのステップ実行を行ってどこがどういう動作をしていくか確認することです

    こういうイレギュラーなこと(関数中でのスタック変更)を行う場合は特に、コンパイラの実装で動作が変わる場合がありますんで、そこらへんをきっちり抑えておく必要があります

Reply
  • わわいです

    ちと蛇足ですが

    このような場合、コンパイルオプションにアセンブルリストを出力するオプションがありますんで、その出力を確認し、また、統合開発環境(e2studio)で1命令ごとのステップ実行を行ってどこがどういう動作をしていくか確認することです

    こういうイレギュラーなこと(関数中でのスタック変更)を行う場合は特に、コンパイラの実装で動作が変わる場合がありますんで、そこらへんをきっちり抑えておく必要があります

Children
No Data