Top Page [◀◀]  2   3   4   5   6   7   8   9   ... [▶▶Last Page

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

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

  • In reply to IKUZO:

    NoMaYさんお世話になります
    NoMaYさんの方が投稿がはやかったですね、まー解決しましたね
    ありがとうございました、意味がこれで解りました、
    長い間時間をいただき、ありがとうございました。
  • 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さん
    ありがとうございました、長かったですね、私の理解力の不足です、本当に感謝いたします。
  • 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

    //0:禁止

    //1:許可

    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を書き込みますと、例外が一度発生します

    いろいろ教えてくださり、ありがとうございました。

  • In reply to IKUZO:

    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=0x07000000
    REPAGE3=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=0x08C30E90
    REPAGE3=0xFFFFFFFF
    正)
    RSPAGE2=0x08C30E90
    REPAGE2=0xFFFFFFFF

  • In reply to NoMaY:

    NoMaYさん
    いつもお世話になっています
    NoMaYさんおっしゃるとうりですprintfが下記のようになっています
    printf("REPAGE3=0x%08lX\r",MPU.REPAGE2.LONG );
    正しくは
    printf("REPAGE2=0x%08lX\r",MPU.REPAGE2.LONG );
    としなければいけません
    MPU.RSPAGE3.LONG=0x07000000;
    MPU.REPAGE3.BIT.REPN=0x07000000;
    以下同ですが、これは本来0なんですが
    これまでの経緯でして修正しないといけないんですが、
    そのままにしてしまったということです、
    現在printfの表示はすべてコメントアウトしております、
    教えていただきましてとても調子いいです、
    例外原因他アドレスなども簡単にレポートできると思います、
    アセンブラーの厄介にならなくて済むというのがメリットだと思います、
    今回気が付いたのはMPBAC==0x00000000であれば
    RSPAGE、REPAGEで全アドレスをカバーしないといけない
    ということでした
  • 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的には既に例外処理から抜けていて、スーパバイザモードではなくてユーザーモードになっていたりする、ものなのだろうか、、、

  • In reply to NoMaY:

    NoMaYさんいつもお世話になっています
    例外処理で表示される内容ですが、いろいろありそうですね
    Windows等ですとVCのデバックで例外処理をさせるとレジスター値やらアドレスやらいろいろ
    表示されますが、そこまでしようとすると、時間も努力もいるでしょうね
    今回はSDRAMのプログラム実行中に自身のコードが書き換えられると暴走するために
    それを防止するということで、知らぬ間に書き換えられるほど恐ろしいものはありませんよね
    「割り込み処理中」のメモリ書き換えという不安が残っているものの
    これが検出できるということは少し安心できますね、
  • In reply to NoMaY:

    NoMaYさんいつもお世話になっています
    「スーパバイザモードでの初期化処理終了後にFPGAやLANコントローラをユーザモード」
    そうですよね、その辺りは調整によりますでしょうか、今回まだ初めて間がないので
    経験を積むということになるのでしょう、複雑なことをやってわからなくなるということもありますので
    理解が進むと、自由に使いこなせるようになるのではないかと期待しております。

Top Page [◀◀]  2   3   4   5   6   7   8   9   ... [▶▶Last Page