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

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

  • とりあえず、

    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でも
    動作確認済なのでしょうか?
  • IKUZOさん、こんにちは。NoMaYです。

    昨日の時点では気付いてなかったのですが、先程、あっ、と気付いたことがあります。こちらで試そうとしていることには『アクセス例外が発生したことの確認』が含まれますよね。今のところ、発生していなければ絶対おかしいというレベルの『浮動小数点例外が発生したことの確認』さえ出来ないような事態となっています。ですので、浮動小数点例外の件が解決するまで、IKUZOさんの先程の件(14:09の件)は良いとしても、少なくとも浮動小数点例外の件と話が共通する部分については手を進めないよう、作業をより分けるように気を付けた方が良いと思われます。

  • NoMaYさんお世話になっています
    はい、そのようにしたいと思います、すなわち「RXで浮動小数点例外に飛ばすには」を先に解決すべきとのことですね、「RX631のメモリプロテクションユニットの件」で例外をテストするのに「RXで浮動小数点例外に飛ばすには」を問題提起でしたので「RXで浮動小数点例外に飛ばすには」こちらを先に解決すべきですよね、わかりました、こちらを先にしたいと思います。
  • > 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さん
    申し訳ありません、ここのフォーラムは初心者ですので、お手柔らかに、気楽に行こうということで、サポートを何より感謝しております、多くのことを教えていただき感謝します。
  • IKUZOさん、こんにちは。NoMaYです。

    実は、このスレッドの初めの頃にRX62N,RX621グループ用のアプリケーションノートを紹介した後、このスレッドについては、チラ見する程度で、ちゃんと追っていませんでした。それで、浮動小数点例外の件についてのヒントがあるかも知れないと思い、しっかり気合を入れて見てみたところ、アクセス例外(および特権命令例外、未定義命令例外、浮動小数点例外)に特有の以下の話が出ていないことに気付きました。

    アクセス例外、特権命令例外、未定義命令例外、浮動小数点例外が他の例外と異なる点

    ・スタックに退避されるPC値は『例外が発生した命令のPC値』である為、例外ハンドラ中でスタックに退避されたPC値(戻り番地)を細工していないのであれば、RTE命令を実行した後に、同じ命令が再実行されて(再実行されようとして)同じ例外が再発生する。

    ・同じ例外が再発生した時の例外ハンドラも同じ例外ハンドラですので、結局、同じことが永遠に繰り返されるだけであり、プログラムは先へ進まない。

    以下、RX63N,RX631のオンラインドキュメントの画面コピーです。

    14.3.1 受け付けタイミングと退避されるPC値 (赤枠は私が書いたものです)
    resource.renesas.com/resource/lib/jpn/online_docs/um/RX/RX63N_RX631_ja/?Exceptions#TOC_14_3


    [追伸]

    こちらのスレッドをちゃんと追ってみて(というか追っている最中ですが)気付いたことは、こちらでは『アクセス例外が発生したことの確認』までは出来ていたのですね。ということは、浮動小数点例外の件と話が共通する部分は、無かったことになりますね。とんちんかんなこと言ってしまったようです。

    japan.renesasrulz.com/cafe_rene/f/forum5/4537/rx631/24429#24429
    以下の引用の赤色は私が付けたものです。
    「10.MPU.MPBAC.BIT.UBAC=0;に変更して、"T"コマンド
    T
    RSPAGE0=0x00000000
    REPAGE0=0x0000000E
    RSPAGE1=0x00000000
    REPAGE1=0x0000000E
    RSPAGE2=0x00000000
    REPAGE3=0x0000000E
    RSPAGE3=0x00000000
    REPAGE3=0x0000000E
    RSPAGE4=0x00000000
    REPAGE4=0x0000000E
    RSPAGE5=0x00000000
    REPAGE5=0x0000000E
    RSPAGE6=0x00000000
    REPAGE6=0x0000000E
    MPBAC =0x00000000
    *******************************←Access_Inst(void)アクセス例外処理を何度も呼び出します


    [追記]

    何度かスレッドを読み直してみたら、上の投稿より前に例外が発生することが述べられていましたね。

    japan.renesasrulz.com/cafe_rene/f/forum5/4537/rx631/24235#24235
    以下の引用の赤色は私が付けたものです。

    SDRAM部分に書き込み例外を設定すると、即、例外が発生いたします