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

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

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

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

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



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

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

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


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

Parents
  • OSOSです。

    > わわい様
    追加のご意見ありがとうございます。

    出張から帰ってこれたのでようやく皆様のご意見をもとに色々試すことができました。
    結論から言いますと、どうにか期待した通り、プログラムから別プログラムへの遷移ができるようになりました。

    必要だったことは、スタックポインタの変更前に下記の一行が必須だったようでした。

    「R_MPU_SPMON->SP[0].CTL = 0;」

    ARMコアの特権モードなど色々設定を試してもなかなかうまくいかず、悩みながら作業していましたが
    結局、プログラム上の「R_MPU_SPMON->SP[0].CTL」を0設定することで、RA CPUのデータシートにおける
    MSPMPUCTLレジスタの ENABLEビットが0設定され、スタックポインタの変更許可が下りるようでした。

    皆様が挙げてくださった資料や、再現実験から一つずつ確認していった結果、問題が解消することができました。
    改めて皆様、情報のご提供やご指摘、本当にありがとうございました。

    UARTやCAN,イーサネットのようなよく使うドライバとは異なり、ベクタテーブルなどを触る機会が少なかったため、よく勉強になりました。

Reply
  • OSOSです。

    > わわい様
    追加のご意見ありがとうございます。

    出張から帰ってこれたのでようやく皆様のご意見をもとに色々試すことができました。
    結論から言いますと、どうにか期待した通り、プログラムから別プログラムへの遷移ができるようになりました。

    必要だったことは、スタックポインタの変更前に下記の一行が必須だったようでした。

    「R_MPU_SPMON->SP[0].CTL = 0;」

    ARMコアの特権モードなど色々設定を試してもなかなかうまくいかず、悩みながら作業していましたが
    結局、プログラム上の「R_MPU_SPMON->SP[0].CTL」を0設定することで、RA CPUのデータシートにおける
    MSPMPUCTLレジスタの ENABLEビットが0設定され、スタックポインタの変更許可が下りるようでした。

    皆様が挙げてくださった資料や、再現実験から一つずつ確認していった結果、問題が解消することができました。
    改めて皆様、情報のご提供やご指摘、本当にありがとうございました。

    UARTやCAN,イーサネットのようなよく使うドライバとは異なり、ベクタテーブルなどを触る機会が少なかったため、よく勉強になりました。

Children
No Data