RX631のメモリプロテクションユニットの件

IKUZOと申します、RX631のメモリプロテクションユニットの使用方法がわかりません、サンプルコードも探したのですが該当が無いようです、アドバイスをいただけませんでしょうか?

Parents
  • 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

  • NoMaYさん
    いつもお世話になっております、有益な資料をお教えいただき感謝します、早速調べまして活用するようにいたします、良い結果が出ましたらまたご報告いたします。
  • でしたら、
    9.と10.で何を変えたのか、
    MPUの処理を全てコメントアウトして動作が変わるか、
    Change_PSW_PM_to_UserMode関数の前後で
    汎用レジスタ等が正しいか等、
    1つ1つ(再)確認していくしかないと思います。
    投稿されている情報だけでは何とも言えないです。
  • triangleさん
    御心配かけまして、どうも
    「9.と10.で何を変えたのか」
    9.でございますが
    MPBAC =0x0000000E としています
    10.でございますが
    MPBAC =0x00000000 としています
    「Change_PSW_PM_to_UserMode関数の前後で
    汎用レジスタ等が正しいか等、
    1つ1つ(再)確認していくしかないと思います。」そうですよね
    サンプルがRX62n用のものなのでRX631とレジスター構成等が同じかどうか
    基本的に調べないとならないかな、というように感じます
    サンプルではnop();が1個入っていまして、最初動作しなかったように思います
    このnop();を増やしまして、動作できるようになったと記憶します
    スタックサイズ(ワード/ダブルワード)等もどうだろうか?と思います
    互換性がすっきしないという印象です
  • ここで一応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エミュレータ [R0E000010KCE00]が今到着しました。
  • とりあえず、

    E1エミュレータをRX631に接続したいのですが

    E1エミュレータ接続は今すぐできませんということでして
    シミュレータ等でできるのかもしれないことを伺いましたので
    その方向で行ければと思います

  • わたくしの理解が不足しております、この件について多大な疑問がございます
    アドバイス賜れましたら、うれしいです
    void Change_PSW_PM_to_UserMode(void)の定義についてです
    このvoid Change_PSW_PM_to_UserMode(void)といいますのは
    #pragma inline_asm Change_PSW_PM_to_UserMode
    void Change_PSW_PM_to_UserMode(void);とインライン定義されています
    であれば、void mpu_init(void)内に展開されると思うのですが
    void Change_PSW_PM_to_UserMode(void)の定義自体は
    セクションUser_Areaに定義されています
    #pragma section User_Area
    void mpu_init(void)のセクションマップ設定はCセクションだと思いますが
    User_Areaというのは別のセクションとして登録されます
    こんなセクションが別であるのにvoid mpu_init(void)内のインラインというのは
    おかしいと思うのですが、どのように考えたらよいのでしょうか?
  • このリスト出力しますと、以下のようになりました
    .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がこれでブレークしているのでは?

  • void mpu_init(void)ですが、プログラムになりますので、
    何もセクションを指定しなければPセクションに割り当てられます。
    (Cセクションはconst型のデータが割り振られるセクションです)
    ※コンパイラがCC-RXであれば「CC-RX コンパイラ ユーザーズマニュアル」
      6.セクション仕様を参照ください。

    NoMaYさんが紹介している以下のアプリケーションノートは参照しているんですよね?
     ↓
    サンプルプログラム: RX62N、RX621グループ メモリプロテクションユニットの設定例
    www.renesas.com/ja-jp/software/D3014498.html

    リスト出力を見ると、
    Change_PSW_PM_to_UserMode()をコールしている箇所へ
    実際に展開されていますよね?
    RXファミリの命令に関しては「RXファミリ ユーザーズマニュアル ソフトウェア編」を
    参照してください。

    サンプルコードの
    void Change_PSW_PM_to_UserMode(void)の直前に記述されている
    #pragma section User_Areaは、
    Change_PSW_PM_to_SuperVisorMode()を
    PUser_Areaセクションに割り当てるための記載であると思います。
    (サンプルコードに添付されているmapファイルで確認してください)

    セクション配置はアプリケーションノートの図3.1を参照ください。

    BRK命令の使用と用途はアプリケーションノートを読みましたか?
    また、RTE命令はどういう処理ですか?
  • circleさんアドバイスありがとうございます
    「Cセクションはconst型のデータが割り振られるセクションです」そうですね私の間違いでした
    「サンプルプログラム: RX62N、RX621グループ メモリプロテクションユニットの設定例」
    これを基にしてやっているつもりですが、なにか違うのでしょうか?
    「リスト出力を見ると、Change_PSW_PM_to_UserMode()をコールしている箇所へ
    実際に展開されていますよね?」そのようになっています
    User_Areaセクション配置とPセクション配置と違うと思うのですが
    つまりChange_PSW_PM_to_UserMode()->Pセクション
    ですからUser_Areaセクションではないと思うのですが?
    「RTE命令はどういう処理」割り込み時のRTSですね、アセンブラのリターン時に
    割り込みフラグをクリアしてリターンでしょうか?
    BRK命令が入れるように指示してないにも関わらず入るというのが不思議ですね
    不思議というのが「メモリプロテクションユニットの設定例」に従いやっている
    と思っているのですが、できないというのが不思議です、
    RX62N、RX621グループ メモリプロテクションユニットの設定例はRX63Nでも
    動作確認済なのでしょうか?
Reply
  • circleさんアドバイスありがとうございます
    「Cセクションはconst型のデータが割り振られるセクションです」そうですね私の間違いでした
    「サンプルプログラム: RX62N、RX621グループ メモリプロテクションユニットの設定例」
    これを基にしてやっているつもりですが、なにか違うのでしょうか?
    「リスト出力を見ると、Change_PSW_PM_to_UserMode()をコールしている箇所へ
    実際に展開されていますよね?」そのようになっています
    User_Areaセクション配置とPセクション配置と違うと思うのですが
    つまりChange_PSW_PM_to_UserMode()->Pセクション
    ですからUser_Areaセクションではないと思うのですが?
    「RTE命令はどういう処理」割り込み時のRTSですね、アセンブラのリターン時に
    割り込みフラグをクリアしてリターンでしょうか?
    BRK命令が入れるように指示してないにも関わらず入るというのが不思議ですね
    不思議というのが「メモリプロテクションユニットの設定例」に従いやっている
    と思っているのですが、できないというのが不思議です、
    RX62N、RX621グループ メモリプロテクションユニットの設定例はRX63Nでも
    動作確認済なのでしょうか?
Children
  • > User_Areaセクション配置とPセクション配置と違うと思うのですが
    > つまりChange_PSW_PM_to_UserMode()->Pセクション
    > ですからUser_Areaセクションではないと思うのですが?

    #pragma section UserArea
    上記のように記述した場合は、
    記述以降にプログラムがあればPUserArea、
    const型のデータがあればCUserAreaという形で
    割り当てられる領域に対応したPやCが先頭に付いたセクション名となります。
    Change_PSW_PM_to_SuperVisorMode()と書きましたよね?

    > 「RTE命令はどういう処理」割り込み時のRTSですね、アセンブラのリターン時に
    > 割り込みフラグをクリアしてリターンでしょうか?

    どこにそのようなことが書かれていましたか?

    > BRK命令が入れるように指示してないにも関わらず入るというのが不思議ですね

    Change_PSW_PM_to_SuperVisorMode()には、
    brk(); という記述がありますが、IKUZOさんのプログラムにはないのでしょうか?

    >不思議というのが「メモリプロテクションユニットの設定例」に従いやっている
    > と思っているのですが、できないというのが不思議です、

    このように考えているうちは、解決しないのではないでしょうか?

    > RX62N、RX621グループ メモリプロテクションユニットの設定例はRX63Nでも
    > 動作確認済なのでしょうか?

    タイトル等にも RX62N、RX621グループと記載されていますが、
    アプリケーション内にRX63Nで動作確認した旨の記載がありましたか?
  • circleさん
    申し訳ありません、ここのフォーラムは初心者ですので、お手柔らかに、気楽に行こうということで、サポートを何より感謝しております、多くのことを教えていただき感謝します。