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

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

Parents
  • IKUZOさん、こんにちは。NoMaYです。

    ユーザモードに関して以下の話が出ていないことに気付きました。(もっとも、私もRXシミュレータでデバッグしていて気付いたばかりですが。)

    ユーザモードに移行した時のスタックポインタ

    ・スーパバイザモードからユーザモードに遷移するとスタックポインタがUスタックへ強制的に切り替わる。

    ・CC-RXの標準のスタートアップルーチンはmain()に制御が移った時点ではUスタックではなくIスタックを使っている。

    ・ゆえに、スタートアップルーチンのPSWの初期値を変更してUスタックを使うように変更しなければならない。(もしかするとChange_PSW_PM_to_UserMode()を改造することでIスタックのみでも出来るかも知れませんが、、、)([訂正]すみません、CPUの仕様的に不可能でした) (あるいは、Iスタックでのサブルーチン内ではChange_PSW_PM_to_UserMode()を実行しないよう、運用で対処する。)

    2.3.4 プロセッサモード間の移行 (赤枠は私が書いたものです)
    resource.renesas.com/resource/lib/jpn/online_docs/um/RX/RX63N_RX631_ja/?CPU#TOC_2_3_4


    以下、RXシミュレータでデバッグしてみた時の画面コピーです。(当方特有の事情によりCC-RX V2.03を使用しています。)

    Change_PSW_PM_to_UserMode()の末尾のRTE命令実行前: Iスタックを使用中


    Change_PSW_PM_to_UserMode()の末尾のRTE命令実行後: 使用していないUスタックに切り替えられてしまった


    以下、試したプログラムです。

    irom.c

    1777.irom.c.txt
    /***********************************************************************/
    /*                                                                     */
    /*  FILE        :Main.c or Main.cpp                                    */
    /*  DATE        :Tue, Oct 31, 2006                                     */
    /*  DESCRIPTION :Main Program                                          */
    /*  CPU TYPE    :                                                      */
    /*                                                                     */
    /*  NOTE:THIS IS A TYPICAL EXAMPLE.                                    */
    /*                                                                     */
    /***********************************************************************/
    //#include "typedefine.h"
    #ifdef __cplusplus
    //#include <ios>                        // Remove the comment when you use ios
    //_SINT ios_base::Init::init_cnt;       // Remove the comment when you use ios
    #endif
    
    void main(void);
    #ifdef __cplusplus
    extern "C" {
    void abort(void);
    }
    #endif
    
    #include <machine.h>
    #include "iodefine.h"
    #define FPSW_EZ 0x00001000
    #pragma inline_asm Change_PSW_PM_to_UserMode
    void Change_PSW_PM_to_UserMode(void);
    void mpu_init(void);
    void main(void);
    void SuperVisor_Inst(void);
    void Access_Inst(void);
    void Undefined_Inst(void);
    void FloatingPoint_Inst(void);
    
    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
    }
    
    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;
        MPU.MPEN.LONG=(long)1;
        Change_PSW_PM_to_UserMode();
        nop();
        nop();
        nop();
        nop();
        nop();
        nop();
        nop();
        nop();
        nop();
        nop();
        nop();
        nop();
    }
    
    void main(void)
    {
        mpu_init();
        for (;;)
        {
        }
    }
    
    void SuperVisor_Inst(void)
    {
    }
    
    void Access_Inst(void)
    {
    }
    
    void Undefined_Inst(void)
    {
    }
    
    void FloatingPoint_Inst(void)
    {
    }
    
    #ifdef __cplusplus
    void abort(void)
    {
    
    }
    #endif
    


    intprg.c

    6036.intprg.c.txt
    /************************************************************************
    *
    * Device     : RX/RX600/RX63N,RX631
    *
    * File Name  : intprg.c
    *
    * Abstract   : Interrupt Program.
    *
    * History    : 0.10  (2011-02-21)  [Hardware Manual Revision : 0.01]
    *            : 1.00  (2012-06-12)  [Hardware Manual Revision : 1.00]
    *            : 1.10  (2013-02-18)  [Hardware Manual Revision : 1.00]
    *            : 1.8   (2015-04-22)  [Hardware Manual Revision : 1.80]
    *
    * NOTE       : THIS IS A TYPICAL EXAMPLE.
    *
    * Copyright (C) 2015 (2011 - 2013) Renesas Electronics Corporation.
    *
    *********************************************************************/
    #include <machine.h>
    #include "vect.h"
    
    #pragma section IntPRG
    
    // Exception(Supervisor Instruction)
    void SuperVisor_Inst(void);
    void Excep_SuperVisorInst(void){SuperVisor_Inst();}
    
    // Exception(Access Instruction)
    void Access_Inst(void);
    void Excep_AccessInst(void){Access_Inst();}
    
    // Exception(Undefined Instruction)
    void Undefined_Inst(void);
    void Excep_UndefinedInst(void){Undefined_Inst();}
    
    // Exception(Floating Point)
    void FloatingPoint_Inst(void);
    void Excep_FloatingPoint(void){FloatingPoint_Inst();}
    
    // NMI
    void NonMaskableInterrupt(void){/* brk(); */}
    
    // Dummy
    void Dummy(void){/* brk(); */}
    
    // BRK
    void Excep_BRK(void){ wait(); }
    
    // BSC BUSERR
    void Excep_BSC_BUSERR(void){ }
    
    // FCU FIFERR
    void Excep_FCU_FIFERR(void){ }
    
    // FCU FRDYI
    void Excep_FCU_FRDYI(void){ }
    
    // ICU SWINT
    void Excep_ICU_SWINT(void){ }
    
    // CMT0 CMI0
    void Excep_CMT0_CMI0(void){ }
    
    // CMT1 CMI1
    void Excep_CMT1_CMI1(void){ }
    
    // CMT2 CMI2
    void Excep_CMT2_CMI2(void){ }
    
    // CMT3 CMI3
    void Excep_CMT3_CMI3(void){ }
    
    // ETHER EINT
    void Excep_ETHER_EINT(void){ }
    
    // USB0 D0FIFO0
    void Excep_USB0_D0FIFO0(void){ }
    
    // USB0 D1FIFO0
    void Excep_USB0_D1FIFO0(void){ }
    
    // USB0 USBI0
    void Excep_USB0_USBI0(void){ }
    
    // USB1 D0FIFO1
    void Excep_USB1_D0FIFO1(void){ }
    
    // USB1 D1FIFO1
    void Excep_USB1_D1FIFO1(void){ }
    
    // USB1 USBI1
    void Excep_USB1_USBI1(void){ }
    
    // RSPI0 SPRI0
    void Excep_RSPI0_SPRI0(void){ }
    
    // RSPI0 SPTI0
    void Excep_RSPI0_SPTI0(void){ }
    
    // RSPI0 SPII0
    void Excep_RSPI0_SPII0(void){ }
    
    // RSPI1 SPRI1
    void Excep_RSPI1_SPRI1(void){ }
    
    // RSPI1 SPTI1
    void Excep_RSPI1_SPTI1(void){ }
    
    // RSPI1 SPII1
    void Excep_RSPI1_SPII1(void){ }
    
    // RSPI2 SPRI2
    void Excep_RSPI2_SPRI2(void){ }
    
    // RSPI2 SPTI2
    void Excep_RSPI2_SPTI2(void){ }
    
    // RSPI2 SPII2
    void Excep_RSPI2_SPII2(void){ }
    
    // CAN0 RXF0
    void Excep_CAN0_RXF0(void){ }
    
    // CAN0 TXF0
    void Excep_CAN0_TXF0(void){ }
    
    // CAN0 RXM0
    void Excep_CAN0_RXM0(void){ }
    
    // CAN0 TXM0
    void Excep_CAN0_TXM0(void){ }
    
    // CAN1 RXF1
    void Excep_CAN1_RXF1(void){ }
    
    // CAN1 TXF1
    void Excep_CAN1_TXF1(void){ }
    
    // CAN1 RXM1
    void Excep_CAN1_RXM1(void){ }
    
    // CAN1 TXM1
    void Excep_CAN1_TXM1(void){ }
    
    // CAN2 RXF2
    void Excep_CAN2_RXF2(void){ }
    
    // CAN2 TXF2
    void Excep_CAN2_TXF2(void){ }
    
    // CAN2 RXM2
    void Excep_CAN2_RXM2(void){ }
    
    // CAN2 TXM2
    void Excep_CAN2_TXM2(void){ }
    
    // RTC CUP
    void Excep_RTC_CUP(void){ }
    
    // ICU IRQ0
    void Excep_ICU_IRQ0(void){ }
    
    // ICU IRQ1
    void Excep_ICU_IRQ1(void){ }
    
    // ICU IRQ2
    void Excep_ICU_IRQ2(void){ }
    
    // ICU IRQ3
    void Excep_ICU_IRQ3(void){ }
    
    // ICU IRQ4
    void Excep_ICU_IRQ4(void){ }
    
    // ICU IRQ5
    void Excep_ICU_IRQ5(void){ }
    
    // ICU IRQ6
    void Excep_ICU_IRQ6(void){ }
    
    // ICU IRQ7
    void Excep_ICU_IRQ7(void){ }
    
    // ICU IRQ8
    void Excep_ICU_IRQ8(void){ }
    
    // ICU IRQ9
    void Excep_ICU_IRQ9(void){ }
    
    // ICU IRQ10
    void Excep_ICU_IRQ10(void){ }
    
    // ICU IRQ11
    void Excep_ICU_IRQ11(void){ }
    
    // ICU IRQ12
    void Excep_ICU_IRQ12(void){ }
    
    // ICU IRQ13
    void Excep_ICU_IRQ13(void){ }
    
    // ICU IRQ14
    void Excep_ICU_IRQ14(void){ }
    
    // ICU IRQ15
    void Excep_ICU_IRQ15(void){ }
    
    // USB USBR0
    void Excep_USB_USBR0(void){ }
    
    // USB USBR1
    void Excep_USB_USBR1(void){ }
    
    // RTC ALM
    void Excep_RTC_ALM(void){ }
    
    // RTC PRD
    void Excep_RTC_PRD(void){ }
    
    // AD ADI0
    void Excep_AD_ADI0(void){ }
    
    // S12AD S12ADI0
    void Excep_S12AD_S12ADI0(void){ }
    
    // ICU GROUP0
    void Excep_ICU_GROUP0(void){ }
    
    // ICU GROUP1
    void Excep_ICU_GROUP1(void){ }
    
    // ICU GROUP2
    void Excep_ICU_GROUP2(void){ }
    
    // ICU GROUP3
    void Excep_ICU_GROUP3(void){ }
    
    // ICU GROUP4
    void Excep_ICU_GROUP4(void){ }
    
    // ICU GROUP5
    void Excep_ICU_GROUP5(void){ }
    
    // ICU GROUP6
    void Excep_ICU_GROUP6(void){ }
    
    // ICU GROUP12
    void Excep_ICU_GROUP12(void){ }
    
    // SCI12 SCIX0
    void Excep_SCI12_SCIX0(void){ }
    
    // SCI12 SCIX1
    void Excep_SCI12_SCIX1(void){ }
    
    // SCI12 SCIX2
    void Excep_SCI12_SCIX2(void){ }
    
    // SCI12 SCIX3
    void Excep_SCI12_SCIX3(void){ }
    
    // TPU0 TGI0A
    void Excep_TPU0_TGI0A(void){ }
    
    // TPU0 TGI0B
    void Excep_TPU0_TGI0B(void){ }
    
    // TPU0 TGI0C
    void Excep_TPU0_TGI0C(void){ }
    
    // TPU0 TGI0D
    void Excep_TPU0_TGI0D(void){ }
    
    // TPU1 TGI1A
    void Excep_TPU1_TGI1A(void){ }
    
    // TPU1 TGI1B
    void Excep_TPU1_TGI1B(void){ }
    
    // TPU2 TGI2A
    void Excep_TPU2_TGI2A(void){ }
    
    // TPU2 TGI2B
    void Excep_TPU2_TGI2B(void){ }
    
    // TPU3 TGI3A
    void Excep_TPU3_TGI3A(void){ }
    
    // TPU3 TGI3B
    void Excep_TPU3_TGI3B(void){ }
    
    // TPU3 TGI3C
    void Excep_TPU3_TGI3C(void){ }
    
    // TPU3 TGI3D
    void Excep_TPU3_TGI3D(void){ }
    
    // TPU4 TGI4A
    void Excep_TPU4_TGI4A(void){ }
    
    // TPU4 TGI4B
    void Excep_TPU4_TGI4B(void){ }
    
    // TPU5 TGI5A
    void Excep_TPU5_TGI5A(void){ }
    
    // TPU5 TGI5B
    void Excep_TPU5_TGI5B(void){ }
    
    // TPU6 TGI6A
    void Excep_TPU6_TGI6A(void){ }
    
    // TPU6 TGI6B
    void Excep_TPU6_TGI6B(void){ }
    
    // TPU6 TGI6C
    void Excep_TPU6_TGI6C(void){ }
    
    // TPU6 TGI6D
    void Excep_TPU6_TGI6D(void){ }
    
    ///##############################################
    // MTU0 TGIA0
    void Excep_MTU0_TGIA0(void){ }
    
    // MTU0 TGIB0
    void Excep_MTU0_TGIB0(void){ }
    
    // MTU0 TGIC0
    void Excep_MTU0_TGIC0(void){ }
    
    // MTU0 TGID0
    void Excep_MTU0_TGID0(void){ }
    ///##############################################
    
    // MTU0 TGIE0
    void Excep_MTU0_TGIE0(void){ }
    
    // MTU0 TGIF0
    void Excep_MTU0_TGIF0(void){ }
    
    // TPU7 TGI7A
    void Excep_TPU7_TGI7A(void){ }
    
    // TPU7 TGI7B
    void Excep_TPU7_TGI7B(void){ }
    
    ///##############################################
    // MTU1 TGIA1
    void Excep_MTU1_TGIA1(void){ }
    
    // MTU1 TGIB1
    void Excep_MTU1_TGIB1(void){ }
    ///##############################################
    
    // TPU8 TGI8A
    void Excep_TPU8_TGI8A(void){ }
    
    // TPU8 TGI8B
    void Excep_TPU8_TGI8B(void){ }
    
    ///##############################################
    // MTU2 TGIA2
    void Excep_MTU2_TGIA2(void){ }
    
    // MTU2 TGIB2
    void Excep_MTU2_TGIB2(void){ }
    ///##############################################
    
    // TPU9 TGI9A
    void Excep_TPU9_TGI9A(void){ }
    
    // TPU9 TGI9B
    void Excep_TPU9_TGI9B(void){ }
    
    // TPU9 TGI9C
    void Excep_TPU9_TGI9C(void){ }
    
    // TPU9 TGI9D
    void Excep_TPU9_TGI9D(void){ }
    
    ///##############################################
    // MTU3 TGIA3
    void Excep_MTU3_TGIA3(void){ }
    
    // MTU3 TGIB3
    void Excep_MTU3_TGIB3(void){ }
    
    // MTU3 TGIC3
    void Excep_MTU3_TGIC3(void){ }
    
    // MTU3 TGID3
    void Excep_MTU3_TGID3(void){ }
    ///##############################################
    
    // TPU10 TGI10A
    void Excep_TPU10_TGI10A(void){ }
    
    // TPU10 TGI10B
    void Excep_TPU10_TGI10B(void){ }
    
    ///##############################################
    // MTU4 TGIA4
    void Excep_MTU4_TGIA4(void){ }
    
    // MTU4 TGIB4
    void Excep_MTU4_TGIB4(void){ }
    ///##############################################
    
    // MTU4 TGIC4
    void Excep_MTU4_TGIC4(void){ }
    
    // MTU4 TGID4
    void Excep_MTU4_TGID4(void){ }
    
    // MTU4 TCIV4
    void Excep_MTU4_TCIV4(void){ }
    
    // TPU11 TGI11A
    void Excep_TPU11_TGI11A(void){ }
    
    // TPU11 TGI11B
    void Excep_TPU11_TGI11B(void){ }
    
    // MTU5 TGIU5
    void Excep_MTU5_TGIU5(void){ }
    
    // MTU5 TGIV5
    void Excep_MTU5_TGIV5(void){ }
    
    // MTU5 TGIW5
    void Excep_MTU5_TGIW5(void){ }
    
    // POE OEI1
    void Excep_POE_OEI1(void){ }
    
    // POE OEI2
    void Excep_POE_OEI2(void){ }
    
    // TMR0 CMIA0
    void Excep_TMR0_CMIA0(void){ }
    
    // TMR0 CMIB0
    void Excep_TMR0_CMIB0(void){ }
    
    // TMR0 OVI0
    void Excep_TMR0_OVI0(void){ }
    
    // TMR1 CMIA1
    void Excep_TMR1_CMIA1(void){ }
    
    // TMR1 CMIB1
    void Excep_TMR1_CMIB1(void){ }
    
    // TMR1 OVI1
    void Excep_TMR1_OVI1(void){ }
    
    // TMR2 CMIA2
    void Excep_TMR2_CMIA2(void){ }
    
    // TMR2 CMIB2
    void Excep_TMR2_CMIB2(void){ }
    
    // TMR2 OVI2
    void Excep_TMR2_OVI2(void){ }
    
    // TMR3 CMIA3
    void Excep_TMR3_CMIA3(void){ }
    
    // TMR3 CMIB3
    void Excep_TMR3_CMIB3(void){ }
    
    // TMR3 OVI3
    void Excep_TMR3_OVI3(void){ }
    
    // RIIC0 EEI0
    void Excep_RIIC0_EEI0(void){ }
    
    // RIIC0 RXI0
    void Excep_RIIC0_RXI0(void){ }
    
    // RIIC0 TXI0
    void Excep_RIIC0_TXI0(void){ }
    
    // RIIC0 TEI0
    void Excep_RIIC0_TEI0(void){ }
    
    // RIIC1 EEI1
    void Excep_RIIC1_EEI1(void){ }
    
    // RIIC1 RXI1
    void Excep_RIIC1_RXI1(void){ }
    
    // RIIC1 TXI1
    void Excep_RIIC1_TXI1(void){ }
    
    // RIIC1 TEI1
    void Excep_RIIC1_TEI1(void){ }
    
    // RIIC2 EEI2
    void Excep_RIIC2_EEI2(void){ }
    
    // RIIC2 RXI2
    void Excep_RIIC2_RXI2(void){ }
    
    // RIIC2 TXI2
    void Excep_RIIC2_TXI2(void){ }
    
    // RIIC2 TEI2
    void Excep_RIIC2_TEI2(void){ }
    
    // RIIC3 EEI3
    void Excep_RIIC3_EEI3(void){ }
    
    // RIIC3 RXI3
    void Excep_RIIC3_RXI3(void){ }
    
    // RIIC3 TXI3
    void Excep_RIIC3_TXI3(void){ }
    
    // RIIC3 TEI3
    void Excep_RIIC3_TEI3(void){ }
    
    // DMAC DMAC0I
    void Excep_DMAC_DMAC0I(void){ }
    
    // DMAC DMAC1I
    void Excep_DMAC_DMAC1I(void){ }
    
    // DMAC DMAC2I
    void Excep_DMAC_DMAC2I(void){ }
    
    // DMAC DMAC3I
    void Excep_DMAC_DMAC3I(void){ }
    
    // EXDMAC EXDMAC0I
    void Excep_EXDMAC_EXDMAC0I(void){ }
    
    // EXDMAC EXDMAC1I
    void Excep_EXDMAC_EXDMAC1I(void){ }
    
    // DEU DEU0
    void Excep_DEU_DEU0(void){ }
    
    // DEU DEU1
    void Excep_DEU_DEU1(void){ }
    
    // PDC PCDFI
    void Excep_PDC_PCDFI(void){ }
    
    // PDC PCFEI
    void Excep_PDC_PCFEI(void){ }
    
    // PDC PCERI
    void Excep_PDC_PCERI(void){ }
    
    // SCI0 RXI0
    void Excep_SCI0_RXI0(void){ }
    
    // SCI0 TXI0
    void Excep_SCI0_TXI0(void){ }
    
    // SCI0 TEI0
    void Excep_SCI0_TEI0(void){ }
    
    // SCI1 RXI1
    void Excep_SCI1_RXI1(void){ }
    
    // SCI1 TXI1
    void Excep_SCI1_TXI1(void){ }
    
    // SCI1 TEI1
    void Excep_SCI1_TEI1(void){ }
    
    // SCI2 RXI2
    void Excep_SCI2_RXI2(void){ }
    
    // SCI2 TXI2
    void Excep_SCI2_TXI2(void){ }
    
    // SCI2 TEI2
    void Excep_SCI2_TEI2(void){ }
    
    // SCI3 RXI3
    void Excep_SCI3_RXI3(void){ }
    
    // SCI3 TXI3
    void Excep_SCI3_TXI3(void){ }
    
    // SCI3 TEI3
    void Excep_SCI3_TEI3(void){ }
    
    // SCI4 RXI4
    void Excep_SCI4_RXI4(void){ }
    
    // SCI4 TXI4
    void Excep_SCI4_TXI4(void){ }
    
    // SCI4 TEI4
    void Excep_SCI4_TEI4(void){ }
    
    // SCI5 RXI5
    void Excep_SCI5_RXI5(void){ }
    
    // SCI5 TXI5
    void Excep_SCI5_TXI5(void){ }
    
    // SCI5 TEI5
    void Excep_SCI5_TEI5(void){ }
    
    // SCI6 RXI6
    void Excep_SCI6_RXI6(void){ }
    
    // SCI6 TXI6
    void Excep_SCI6_TXI6(void){ }
    
    // SCI6 TEI6
    void Excep_SCI6_TEI6(void){ }
    
    // SCI7 RXI7
    void Excep_SCI7_RXI7(void){ }
    
    // SCI7 TXI7
    void Excep_SCI7_TXI7(void){ }
    
    // SCI7 TEI7
    void Excep_SCI7_TEI7(void){ }
    
    // SCI8 RXI8
    void Excep_SCI8_RXI8(void){ }
    
    // SCI8 TXI8
    void Excep_SCI8_TXI8(void){ }
    
    // SCI8 TEI8
    void Excep_SCI8_TEI8(void){ }
    
    // SCI9 RXI9
    void Excep_SCI9_RXI9(void){ }
    
    // SCI9 TXI9
    void Excep_SCI9_TXI9(void){ }
    
    // SCI9 TEI9
    void Excep_SCI9_TEI9(void){ }
    
    // SCI10 RXI10
    void Excep_SCI10_RXI10(void){ }
    
    // SCI10 TXI10
    void Excep_SCI10_TXI10(void){ }
    
    // SCI10 TEI10
    void Excep_SCI10_TEI10(void){ }
    
    // SCI11 RXI11
    void Excep_SCI11_RXI11(void){ }
    
    // SCI11 TXI11
    void Excep_SCI11_TXI11(void){ }
    
    // SCI11 TEI11
    void Excep_SCI11_TEI11(void){ }
    
    // SCI12 RXI12
    void Excep_SCI12_RXI12(void){ }
    
    // SCI12 TXI12
    void Excep_SCI12_TXI12(void){ }
    
    // SCI12 TEI12
    void Excep_SCI12_TEI12(void){ }
    
    // IEB IEBINT
    void Excep_IEB_IEBINT(void){ }
    


    resetprg.c (これはプロジェクト生成時から変更していません)

    8468.resetprg.c.txt
    /*********************************************************************
    *
    * Device     : RX/RX600
    *
    * File Name  : resetprg.c
    *
    * Abstract   : Reset Program.
    *
    * History    : 1.00  (2009-08-07)
    *            : 1.10  (2011-02-21)
    *            : 1.11  (2011-06-20)
    *            : 1.12  (2014-02-20)
    *            : 1.20  (2014-10-22)
    *
    * NOTE       : THIS IS A TYPICAL EXAMPLE.
    *
    * Copyright (C) 2009 (2014) Renesas Electronics Corporation.
    * and Renesas Solutions Corp.
    *
    *********************************************************************/
    
    #include	<machine.h>
    #include	<_h_c_lib.h>
    //#include	<stddef.h>					// Remove the comment when you use errno
    //#include 	<stdlib.h>					// Remove the comment when you use rand()
    #include	"typedefine.h"		// Define Types
    #include	"stacksct.h"		// Stack Sizes (Interrupt and User)
    
    #ifdef __cplusplus
    extern "C" {
    #endif
    void PowerON_Reset_PC(void);
    void main(void);
    #ifdef __cplusplus
    }
    #endif
    
    //#ifdef __cplusplus				// Use SIM I/O
    //extern "C" {
    //#endif
    //extern void _INIT_IOLIB(void);
    //extern void _CLOSEALL(void);
    //#ifdef __cplusplus
    //}
    //#endif
    
    #define PSW_init  0x00010000	// PSW bit pattern
    #define FPSW_init 0x00000000	// FPSW bit base pattern
    
    //extern void srand(_UINT);		// Remove the comment when you use rand()
    //extern _SBYTE *_s1ptr;				// Remove the comment when you use strtok()
    		
    //#ifdef __cplusplus				// Use Hardware Setup
    //extern "C" {
    //#endif
    //extern void HardwareSetup(void);
    //#ifdef __cplusplus
    //}
    //#endif
    	
    //#ifdef __cplusplus			// Remove the comment when you use global class object
    //extern "C" {					// Sections C$INIT and C$END will be generated
    //#endif
    //extern void _CALL_INIT(void);
    //extern void _CALL_END(void);
    //#ifdef __cplusplus
    //}
    //#endif
    
    #pragma section ResetPRG		// output PowerON_Reset to PResetPRG section
    
    #pragma entry PowerON_Reset_PC
    
    void PowerON_Reset_PC(void)
    { 
    #ifdef __RXV2
    	set_extb(__sectop("EXCEPTVECT"));
    #endif
    	set_intb(__sectop("C$VECT"));
    
    #ifdef __FPU
    #ifdef __ROZ					// Initialize FPSW
    #define _ROUND 0x00000001			// Let FPSW RMbits=01 (round to zero)
    #else
    #define _ROUND 0x00000000			// Let FPSW RMbits=00 (round to nearest)
    #endif
    #ifdef __DOFF
    #define _DENOM 0x00000100			// Let FPSW DNbit=1 (denormal as zero)
    #else
    #define _DENOM 0x00000000			// Let FPSW DNbit=0 (denormal as is)
    #endif
    	set_fpsw(FPSW_init | _ROUND | _DENOM);
    #endif
    
    	_INITSCT();
    
    //	_INIT_IOLIB();					// Use SIM I/O
    
    //	errno=0;						// Remove the comment when you use errno
    //	srand((_UINT)1);					// Remove the comment when you use rand()
    //	_s1ptr=NULL;					// Remove the comment when you use strtok()
    		
    //	HardwareSetup();				// Use Hardware Setup
        nop();
    
    //	_CALL_INIT();					// Remove the comment when you use global class object
    
    	set_psw(PSW_init);				// Set Ubit & Ibit for PSW
    //	chg_pmusr();					// Remove the comment when you need to change PSW PMbit (SuperVisor->User)
    
    	main();
    
    //	_CLOSEALL();					// Use SIM I/O
    	
    //	_CALL_END();					// Remove the comment when you use global class object
    
    	brk();
    }
    
    


    [追記]

    RX62N,RX621グループ用のアプリケーションノートでは、Change_PSW_PM_to_UserMode()はmain()の先頭で呼び出されていました。

    void main(void)
    {
        Change_PSW_PM_to_UserMode();    // Change PSW PMbit (SuperVisor->User)

        /* initialize private global variables */
        以後省略

    あと、サブルーチン内のChange_PSW_PM_to_UserMode()でIスタックから使用していないUスタックへ切り替わると、サブルーチンから戻る時の戻り番地は滅茶苦茶なアドレスだと考えられます。そこで(あるいはその先で)、特権命令例外、未定義命令例外、などが発生すると、前の投稿に書いた動作により、それ以上はプログラムは先へ進まなくなる筈だと考えられます。他方、そしてそこが割り込み許可状態のところであれば、割り込み処理だけは行われ続ける筈だと考えられます。(これらの例外ハンドラ中で'/'とか'+'とかを送信するようにしておけば、確証を得られる可能性がありそうな気もします。)

    ちなみに、CC-RXでは、RX62N,RX621グループ用のアプリケーションノートのChange_PSW_PM_to_UserMode()と同じ機能を提供するchg_pmusr()という組み込み関数があり、PowerON_Reset_PC()から呼び出すようになっていました。(ただし、デフォルトではコメントアウトされています。)

    resetprg.cより抜粋

    void PowerON_Reset_PC(void)
    {
    #ifdef __RXV2
        set_extb(__sectop("EXCEPTVECT"));
    #endif
        set_intb(__sectop("C$VECT"));

    #ifdef __FPU
        途中省略
        set_fpsw(FPSW_init | _ROUND | _DENOM);
    #endif

        _INITSCT();

    //  _INIT_IOLIB();                  // Use SIM I/O

    //  errno=0;                        // Remove the comment when you use errno
    //  srand((_UINT)1);                    // Remove the comment when you use rand()
    //  _s1ptr=NULL;                    // Remove the comment when you use strtok()
            
    //  HardwareSetup();                // Use Hardware Setup
        nop();

    //  _CALL_INIT();                   // Remove the comment when you use global class object

        set_psw(PSW_init);              // Set Ubit & Ibit for PSW
    //  chg_pmusr();                    // Remove the comment when you need to change PSW PMbit (SuperVisor->User)

        main();

    //  _CLOSEALL();                    // Use SIM I/O

    //  _CALL_END();                    // Remove the comment when you use global class object

        brk();
    }

    なお、試した先程のプログラムでChange_PSW_PM_to_UserMode()の代わりにchg_pmusr()を記述すると以下の通りの逆アセンブル表示になりました。(これは冗長かも。BTSTとBNE.Bはコードサイズと実行クロック数の無駄ですし、([訂正]すみません、ユーザーモードだったら即抜けるというコードでした) ADDはコードが長くなる命令コードを必要性が無いのに使っていますし。)

     89                       //Change_PSW_PM_to_UserMode();
     90                       chg_pmusr();
        fff00641 fd6a0e       MVFC        PSW,R14
        fff00644 7d4e         BTST        #20,R14
        fff00646 2116         BNE.B       _mpu_init+CEH      (RTE命令の次の命令のアドレス)
        fff00648 773e000010   OR          #100000H,R14
        fff0064d 7eae         PUSH.L      R14
        fff0064f fd6a1e       MVFC        PC,R14
        fff00652 70ee0d000000 ADD         #0000000DH,R14,R14 (RTE命令の次の命令のアドレス)
        fff00658 7eae         PUSH.L      R14
        fff0065a 7f95         RTE         



    [追記]

    ユーザモードではUスタック/Iスタックの切り替えは出来ませんでした。ですので、ユーザモードはUスタックを使い、スーパバイザモードはIスタックを使う、という方式でやるしかないようです。

    2.3.2 ユーザモード (赤枠は私が書いたものです)
    resource.renesas.com/resource/lib/jpn/online_docs/um/RX/RX63N_RX631_ja/?CPU#TOC_2_3_2


Reply
  • IKUZOさん、こんにちは。NoMaYです。

    ユーザモードに関して以下の話が出ていないことに気付きました。(もっとも、私もRXシミュレータでデバッグしていて気付いたばかりですが。)

    ユーザモードに移行した時のスタックポインタ

    ・スーパバイザモードからユーザモードに遷移するとスタックポインタがUスタックへ強制的に切り替わる。

    ・CC-RXの標準のスタートアップルーチンはmain()に制御が移った時点ではUスタックではなくIスタックを使っている。

    ・ゆえに、スタートアップルーチンのPSWの初期値を変更してUスタックを使うように変更しなければならない。(もしかするとChange_PSW_PM_to_UserMode()を改造することでIスタックのみでも出来るかも知れませんが、、、)([訂正]すみません、CPUの仕様的に不可能でした) (あるいは、Iスタックでのサブルーチン内ではChange_PSW_PM_to_UserMode()を実行しないよう、運用で対処する。)

    2.3.4 プロセッサモード間の移行 (赤枠は私が書いたものです)
    resource.renesas.com/resource/lib/jpn/online_docs/um/RX/RX63N_RX631_ja/?CPU#TOC_2_3_4


    以下、RXシミュレータでデバッグしてみた時の画面コピーです。(当方特有の事情によりCC-RX V2.03を使用しています。)

    Change_PSW_PM_to_UserMode()の末尾のRTE命令実行前: Iスタックを使用中


    Change_PSW_PM_to_UserMode()の末尾のRTE命令実行後: 使用していないUスタックに切り替えられてしまった


    以下、試したプログラムです。

    irom.c

    1777.irom.c.txt
    /***********************************************************************/
    /*                                                                     */
    /*  FILE        :Main.c or Main.cpp                                    */
    /*  DATE        :Tue, Oct 31, 2006                                     */
    /*  DESCRIPTION :Main Program                                          */
    /*  CPU TYPE    :                                                      */
    /*                                                                     */
    /*  NOTE:THIS IS A TYPICAL EXAMPLE.                                    */
    /*                                                                     */
    /***********************************************************************/
    //#include "typedefine.h"
    #ifdef __cplusplus
    //#include <ios>                        // Remove the comment when you use ios
    //_SINT ios_base::Init::init_cnt;       // Remove the comment when you use ios
    #endif
    
    void main(void);
    #ifdef __cplusplus
    extern "C" {
    void abort(void);
    }
    #endif
    
    #include <machine.h>
    #include "iodefine.h"
    #define FPSW_EZ 0x00001000
    #pragma inline_asm Change_PSW_PM_to_UserMode
    void Change_PSW_PM_to_UserMode(void);
    void mpu_init(void);
    void main(void);
    void SuperVisor_Inst(void);
    void Access_Inst(void);
    void Undefined_Inst(void);
    void FloatingPoint_Inst(void);
    
    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
    }
    
    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;
        MPU.MPEN.LONG=(long)1;
        Change_PSW_PM_to_UserMode();
        nop();
        nop();
        nop();
        nop();
        nop();
        nop();
        nop();
        nop();
        nop();
        nop();
        nop();
        nop();
    }
    
    void main(void)
    {
        mpu_init();
        for (;;)
        {
        }
    }
    
    void SuperVisor_Inst(void)
    {
    }
    
    void Access_Inst(void)
    {
    }
    
    void Undefined_Inst(void)
    {
    }
    
    void FloatingPoint_Inst(void)
    {
    }
    
    #ifdef __cplusplus
    void abort(void)
    {
    
    }
    #endif
    


    intprg.c

    6036.intprg.c.txt
    /************************************************************************
    *
    * Device     : RX/RX600/RX63N,RX631
    *
    * File Name  : intprg.c
    *
    * Abstract   : Interrupt Program.
    *
    * History    : 0.10  (2011-02-21)  [Hardware Manual Revision : 0.01]
    *            : 1.00  (2012-06-12)  [Hardware Manual Revision : 1.00]
    *            : 1.10  (2013-02-18)  [Hardware Manual Revision : 1.00]
    *            : 1.8   (2015-04-22)  [Hardware Manual Revision : 1.80]
    *
    * NOTE       : THIS IS A TYPICAL EXAMPLE.
    *
    * Copyright (C) 2015 (2011 - 2013) Renesas Electronics Corporation.
    *
    *********************************************************************/
    #include <machine.h>
    #include "vect.h"
    
    #pragma section IntPRG
    
    // Exception(Supervisor Instruction)
    void SuperVisor_Inst(void);
    void Excep_SuperVisorInst(void){SuperVisor_Inst();}
    
    // Exception(Access Instruction)
    void Access_Inst(void);
    void Excep_AccessInst(void){Access_Inst();}
    
    // Exception(Undefined Instruction)
    void Undefined_Inst(void);
    void Excep_UndefinedInst(void){Undefined_Inst();}
    
    // Exception(Floating Point)
    void FloatingPoint_Inst(void);
    void Excep_FloatingPoint(void){FloatingPoint_Inst();}
    
    // NMI
    void NonMaskableInterrupt(void){/* brk(); */}
    
    // Dummy
    void Dummy(void){/* brk(); */}
    
    // BRK
    void Excep_BRK(void){ wait(); }
    
    // BSC BUSERR
    void Excep_BSC_BUSERR(void){ }
    
    // FCU FIFERR
    void Excep_FCU_FIFERR(void){ }
    
    // FCU FRDYI
    void Excep_FCU_FRDYI(void){ }
    
    // ICU SWINT
    void Excep_ICU_SWINT(void){ }
    
    // CMT0 CMI0
    void Excep_CMT0_CMI0(void){ }
    
    // CMT1 CMI1
    void Excep_CMT1_CMI1(void){ }
    
    // CMT2 CMI2
    void Excep_CMT2_CMI2(void){ }
    
    // CMT3 CMI3
    void Excep_CMT3_CMI3(void){ }
    
    // ETHER EINT
    void Excep_ETHER_EINT(void){ }
    
    // USB0 D0FIFO0
    void Excep_USB0_D0FIFO0(void){ }
    
    // USB0 D1FIFO0
    void Excep_USB0_D1FIFO0(void){ }
    
    // USB0 USBI0
    void Excep_USB0_USBI0(void){ }
    
    // USB1 D0FIFO1
    void Excep_USB1_D0FIFO1(void){ }
    
    // USB1 D1FIFO1
    void Excep_USB1_D1FIFO1(void){ }
    
    // USB1 USBI1
    void Excep_USB1_USBI1(void){ }
    
    // RSPI0 SPRI0
    void Excep_RSPI0_SPRI0(void){ }
    
    // RSPI0 SPTI0
    void Excep_RSPI0_SPTI0(void){ }
    
    // RSPI0 SPII0
    void Excep_RSPI0_SPII0(void){ }
    
    // RSPI1 SPRI1
    void Excep_RSPI1_SPRI1(void){ }
    
    // RSPI1 SPTI1
    void Excep_RSPI1_SPTI1(void){ }
    
    // RSPI1 SPII1
    void Excep_RSPI1_SPII1(void){ }
    
    // RSPI2 SPRI2
    void Excep_RSPI2_SPRI2(void){ }
    
    // RSPI2 SPTI2
    void Excep_RSPI2_SPTI2(void){ }
    
    // RSPI2 SPII2
    void Excep_RSPI2_SPII2(void){ }
    
    // CAN0 RXF0
    void Excep_CAN0_RXF0(void){ }
    
    // CAN0 TXF0
    void Excep_CAN0_TXF0(void){ }
    
    // CAN0 RXM0
    void Excep_CAN0_RXM0(void){ }
    
    // CAN0 TXM0
    void Excep_CAN0_TXM0(void){ }
    
    // CAN1 RXF1
    void Excep_CAN1_RXF1(void){ }
    
    // CAN1 TXF1
    void Excep_CAN1_TXF1(void){ }
    
    // CAN1 RXM1
    void Excep_CAN1_RXM1(void){ }
    
    // CAN1 TXM1
    void Excep_CAN1_TXM1(void){ }
    
    // CAN2 RXF2
    void Excep_CAN2_RXF2(void){ }
    
    // CAN2 TXF2
    void Excep_CAN2_TXF2(void){ }
    
    // CAN2 RXM2
    void Excep_CAN2_RXM2(void){ }
    
    // CAN2 TXM2
    void Excep_CAN2_TXM2(void){ }
    
    // RTC CUP
    void Excep_RTC_CUP(void){ }
    
    // ICU IRQ0
    void Excep_ICU_IRQ0(void){ }
    
    // ICU IRQ1
    void Excep_ICU_IRQ1(void){ }
    
    // ICU IRQ2
    void Excep_ICU_IRQ2(void){ }
    
    // ICU IRQ3
    void Excep_ICU_IRQ3(void){ }
    
    // ICU IRQ4
    void Excep_ICU_IRQ4(void){ }
    
    // ICU IRQ5
    void Excep_ICU_IRQ5(void){ }
    
    // ICU IRQ6
    void Excep_ICU_IRQ6(void){ }
    
    // ICU IRQ7
    void Excep_ICU_IRQ7(void){ }
    
    // ICU IRQ8
    void Excep_ICU_IRQ8(void){ }
    
    // ICU IRQ9
    void Excep_ICU_IRQ9(void){ }
    
    // ICU IRQ10
    void Excep_ICU_IRQ10(void){ }
    
    // ICU IRQ11
    void Excep_ICU_IRQ11(void){ }
    
    // ICU IRQ12
    void Excep_ICU_IRQ12(void){ }
    
    // ICU IRQ13
    void Excep_ICU_IRQ13(void){ }
    
    // ICU IRQ14
    void Excep_ICU_IRQ14(void){ }
    
    // ICU IRQ15
    void Excep_ICU_IRQ15(void){ }
    
    // USB USBR0
    void Excep_USB_USBR0(void){ }
    
    // USB USBR1
    void Excep_USB_USBR1(void){ }
    
    // RTC ALM
    void Excep_RTC_ALM(void){ }
    
    // RTC PRD
    void Excep_RTC_PRD(void){ }
    
    // AD ADI0
    void Excep_AD_ADI0(void){ }
    
    // S12AD S12ADI0
    void Excep_S12AD_S12ADI0(void){ }
    
    // ICU GROUP0
    void Excep_ICU_GROUP0(void){ }
    
    // ICU GROUP1
    void Excep_ICU_GROUP1(void){ }
    
    // ICU GROUP2
    void Excep_ICU_GROUP2(void){ }
    
    // ICU GROUP3
    void Excep_ICU_GROUP3(void){ }
    
    // ICU GROUP4
    void Excep_ICU_GROUP4(void){ }
    
    // ICU GROUP5
    void Excep_ICU_GROUP5(void){ }
    
    // ICU GROUP6
    void Excep_ICU_GROUP6(void){ }
    
    // ICU GROUP12
    void Excep_ICU_GROUP12(void){ }
    
    // SCI12 SCIX0
    void Excep_SCI12_SCIX0(void){ }
    
    // SCI12 SCIX1
    void Excep_SCI12_SCIX1(void){ }
    
    // SCI12 SCIX2
    void Excep_SCI12_SCIX2(void){ }
    
    // SCI12 SCIX3
    void Excep_SCI12_SCIX3(void){ }
    
    // TPU0 TGI0A
    void Excep_TPU0_TGI0A(void){ }
    
    // TPU0 TGI0B
    void Excep_TPU0_TGI0B(void){ }
    
    // TPU0 TGI0C
    void Excep_TPU0_TGI0C(void){ }
    
    // TPU0 TGI0D
    void Excep_TPU0_TGI0D(void){ }
    
    // TPU1 TGI1A
    void Excep_TPU1_TGI1A(void){ }
    
    // TPU1 TGI1B
    void Excep_TPU1_TGI1B(void){ }
    
    // TPU2 TGI2A
    void Excep_TPU2_TGI2A(void){ }
    
    // TPU2 TGI2B
    void Excep_TPU2_TGI2B(void){ }
    
    // TPU3 TGI3A
    void Excep_TPU3_TGI3A(void){ }
    
    // TPU3 TGI3B
    void Excep_TPU3_TGI3B(void){ }
    
    // TPU3 TGI3C
    void Excep_TPU3_TGI3C(void){ }
    
    // TPU3 TGI3D
    void Excep_TPU3_TGI3D(void){ }
    
    // TPU4 TGI4A
    void Excep_TPU4_TGI4A(void){ }
    
    // TPU4 TGI4B
    void Excep_TPU4_TGI4B(void){ }
    
    // TPU5 TGI5A
    void Excep_TPU5_TGI5A(void){ }
    
    // TPU5 TGI5B
    void Excep_TPU5_TGI5B(void){ }
    
    // TPU6 TGI6A
    void Excep_TPU6_TGI6A(void){ }
    
    // TPU6 TGI6B
    void Excep_TPU6_TGI6B(void){ }
    
    // TPU6 TGI6C
    void Excep_TPU6_TGI6C(void){ }
    
    // TPU6 TGI6D
    void Excep_TPU6_TGI6D(void){ }
    
    ///##############################################
    // MTU0 TGIA0
    void Excep_MTU0_TGIA0(void){ }
    
    // MTU0 TGIB0
    void Excep_MTU0_TGIB0(void){ }
    
    // MTU0 TGIC0
    void Excep_MTU0_TGIC0(void){ }
    
    // MTU0 TGID0
    void Excep_MTU0_TGID0(void){ }
    ///##############################################
    
    // MTU0 TGIE0
    void Excep_MTU0_TGIE0(void){ }
    
    // MTU0 TGIF0
    void Excep_MTU0_TGIF0(void){ }
    
    // TPU7 TGI7A
    void Excep_TPU7_TGI7A(void){ }
    
    // TPU7 TGI7B
    void Excep_TPU7_TGI7B(void){ }
    
    ///##############################################
    // MTU1 TGIA1
    void Excep_MTU1_TGIA1(void){ }
    
    // MTU1 TGIB1
    void Excep_MTU1_TGIB1(void){ }
    ///##############################################
    
    // TPU8 TGI8A
    void Excep_TPU8_TGI8A(void){ }
    
    // TPU8 TGI8B
    void Excep_TPU8_TGI8B(void){ }
    
    ///##############################################
    // MTU2 TGIA2
    void Excep_MTU2_TGIA2(void){ }
    
    // MTU2 TGIB2
    void Excep_MTU2_TGIB2(void){ }
    ///##############################################
    
    // TPU9 TGI9A
    void Excep_TPU9_TGI9A(void){ }
    
    // TPU9 TGI9B
    void Excep_TPU9_TGI9B(void){ }
    
    // TPU9 TGI9C
    void Excep_TPU9_TGI9C(void){ }
    
    // TPU9 TGI9D
    void Excep_TPU9_TGI9D(void){ }
    
    ///##############################################
    // MTU3 TGIA3
    void Excep_MTU3_TGIA3(void){ }
    
    // MTU3 TGIB3
    void Excep_MTU3_TGIB3(void){ }
    
    // MTU3 TGIC3
    void Excep_MTU3_TGIC3(void){ }
    
    // MTU3 TGID3
    void Excep_MTU3_TGID3(void){ }
    ///##############################################
    
    // TPU10 TGI10A
    void Excep_TPU10_TGI10A(void){ }
    
    // TPU10 TGI10B
    void Excep_TPU10_TGI10B(void){ }
    
    ///##############################################
    // MTU4 TGIA4
    void Excep_MTU4_TGIA4(void){ }
    
    // MTU4 TGIB4
    void Excep_MTU4_TGIB4(void){ }
    ///##############################################
    
    // MTU4 TGIC4
    void Excep_MTU4_TGIC4(void){ }
    
    // MTU4 TGID4
    void Excep_MTU4_TGID4(void){ }
    
    // MTU4 TCIV4
    void Excep_MTU4_TCIV4(void){ }
    
    // TPU11 TGI11A
    void Excep_TPU11_TGI11A(void){ }
    
    // TPU11 TGI11B
    void Excep_TPU11_TGI11B(void){ }
    
    // MTU5 TGIU5
    void Excep_MTU5_TGIU5(void){ }
    
    // MTU5 TGIV5
    void Excep_MTU5_TGIV5(void){ }
    
    // MTU5 TGIW5
    void Excep_MTU5_TGIW5(void){ }
    
    // POE OEI1
    void Excep_POE_OEI1(void){ }
    
    // POE OEI2
    void Excep_POE_OEI2(void){ }
    
    // TMR0 CMIA0
    void Excep_TMR0_CMIA0(void){ }
    
    // TMR0 CMIB0
    void Excep_TMR0_CMIB0(void){ }
    
    // TMR0 OVI0
    void Excep_TMR0_OVI0(void){ }
    
    // TMR1 CMIA1
    void Excep_TMR1_CMIA1(void){ }
    
    // TMR1 CMIB1
    void Excep_TMR1_CMIB1(void){ }
    
    // TMR1 OVI1
    void Excep_TMR1_OVI1(void){ }
    
    // TMR2 CMIA2
    void Excep_TMR2_CMIA2(void){ }
    
    // TMR2 CMIB2
    void Excep_TMR2_CMIB2(void){ }
    
    // TMR2 OVI2
    void Excep_TMR2_OVI2(void){ }
    
    // TMR3 CMIA3
    void Excep_TMR3_CMIA3(void){ }
    
    // TMR3 CMIB3
    void Excep_TMR3_CMIB3(void){ }
    
    // TMR3 OVI3
    void Excep_TMR3_OVI3(void){ }
    
    // RIIC0 EEI0
    void Excep_RIIC0_EEI0(void){ }
    
    // RIIC0 RXI0
    void Excep_RIIC0_RXI0(void){ }
    
    // RIIC0 TXI0
    void Excep_RIIC0_TXI0(void){ }
    
    // RIIC0 TEI0
    void Excep_RIIC0_TEI0(void){ }
    
    // RIIC1 EEI1
    void Excep_RIIC1_EEI1(void){ }
    
    // RIIC1 RXI1
    void Excep_RIIC1_RXI1(void){ }
    
    // RIIC1 TXI1
    void Excep_RIIC1_TXI1(void){ }
    
    // RIIC1 TEI1
    void Excep_RIIC1_TEI1(void){ }
    
    // RIIC2 EEI2
    void Excep_RIIC2_EEI2(void){ }
    
    // RIIC2 RXI2
    void Excep_RIIC2_RXI2(void){ }
    
    // RIIC2 TXI2
    void Excep_RIIC2_TXI2(void){ }
    
    // RIIC2 TEI2
    void Excep_RIIC2_TEI2(void){ }
    
    // RIIC3 EEI3
    void Excep_RIIC3_EEI3(void){ }
    
    // RIIC3 RXI3
    void Excep_RIIC3_RXI3(void){ }
    
    // RIIC3 TXI3
    void Excep_RIIC3_TXI3(void){ }
    
    // RIIC3 TEI3
    void Excep_RIIC3_TEI3(void){ }
    
    // DMAC DMAC0I
    void Excep_DMAC_DMAC0I(void){ }
    
    // DMAC DMAC1I
    void Excep_DMAC_DMAC1I(void){ }
    
    // DMAC DMAC2I
    void Excep_DMAC_DMAC2I(void){ }
    
    // DMAC DMAC3I
    void Excep_DMAC_DMAC3I(void){ }
    
    // EXDMAC EXDMAC0I
    void Excep_EXDMAC_EXDMAC0I(void){ }
    
    // EXDMAC EXDMAC1I
    void Excep_EXDMAC_EXDMAC1I(void){ }
    
    // DEU DEU0
    void Excep_DEU_DEU0(void){ }
    
    // DEU DEU1
    void Excep_DEU_DEU1(void){ }
    
    // PDC PCDFI
    void Excep_PDC_PCDFI(void){ }
    
    // PDC PCFEI
    void Excep_PDC_PCFEI(void){ }
    
    // PDC PCERI
    void Excep_PDC_PCERI(void){ }
    
    // SCI0 RXI0
    void Excep_SCI0_RXI0(void){ }
    
    // SCI0 TXI0
    void Excep_SCI0_TXI0(void){ }
    
    // SCI0 TEI0
    void Excep_SCI0_TEI0(void){ }
    
    // SCI1 RXI1
    void Excep_SCI1_RXI1(void){ }
    
    // SCI1 TXI1
    void Excep_SCI1_TXI1(void){ }
    
    // SCI1 TEI1
    void Excep_SCI1_TEI1(void){ }
    
    // SCI2 RXI2
    void Excep_SCI2_RXI2(void){ }
    
    // SCI2 TXI2
    void Excep_SCI2_TXI2(void){ }
    
    // SCI2 TEI2
    void Excep_SCI2_TEI2(void){ }
    
    // SCI3 RXI3
    void Excep_SCI3_RXI3(void){ }
    
    // SCI3 TXI3
    void Excep_SCI3_TXI3(void){ }
    
    // SCI3 TEI3
    void Excep_SCI3_TEI3(void){ }
    
    // SCI4 RXI4
    void Excep_SCI4_RXI4(void){ }
    
    // SCI4 TXI4
    void Excep_SCI4_TXI4(void){ }
    
    // SCI4 TEI4
    void Excep_SCI4_TEI4(void){ }
    
    // SCI5 RXI5
    void Excep_SCI5_RXI5(void){ }
    
    // SCI5 TXI5
    void Excep_SCI5_TXI5(void){ }
    
    // SCI5 TEI5
    void Excep_SCI5_TEI5(void){ }
    
    // SCI6 RXI6
    void Excep_SCI6_RXI6(void){ }
    
    // SCI6 TXI6
    void Excep_SCI6_TXI6(void){ }
    
    // SCI6 TEI6
    void Excep_SCI6_TEI6(void){ }
    
    // SCI7 RXI7
    void Excep_SCI7_RXI7(void){ }
    
    // SCI7 TXI7
    void Excep_SCI7_TXI7(void){ }
    
    // SCI7 TEI7
    void Excep_SCI7_TEI7(void){ }
    
    // SCI8 RXI8
    void Excep_SCI8_RXI8(void){ }
    
    // SCI8 TXI8
    void Excep_SCI8_TXI8(void){ }
    
    // SCI8 TEI8
    void Excep_SCI8_TEI8(void){ }
    
    // SCI9 RXI9
    void Excep_SCI9_RXI9(void){ }
    
    // SCI9 TXI9
    void Excep_SCI9_TXI9(void){ }
    
    // SCI9 TEI9
    void Excep_SCI9_TEI9(void){ }
    
    // SCI10 RXI10
    void Excep_SCI10_RXI10(void){ }
    
    // SCI10 TXI10
    void Excep_SCI10_TXI10(void){ }
    
    // SCI10 TEI10
    void Excep_SCI10_TEI10(void){ }
    
    // SCI11 RXI11
    void Excep_SCI11_RXI11(void){ }
    
    // SCI11 TXI11
    void Excep_SCI11_TXI11(void){ }
    
    // SCI11 TEI11
    void Excep_SCI11_TEI11(void){ }
    
    // SCI12 RXI12
    void Excep_SCI12_RXI12(void){ }
    
    // SCI12 TXI12
    void Excep_SCI12_TXI12(void){ }
    
    // SCI12 TEI12
    void Excep_SCI12_TEI12(void){ }
    
    // IEB IEBINT
    void Excep_IEB_IEBINT(void){ }
    


    resetprg.c (これはプロジェクト生成時から変更していません)

    8468.resetprg.c.txt
    /*********************************************************************
    *
    * Device     : RX/RX600
    *
    * File Name  : resetprg.c
    *
    * Abstract   : Reset Program.
    *
    * History    : 1.00  (2009-08-07)
    *            : 1.10  (2011-02-21)
    *            : 1.11  (2011-06-20)
    *            : 1.12  (2014-02-20)
    *            : 1.20  (2014-10-22)
    *
    * NOTE       : THIS IS A TYPICAL EXAMPLE.
    *
    * Copyright (C) 2009 (2014) Renesas Electronics Corporation.
    * and Renesas Solutions Corp.
    *
    *********************************************************************/
    
    #include	<machine.h>
    #include	<_h_c_lib.h>
    //#include	<stddef.h>					// Remove the comment when you use errno
    //#include 	<stdlib.h>					// Remove the comment when you use rand()
    #include	"typedefine.h"		// Define Types
    #include	"stacksct.h"		// Stack Sizes (Interrupt and User)
    
    #ifdef __cplusplus
    extern "C" {
    #endif
    void PowerON_Reset_PC(void);
    void main(void);
    #ifdef __cplusplus
    }
    #endif
    
    //#ifdef __cplusplus				// Use SIM I/O
    //extern "C" {
    //#endif
    //extern void _INIT_IOLIB(void);
    //extern void _CLOSEALL(void);
    //#ifdef __cplusplus
    //}
    //#endif
    
    #define PSW_init  0x00010000	// PSW bit pattern
    #define FPSW_init 0x00000000	// FPSW bit base pattern
    
    //extern void srand(_UINT);		// Remove the comment when you use rand()
    //extern _SBYTE *_s1ptr;				// Remove the comment when you use strtok()
    		
    //#ifdef __cplusplus				// Use Hardware Setup
    //extern "C" {
    //#endif
    //extern void HardwareSetup(void);
    //#ifdef __cplusplus
    //}
    //#endif
    	
    //#ifdef __cplusplus			// Remove the comment when you use global class object
    //extern "C" {					// Sections C$INIT and C$END will be generated
    //#endif
    //extern void _CALL_INIT(void);
    //extern void _CALL_END(void);
    //#ifdef __cplusplus
    //}
    //#endif
    
    #pragma section ResetPRG		// output PowerON_Reset to PResetPRG section
    
    #pragma entry PowerON_Reset_PC
    
    void PowerON_Reset_PC(void)
    { 
    #ifdef __RXV2
    	set_extb(__sectop("EXCEPTVECT"));
    #endif
    	set_intb(__sectop("C$VECT"));
    
    #ifdef __FPU
    #ifdef __ROZ					// Initialize FPSW
    #define _ROUND 0x00000001			// Let FPSW RMbits=01 (round to zero)
    #else
    #define _ROUND 0x00000000			// Let FPSW RMbits=00 (round to nearest)
    #endif
    #ifdef __DOFF
    #define _DENOM 0x00000100			// Let FPSW DNbit=1 (denormal as zero)
    #else
    #define _DENOM 0x00000000			// Let FPSW DNbit=0 (denormal as is)
    #endif
    	set_fpsw(FPSW_init | _ROUND | _DENOM);
    #endif
    
    	_INITSCT();
    
    //	_INIT_IOLIB();					// Use SIM I/O
    
    //	errno=0;						// Remove the comment when you use errno
    //	srand((_UINT)1);					// Remove the comment when you use rand()
    //	_s1ptr=NULL;					// Remove the comment when you use strtok()
    		
    //	HardwareSetup();				// Use Hardware Setup
        nop();
    
    //	_CALL_INIT();					// Remove the comment when you use global class object
    
    	set_psw(PSW_init);				// Set Ubit & Ibit for PSW
    //	chg_pmusr();					// Remove the comment when you need to change PSW PMbit (SuperVisor->User)
    
    	main();
    
    //	_CLOSEALL();					// Use SIM I/O
    	
    //	_CALL_END();					// Remove the comment when you use global class object
    
    	brk();
    }
    
    


    [追記]

    RX62N,RX621グループ用のアプリケーションノートでは、Change_PSW_PM_to_UserMode()はmain()の先頭で呼び出されていました。

    void main(void)
    {
        Change_PSW_PM_to_UserMode();    // Change PSW PMbit (SuperVisor->User)

        /* initialize private global variables */
        以後省略

    あと、サブルーチン内のChange_PSW_PM_to_UserMode()でIスタックから使用していないUスタックへ切り替わると、サブルーチンから戻る時の戻り番地は滅茶苦茶なアドレスだと考えられます。そこで(あるいはその先で)、特権命令例外、未定義命令例外、などが発生すると、前の投稿に書いた動作により、それ以上はプログラムは先へ進まなくなる筈だと考えられます。他方、そしてそこが割り込み許可状態のところであれば、割り込み処理だけは行われ続ける筈だと考えられます。(これらの例外ハンドラ中で'/'とか'+'とかを送信するようにしておけば、確証を得られる可能性がありそうな気もします。)

    ちなみに、CC-RXでは、RX62N,RX621グループ用のアプリケーションノートのChange_PSW_PM_to_UserMode()と同じ機能を提供するchg_pmusr()という組み込み関数があり、PowerON_Reset_PC()から呼び出すようになっていました。(ただし、デフォルトではコメントアウトされています。)

    resetprg.cより抜粋

    void PowerON_Reset_PC(void)
    {
    #ifdef __RXV2
        set_extb(__sectop("EXCEPTVECT"));
    #endif
        set_intb(__sectop("C$VECT"));

    #ifdef __FPU
        途中省略
        set_fpsw(FPSW_init | _ROUND | _DENOM);
    #endif

        _INITSCT();

    //  _INIT_IOLIB();                  // Use SIM I/O

    //  errno=0;                        // Remove the comment when you use errno
    //  srand((_UINT)1);                    // Remove the comment when you use rand()
    //  _s1ptr=NULL;                    // Remove the comment when you use strtok()
            
    //  HardwareSetup();                // Use Hardware Setup
        nop();

    //  _CALL_INIT();                   // Remove the comment when you use global class object

        set_psw(PSW_init);              // Set Ubit & Ibit for PSW
    //  chg_pmusr();                    // Remove the comment when you need to change PSW PMbit (SuperVisor->User)

        main();

    //  _CLOSEALL();                    // Use SIM I/O

    //  _CALL_END();                    // Remove the comment when you use global class object

        brk();
    }

    なお、試した先程のプログラムでChange_PSW_PM_to_UserMode()の代わりにchg_pmusr()を記述すると以下の通りの逆アセンブル表示になりました。(これは冗長かも。BTSTとBNE.Bはコードサイズと実行クロック数の無駄ですし、([訂正]すみません、ユーザーモードだったら即抜けるというコードでした) ADDはコードが長くなる命令コードを必要性が無いのに使っていますし。)

     89                       //Change_PSW_PM_to_UserMode();
     90                       chg_pmusr();
        fff00641 fd6a0e       MVFC        PSW,R14
        fff00644 7d4e         BTST        #20,R14
        fff00646 2116         BNE.B       _mpu_init+CEH      (RTE命令の次の命令のアドレス)
        fff00648 773e000010   OR          #100000H,R14
        fff0064d 7eae         PUSH.L      R14
        fff0064f fd6a1e       MVFC        PC,R14
        fff00652 70ee0d000000 ADD         #0000000DH,R14,R14 (RTE命令の次の命令のアドレス)
        fff00658 7eae         PUSH.L      R14
        fff0065a 7f95         RTE         



    [追記]

    ユーザモードではUスタック/Iスタックの切り替えは出来ませんでした。ですので、ユーザモードはUスタックを使い、スーパバイザモードはIスタックを使う、という方式でやるしかないようです。

    2.3.2 ユーザモード (赤枠は私が書いたものです)
    resource.renesas.com/resource/lib/jpn/online_docs/um/RX/RX63N_RX631_ja/?CPU#TOC_2_3_2


Children
  • NoMaYさん、お世話になります
    これはマニュアル書かれておりますが、私には初めての知識でした
    ●大切な例外の規定
    アクセス例外、特権命令例外、未定義命令例外、浮動小数点例外が他の例外と異なる点
    ・スタックに退避されるPC値は『例外が発生した命令のPC値』である為、
    例外ハンドラ中でスタックに退避されたPC値(戻り番地)を細工していないのであれば、
    RTE命令を実行した後に、同じ命令が再実行されて(再実行されようとして)同じ例外が再発生する。
    ・同じ例外が再発生した時の例外ハンドラも同じ例外ハンドラですので、結局、
    同じことが永遠に繰り返されるだけであり、プログラムは先へ進まない。
    circleさんご指摘でもありました
    「ユーザモードで割り込みが発生した場合は、スーパバイザモードに移行しますが、
    割り込み処理が終了後は、退避されたPSWが設定されるため、
    ユーザモードに移行すると考えられます。」
    つまり、例外のメカニズムというのは全条件保存したうえで例外が発生するということですね
    ●ユーザモードに移行した時のスタックポインタはスーパバイザモードのものと違います
    ・スーパバイザモードからユーザモードに遷移するとスタックポインタがUスタックへ強制的に切り替わる。
    ・CC-RXの標準のスタートアップルーチンはmain()に制御が移った時点ではUスタックではなくIスタックを使っている。
    ・ゆえに、スタートアップルーチンのPSWの初期値を変更してUスタックを使うように変更しなければならない。
    ●途中で停止する原因
    Change_PSW_PM_to_UserMode()の末尾のRTE命令実行前: Iスタックを使用中
    Change_PSW_PM_to_UserMode()の末尾のRTE命令実行後: 使用していないUスタックに切り替えられてしまった
    のように解釈いたしましたがよろしいでしょうか?
    Change_PSW_PM_to_UserMode();をコメントアウトしてkらchg_pmusr();で切り替えても同じ現象になります
    mpu_init();//メモリ保護
    printf("----->ここに来ないです\r");
    C:\>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
    RSPAGE7=0x00000000
    REPAGE7=0x0000000E
    MPBAC =0x0000000E
    設定成功
    ←ここで"----->ここに来ないです"が表示されるはず
    ですので
    Iスタック=スパーバイザーモード
    Uスタック=ユーザーモード
    ということですので、Iスタックが進んでしまったところではUスタックが正しいアドレスを復帰できなくて
    暴走するということでしょうか?
    であればIスタックをUスタックにコピーしてからUスタックに切り替えればと思いますが?
  • IスタックをUスタックにコピーしてからUスタックに切り替えても特に変わりませんでした
    memcpy( (char*)__sectop("SU") , (char*)__sectop("SI") ,0x4000 );
    Change_PSW_PM_to_UserMode();//ユザーモードに
    nop();
    printf("設定成功\r");
    ---------------------------------
    RSPAGE7=0x00000000
    REPAGE7=0x0000000E
    MPBAC =0x0000000E
    設定成功
    ---------------------------------
  • chg_pmusr();を使用した場合でも同じです
    memcpy( (char*)__sectop("SU") , (char*)__sectop("SI") ,0x4000 );
    chg_pmusr();
    nop();
    printf("設定成功\r");
    ---------------------------------
    RSPAGE7=0x00000000
    REPAGE7=0x0000000E
    MPBAC =0x0000000E
    設定成功
    ---------------------------------
  • memcpy( (char*)__sectop("SU") , (char*)__sectop("SI") ,0x4000 );
    はコメントアウトしまして
    mpu_init(void);をvoid main(void)の中に挿入ですが同じでした
    ---------------------------------
    RSPAGE7=0x00000000
    REPAGE7=0x0000000E
    MPBAC =0x0000000E
    設定成功
    ---------------------------------
  • なんと、mpu_init(void);の内容を抜き出してmain(void)の中に挿入しますと
    下記のように正常に動作いたします、では例外が発生できるかテストします
    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
    RSPAGE7=0x00000000
    REPAGE7=0x0000000E
    MPBAC =0x0000000E
    設定成功
    fpga初期設定中...Ok
    LG-17-4659-33(RX631) v1.00
    Copyright(C) 2017/3..
    Default build : Oct 23 2017 10:28:29
    run=0xFFF15E6A
    SCI1(9600,E,8,1)
    FPGA 2017/08/31 :11
    2017-10-23-月 10:31:12
    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:\>
  • RSPAGE0=0x05000000
    REPAGE0=0x60000001
    で設定しておいて
    int cmd_test(char *str)
    {
    char *p=(char*)0x05000000;
    p[0]=1;
    return CMD_OK;
    }
    これで書き込んでも例外は発生しませんでした
    RSPAGE0=0x05000000
    REPAGE0=0x60000001
    RSPAGE1=0x00000000
    REPAGE1=0x0000000E
    RSPAGE2=0x00000000
    REPAGE3=0x0000000E
    RSPAGE3=0x00000000
    REPAGE3=0x0000000E
    RSPAGE4=0x00000000
    REPAGE4=0x0000000E
    RSPAGE5=0x00000000
    REPAGE5=0x0000000E
    RSPAGE6=0x00000000
    REPAGE6=0x0000000E
    RSPAGE7=0x00000000
    REPAGE7=0x0000000E
    MPBAC =0x0000000E
    設定成功
    fpga初期設定中...Ok
    LG-17-4659-33(RX631) v1.00
    Copyright(C) 2017/3..
    Default build : Oct 23 2017 10:39:53
    run=0xFFF15E6A
    SCI1(9600,E,8,1)
    FPGA 2017/08/31 :11
    2017-10-23-月 10:42:29
    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:\>T ← p[0]=1;
  • chg_pmusr();をコメントアウトしまして
    Change_PSW_PM_to_UserMode();を使用しますと
    ///////////////////////////////////////////////////////////////////////
    //111 R:Enable,W:Enable,X:Disable,Area_Valid:V
    //1011
    //0:禁止
    //1:許可
    MPU.RSPAGE0.LONG=0x05000000;
    MPU.REPAGE0.BIT.REPN=0x06000000;
    MPU.REPAGE0.BIT.UAC=0;
    MPU.REPAGE0.BIT.V=1;
    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;
    //111 R:Enable,W:Enable,X:Disable
    //0:禁止
    //1:許可
    MPU.MPBAC.BIT.UBAC=7;//111
    // MPU.MPOPI.BIT.INV=1;//1=全アクセス制御領域のインバリデート(無効化)
    // MPU.MPECLR.BIT.CLR=1;
    // (void)MPU.MPESTS.LONG;
    // MPU.MPESTS.LONG=0;
    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 );
    Change_PSW_PM_to_UserMode();//ユザーモードに
    nop();
    // chg_pmusr();
    printf("設定成功\r");
    ///////////////////////////////////////////////////////////////////////
    で実行します途中までしか進みません
    ---------------------------------
    RSPAGE0=0x05000000
    REPAGE0=0x60000001
    RSPAGE1=0x00000000
    REPAGE1=0x0000000E
    RSPAGE2=0x00000000
    REPAGE3=0x0000000E
    RSPAGE3=0x00000000
    REPAGE3=0x0000000E
    RSPAGE4=0x00000000
    REPAGE4=0x0000000E
    RSPAGE5=0x00000000
    REPAGE5=0x0000000E
    RSPAGE6=0x00000000
    REPAGE6=0x0000000E
    RSPAGE7=0x00000000
    REPAGE7=0x0000000E
    MPBAC =0x0000000E
    ここで止まっている
    ---------------------------------
  • MPU.MPBAC.BIT.UBAC=0;//111
    にすることにより、下記どちらの方法でも例外発生が認められました
    1. Change_PSW_PM_to_UserMode();//ユザーモードに
    nop();
    2.chg_pmusr();