Top Page [◀◀] 2 3 4 5 6 7 8 9 ... [▶▶] Last Page
IKUZOと申します、RX631のメモリプロテクションユニットの使用方法がわかりません、サンプルコードも探したのですが該当が無いようです、アドバイスをいただけませんでしょうか?
In reply to IKUZO:
各メモリ保護領域nは、RSPAGEnおよびREPAGEnレジスタでアドレス(領域)設定、アクセス制御をする。 メモリ保護領域0~7に設定していない、その他アドレスに関しては、 バックグランド領域とされ、MPBACレジスタでアクセス制御する、ではないでしょうか? ※IKUZOさんの作成したプログラムのメモリマップがどうなっているかは確認してください。 上記コードでは、以下の記述があります。 RSPAGE1=0x00000000 REPAGE1=0xFFFFFFFF これはメモリ保護領域1で0x00000000~0xFFFFFFFF(全領域)に対して、 "読み出し"、"書き込み"、"実行"のアクセスを許可しているのでないでしょうか? (この場合、バックグラウンド領域はなしだと思います) また、表13.2において、(メモリ保護)領域がオーバラップした場合は、 許可が優先されるとの記載があります。
解決したのであれば、よかったです。
In reply to circle:
circleさん、こんにちは。NoMaYです。すみません。IKUZOさんの投稿を見直したのですが、以下の推論の根拠については私の勘違いでした。(IKUZOさんの方でうまくいったとのことで、推論の結果だけはあっていたようですが。) どどど~っと投稿が進むスレッドでしたので、あせって勘違いしてしまいました。申し訳ありません。>IKUZOさんが試された>パターンの中にはアクセス違反の例外が発生しているというパターンがありますので、私は、以下の>コードはmain()のchg_pmusr()以後にあるのだと解釈しています。>>char *p=(char*)0;>>p[0]=1;
In reply to NoMaY:
今回は多くの助言をいただき理解することができました
ここで現在の実装の状況を開示します、
intprg_.srcに_Excep_AccessInst:を作成しておりましたが
// Exception(Access Instruction)
void Excep_AccessInst(void)
{
Access_Inst();
}
に変更しまして直接C言語ルーチンへとジャンプするようにいたしました
経過はアセンブリルーチンが繰り返し処理を呼び出すのに対して一度のみ例外処理を
呼び出します、(もちろん正常に帰ることはありませんが)これで十分です
mup.cはmain()の中に #include "mpu.c"しております
mpu.cの内容は
//111 R:Enable,W:Enable,X:Disable,Area_Valid:V
//1011
//0:禁止
//1:許可
MPU.RSPAGE0.LONG=0x00000000;
MPU.REPAGE0.BIT.REPN=0x00000000;
MPU.REPAGE0.BIT.UAC=0;
MPU.REPAGE0.BIT.V=1;
MPU.RSPAGE1.LONG=0x00000010;
MPU.REPAGE1.BIT.REPN=0xFFFFFFFF;
MPU.REPAGE1.BIT.UAC=7;
MPU.REPAGE1.BIT.V=1;
MPU.RSPAGE2.LONG=0x07000000;
MPU.REPAGE2.BIT.REPN=0x07000000;
MPU.REPAGE2.BIT.UAC=7;
MPU.REPAGE2.BIT.V=0;
MPU.RSPAGE3.LONG=0x07000000;
MPU.REPAGE3.BIT.REPN=0x07000000;
MPU.REPAGE3.BIT.UAC=7;
MPU.REPAGE3.BIT.V=0;
MPU.RSPAGE4.LONG=0x07000000;
MPU.REPAGE4.BIT.REPN=0x07000000;
MPU.REPAGE4.BIT.UAC=7;
MPU.REPAGE4.BIT.V=0;
MPU.RSPAGE5.LONG=0x07000000;
MPU.REPAGE5.BIT.REPN=0x07000000;
MPU.REPAGE5.BIT.UAC=7;
MPU.REPAGE5.BIT.V=0;
MPU.RSPAGE6.LONG=0x07000000;
MPU.REPAGE6.BIT.REPN=0x07000000;
MPU.REPAGE6.BIT.UAC=7;
MPU.REPAGE6.BIT.V=0;
MPU.RSPAGE7.LONG=0x07000000;
MPU.REPAGE7.BIT.REPN=0x07000000;
MPU.REPAGE7.BIT.UAC=7;
MPU.REPAGE7.BIT.V=0;
//111 R:Enable,W:Enable,X:Disable
MPU.MPBAC.BIT.UBAC=0;//111
MPU.MPEN.LONG=(long)1;//メモリプロテクション機能を有効
printf("RSPAGE0=0x%08lX\r",MPU.RSPAGE0.LONG );
printf("REPAGE0=0x%08lX\r",MPU.REPAGE0.LONG );
printf("RSPAGE1=0x%08lX\r",MPU.RSPAGE1.LONG );
printf("REPAGE1=0x%08lX\r",MPU.REPAGE1.LONG );
printf("RSPAGE2=0x%08lX\r",MPU.RSPAGE2.LONG );
printf("REPAGE3=0x%08lX\r",MPU.REPAGE2.LONG );
printf("RSPAGE3=0x%08lX\r",MPU.RSPAGE3.LONG );
printf("REPAGE3=0x%08lX\r",MPU.REPAGE3.LONG );
printf("RSPAGE4=0x%08lX\r",MPU.RSPAGE4.LONG );
printf("REPAGE4=0x%08lX\r",MPU.REPAGE4.LONG );
printf("RSPAGE5=0x%08lX\r",MPU.RSPAGE5.LONG );
printf("REPAGE5=0x%08lX\r",MPU.REPAGE5.LONG );
printf("RSPAGE6=0x%08lX\r",MPU.RSPAGE6.LONG );
printf("REPAGE6=0x%08lX\r",MPU.REPAGE6.LONG );
printf("RSPAGE7=0x%08lX\r",MPU.RSPAGE7.LONG );
printf("REPAGE7=0x%08lX\r",MPU.REPAGE7.LONG );
printf("MPBAC =0x%08lX\r",MPU.MPBAC.LONG );
chg_pmusr();//ユザーモードにする
printf("設定成功\r");
これで0~16番地のアドレスを禁止しています
理解できると簡単に設定し動作させることができます
DB 0 12 で0番地メモリへ0x12を書き込みますと、例外が一度発生します
いろいろ教えてくださり、ありがとうございました。
SDRAM仕様で動作テストいたしましたPセクションを保護するようにしました 例外処理はSRAMに例外情報を退避してソフトリセットします 次に起動したときSRAMの例外情報を表示します -------------------------------------------------------------- fpga初期設定中...Ok LG-17-4659-33(RX631) v1.00 Copyright(C) 2017/3.. Default build : Oct 24 2017 09:24:56 run=0xFFF1673A SCI1(9600,E,8,1) FPGA 2017/08/31 :11 2017-10-24-火 10:20:35 C:\>RSPAGE0=0x00000000 REPAGE0=0x08C1514F RSPAGE1=0x08C15140 REPAGE1=0x08C30E9B RSPAGE2=0x08C30E90 REPAGE3=0xFFFFFFFF RSPAGE3=0x07000000 REPAGE3=0x7000000E RSPAGE4=0x07000000 REPAGE4=0x7000000E RSPAGE5=0x07000000 REPAGE5=0x7000000E RSPAGE6=0x07000000 REPAGE6=0x7000000E RSPAGE7=0x07000000 REPAGE7=0x7000000E MPBAC =0x00000000 設定成功 afp=0xFFF039EF LG-17-4659-33(RX631) v1.00 Copyright(C) 2017/3.. Sdram build : Oct 24 2017 10:19:28 run=0x08C15D89 SCI1(9600,E,8,1) FPGA 2017/08/31 :11 2017-10-24-火 10:20:37 C:\>ネットワークが使用可能です. Serial number=5783 IP=192.168.0.64 MAC=00-01-FF-FF-57-83 MYIP=192.168.0.64 MYMSK=255.255.255.0 GWIP=0.0.0.0 C:\>データフラッシュを使用可能です. C:\>DB 08C15245 12?アクセス例外 ←ここで08C15245に12を書き込んで例外が発生 fpga初期設定中...Ok LG-17-4659-33(RX631) v1.00 Copyright(C) 2017/3.. Default build : Oct 24 2017 09:24:56 run=0xFFF1673A SCI1(9600,E,8,1) FPGA 2017/08/31 :11 2017-10-24-火 10:20:50 C:\>アクセス例外 RSPAGE0=0x00000000 REPAGE0=0x08C1514F RSPAGE1=0x08C15140 REPAGE1=0x08C30E9B RSPAGE2=0x08C30E90 REPAGE3=0xFFFFFFFF RSPAGE3=0x07000000 REPAGE3=0x7000000E RSPAGE4=0x07000000 REPAGE4=0x7000000E RSPAGE5=0x07000000 REPAGE5=0x7000000E RSPAGE6=0x07000000 REPAGE6=0x7000000E RSPAGE7=0x07000000 REPAGE7=0x7000000E MPBAC =0x00000000 設定成功 afp=0xFFF039EF LG-17-4659-33(RX631) v1.00 Copyright(C) 2017/3..Sdram build : Oct 24 2017 10:19:28 run=0x08C15D89 SCI1(9600,E,8,1) FPGA 2017/08/31 :11 2017-10-24-火 10:20:52 C:\>ネットワークが使用可能です. Serial number=5783 IP=192.168.0.64 MAC=00-01-FF-FF-57-83 MYIP=192.168.0.64 MYMSK=255.255.255.0 GWIP=0.0.0.0 C:\>データフラッシュを使用可能です. C:\>
IKUZOさん、こんにちは。NoMaYです。すみません。少し教えて下さい。実は昨日から気にはなっていたのですが、何ゆえに以下の設定になっているのでしょうか?コード:MPU.RSPAGE3.LONG=0x07000000; ← これは何ですか?MPU.REPAGE3.BIT.REPN=0x07000000; ← これは何ですか?MPU.REPAGE3.BIT.UAC=7; ← これは分りますMPU.REPAGE3.BIT.V=0; ← これは分ります以下、領域4~領域7も同様表示:RSPAGE3=0x07000000REPAGE3=0x7000000E以下、領域4~領域7も同様ちなみに、以下はコピペ後の変更ミスというのは気付いたのですが、、、コード:誤)printf("RSPAGE2=0x%08lX\r",MPU.RSPAGE2.LONG );printf("REPAGE3=0x%08lX\r",MPU.REPAGE2.LONG );正)printf("RSPAGE2=0x%08lX\r",MPU.RSPAGE2.LONG );printf("REPAGE2=0x%08lX\r",MPU.REPAGE2.LONG );表示:誤)RSPAGE2=0x08C30E90REPAGE3=0xFFFFFFFF正)RSPAGE2=0x08C30E90REPAGE2=0xFFFFFFFF
IKUZOさん、こんにちは。NoMaYです。リプライどうも有難う御座います。>MPU.RSPAGE3.LONG=0x07000000;>MPU.REPAGE3.BIT.REPN=0x07000000;>以下同ですが、これは本来0なんですが了解です。>今回気が付いたのはMPBAC==0x00000000であれば>RSPAGE、REPAGEで全アドレスをカバーしないといけない>ということでしたスーパバイザモードでの初期化処理終了後にFPGAやLANコントローラをユーザモード(というか割り込み処理外)でアクセスすることがあるのであれば、それらが繋がっている空間についても適切に許可しないといけませんものね。あるいは、RX62N,RX621グループ用のアプリケーションノートのChange_PSW_PM_to_SuperVisorMode()を使って、通常処理中でも一時的にスーパバイザモードにしてアクセスするかですね。
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的には既に例外処理から抜けていて、スーパバイザモードではなくてユーザーモードになっていたりする、ものなのだろうか、、、