IKUZOと申します、RX631のメモリプロテクションユニットの使用方法がわかりません、サンプルコードも探したのですが該当が無いようです、アドバイスをいただけませんでしょうか?
IKUZOさん、こんにちは。NoMaYです。直接の関係は無いのですが、別スレッド『RX610 1MからRX610 1.5Mへの置き替え』に投稿していて、こちらのスレッドのことで思ったことがあります。>例外原因他アドレスなども簡単にレポートできると思います、アクセス違反例外ハンドラでスタックの中を調べればアクセス違反を起こした命令のアドレスが分りますので、それを表示するようにすれば随分とデバッグに役立つのではないでしょうか。特に、昨日IKUZOさんがされたようにIRAMの先頭をアクセス禁止にすれば、NULLポインタアクセスしたのがソースコードのどこなのか簡単に分って便利そうですよね。(未定義命令例外、浮動小数点例外、特権命令例外も同様ですが。)たぶん、以下のようなコードでスタックポインタ値を得られると思います。(Excep_AccessInst()内でauto変数を使ってしまったりすると、コンパイラのバージョンや最適化レベルによって、get_isp()で得た値とスタック内の戻り番地のオフセットが変わる気苦労があったりすることもありますが、以下のコードならそんなことは無いと思っています。)// Exception(Access Instruction)void Excep_AccessInst(void){ Access_Inst(get_isp());}ただ、惜しいかもと思っているのが、割り込み処理中(=例外処理中=スーパバイザモード中)はアクセス違反検出が出来ないのですよね。RXマイコン辺りだと、通常処理も割り込み処理も同じ人が書くことが多いと思うので、どちらにも同じぐらいの割合で間違いが入り込むと思うのです。以下、私の独り言です。果たして、例外処理の先頭でchg_pmusr()しておいて例外処理の最後でChange_PSW_PM_to_SuperVisorMode()したりする、といった荒業(?)は出来たりするのだろうか、、、そういえば、RTOS(μITRONとか)では、割り込みハンドラ(というかタスク)に制御が移った時点でCPU的には既に例外処理から抜けていて、スーパバイザモードではなくてユーザーモードになっていたりする、ものなのだろうか、、、