IKUZOと申します、RX631のメモリプロテクションユニットの使用方法がわかりません、サンプルコードも探したのですが該当が無いようです、アドバイスをいただけませんでしょうか?
IKUZOさん、こんにちは。NoMaYです。RX62N,RX621グループ用の資料がありますが、RX63N,RX631グループでも参考になりそうな気がします。(すみません、検索して見つかったものをチラ見した程度ですが、、、)Renesasキーワード検索: メモリプロテクションユニットwww.renesas.com/ja-jp/search/keyword-search.html#q=メモリプロテクションユニットドキュメント: RX62N、RX621グループ メモリプロテクションユニットの設定例www.renesas.com/ja-jp/doc/products/mpumcu/apn/rx/001/r01an1078jj0100_rx62n.pdfサンプルプログラム: RX62N、RX621グループ メモリプロテクションユニットの設定例www.renesas.com/ja-jp/software/D3014498.html
ここで一応mpu.cのソースを開示します /////////////////////////////////////////////////////////////////////// //アクセス例外 /////////////////////////////////////////////////////////////////////// uint32_t g_mpu_err_instruction_adrs; void Access_Inst(void) { sci2_put('*'); MPU.MPECLR.BIT.CLR=1; } /////////////////////////////////////////////////////////////////////// //アクセス例外 /////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////// //スーパバイザモードからユーザモードに変更 /////////////////////////////////////////////////////////////////////// void Change_PSW_PM_to_UserMode(void) { MVFC PSW,R1 OR #00100000h,R1←ユザーモードフラグ(コメントアウトするとスパーバイザー) PUSH.L R1 MVFC PC,R1 ADD #10,R1 PUSH.L R1 RTE NOP NOP NOP NOP NOP NOP } /////////////////////////////////////////////////////////////////////// //スーパバイザモードからユーザモードに変更 /////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////// //MPUの初期化 /////////////////////////////////////////////////////////////////////// void mpu_init(void) { MPU.RSPAGE0.LONG=0; MPU.REPAGE0.BIT.REPN=0; MPU.REPAGE0.BIT.UAC=7; MPU.REPAGE0.BIT.V=0; MPU.RSPAGE1.LONG=0; MPU.REPAGE1.BIT.REPN=0; MPU.REPAGE1.BIT.UAC=7; MPU.REPAGE1.BIT.V=0; MPU.RSPAGE2.LONG=0; MPU.REPAGE2.BIT.REPN=0; MPU.REPAGE2.BIT.UAC=7; MPU.REPAGE2.BIT.V=0; MPU.RSPAGE3.LONG=0; MPU.REPAGE3.BIT.REPN=0; MPU.REPAGE3.BIT.UAC=7; MPU.REPAGE3.BIT.V=0; MPU.RSPAGE4.LONG=0; MPU.REPAGE4.BIT.REPN=0; MPU.REPAGE4.BIT.UAC=7; MPU.REPAGE4.BIT.V=0; MPU.RSPAGE5.LONG=0; MPU.REPAGE5.BIT.REPN=0; MPU.REPAGE5.BIT.UAC=7; MPU.REPAGE5.BIT.V=0; MPU.RSPAGE6.LONG=0; MPU.REPAGE6.BIT.REPN=0; MPU.REPAGE6.BIT.UAC=7; MPU.REPAGE6.BIT.V=0; MPU.RSPAGE7.LONG=0; MPU.REPAGE7.BIT.REPN=0; MPU.REPAGE7.BIT.UAC=7; MPU.REPAGE7.BIT.V=0; MPU.MPBAC.BIT.UBAC=7;//111←その他の保護領域(0にすると例外発生します) 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 ); MPU.MPEN.LONG=(long)1;//メモリプロテクション機能を有効 Change_PSW_PM_to_UserMode();//ユザーモードに nop(); nop(); nop(); nop(); nop(); nop(); nop(); nop(); nop(); nop(); nop(); nop(); printf("設定成功\r");←ここまではOK } /////////////////////////////////////////////////////////////////////// //MPUの初期化 /////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////// //デバックテスト用 /////////////////////////////////////////////////////////////////////// int cmd_test(char *str) {mpu_init(); printf("正常にリターンしました.\r");←保護ONでは例外なし、ここまで来ず return CMD_OK; } /////////////////////////////////////////////////////////////////////// //デバックテスト用 ///////////////////////////////////////////////////////////////////////
この折にE1エミュレータ [R0E000010KCE00]販売店にお願いしました。
とりあえず、
E1エミュレータ接続は今すぐできませんということでしてシミュレータ等でできるのかもしれないことを伺いましたのでその方向で行ければと思います
このリスト出力しますと、以下のようになりました .LINE "C:\Dev\BASE\RX63N\RX631\csp\csp\mpu.c",138 ._LINE_TOP inline_asm 00000202 FD6A01 MVFC PSW,R1 00000205 7731000010 OR #00100000h,R1 0000020A 7EA1 PUSH.L R1 0000020C FD6A11 MVFC PC,R1 0000020F 62A1 ADD #10,R1 00000211 7EA1 PUSH.L R1 00000213 7F95 RTE 00000215 03 NOP 00000216 03 NOP 00000217 03 NOP 00000218 03 NOP 00000219 03 NOP 0000021A 03 NOP ._LINE_END inline_asm .LINE "C:\Dev\BASE\RX63N\RX631\csp\csp\mpu.c",139 0000021B 03 NOP 0000021C 6040 SUB #04H, R0 .LINE "C:\Dev\BASE\RX63N\RX631\csp\csp\mpu.c",141 0000021E FBE2rrrrrrrr MOV.L #_L26, R14 00000224 E30E MOV.L R14, [R0] 00000226 05rrrrrr A BSR _printf 0000022A 6240 ADD #04H, R0 0000022C 3F6702 RTSD #08H, R6-R7 .SECTION PUser_Area,CODE 00000000 _Change_PSW_PM_to_UserMode: .STACK _Change_PSW_PM_to_UserMode=4 ._LINE_TOP inline_asm 00000000 FD6A01 MVFC PSW,R1 00000003 7731000010 OR #00100000h,R1 00000008 7EA1 PUSH.L R1 0000000A FD6A11 MVFC PC,R1 0000000D 62A1 ADD #10,R1 0000000F 7EA1 PUSH.L R1 00000011 7F95 RTE 00000013 03 NOP 00000014 03 NOP 00000015 03 NOP 00000016 03 NOP 00000017 03 NOP 00000018 03 NOP ._LINE_END inline_asm 00000019 02 RTS 0000001A _Change_PSW_PM_to_SuperVisorMode: .STACK _Change_PSW_PM_to_SuperVisorMode=4 .LINE "C:\Dev\BASE\RX63N\RX631\csp\csp\mpu.c",216 0000001A FD6AAE MVFC ISP, R14 0000001D FBF2rrrrrrrr MOV.L #_g_rd_isp, R15 00000023 E3FE MOV.L R14, [R15] .LINE "C:\Dev\BASE\RX63N\RX631\csp\csp\mpu.c",218 00000025 00 BRK 00000026 02 RTS
見てみるとBRKがこれでブレークしているのでは?