RXv3コアのレジスタ一括退避機能の使い方(Register Bank Save Function Usage)を調べてみるスレッド

こんにちは。NoMaYです。

RXv3コア搭載の120MH動作のRXマイコンも、RX66T以降、RX671、RX66N、RX660と品種が増えてきましたが、RXv3コアのセールスポイントの1つであるレジスタ一括退避機能の使い方が今ひとつピンと来ません。そこで、いつものように、ちょっと好奇心からスレッドを立ててみました。(注: RX66Tは、160MHz動作、レジスタ一括退避機能未搭載、です。) いつものように、ぼちぼちと続きます。

ホワイトペーパー
卓越したMCU性能と電力効率を実現するRXv3コア
2019年10月
www.renesas.com/jp/ja/document/whp/introducing-rxv3-core-superior-performance-excellent-power-efficiency#page=6

割り込み応答時間の改善

モータ制御システムなどは、高速な割り込み処理によるリアルタイム性能が必要となってきます。

RXv3コアには、割り込み処理時にレジスタを高速退避/復帰するために、オプション機能として、レジスタ退避バンクと呼ばれる専用メモリを実装しています。図6に示すように、レジスタ退避バンクを使用することで割り込み応答時間を短縮でき、割り込み処理全体の時間を短縮することができます。 割り込み処理ルーチンの中で、SAVE命令を使用すると汎用レジスタとアキュムレータを1クロックで専用メモリに保存できます。RSTR命令は、保存されたレジスタを3~6cycleで復元します。レジスタ退避バンクは専用メモリを複数面持っており、多重割り込みにも対応することが可能です。

図6.割り込み応答時間の改善

レジスタ退避バンクは、割り込みハンドラだけでなく、RTOSコンテキスト切り替えにも使用できます。 RTOSコンテキスト切り替え時間は、レジスタバンク保存機能により最大20%高速化します。


Parents
  • こんにちは。NoMaYです。

    ちょっとだけ前進、、、以前の無理矢理な裏技のCC-RXの以下のワーニングは消せました。結局、無理矢理、ですが、、、

    W0521051: Standard requires that parameter "save" be given a type by a subsequent declaration ("int" assumed)

     
    CC-RX

    ソース例: Config_RIIC0_user.c (ピンク文字部分が今回の変更箇所)

    /* Start user code for global. Do not edit comment generated here */

    #pragma inline_asm R_CG_PRAGMA_INTERRUPT_FIT_IPL_MAX_HELPER_RSTR
    static void R_CG_PRAGMA_INTERRUPT_FIT_IPL_MAX_HELPER_RSTR(void);
    static void R_CG_PRAGMA_INTERRUPT_FIT_IPL_MAX_HELPER_RSTR(void)
    {
        RSTR #00H
    }

    #define R_CG_PRAGMA_INTERRUPT_FIT_IPL_MAX(function_name, vector)      static void function_name(int);\
                                                                          R_BSP_PRAGMA(interrupt _##function_name(vect=vector, bank=0))\
                                                                          R_BSP_PRAGMA(inline_asm __##function_name)\
                                                                          static void __##function_name(void);\
                                                                          static void __##function_name(void)\
                                                                          {\
                                                                              BRA.W __$##function_name\
                                                                          }\
                                                                          static void _##function_name(void);\
                                                                          static void _##function_name(void)\
                                                                          {\
                                                                              if(BSP_CFG_FIT_IPL_MAX > (((R_BSP_GET_PSW()) >> 24) & 0xF))\
                                                                              {\
                                                                                  R_BSP_SET_IPL(BSP_CFG_FIT_IPL_MAX);/* MVTIPL #IMM:4 */\
                                                                              }\
                                                                              R_BSP_SETPSW_I();\
                                                                              R_CG_PRAGMA_INTERRUPT_FIT_IPL_MAX_HELPER_RSTR();\
                                                                              /* The following function never return. */\
                                                                              __##function_name();\
                                                                          }


    #define _R_CG_ATTRIB_INTERRUPT_FIT_IPL_MAX_vect(...) save)
    #define R_CG_ATTRIB_INTERRUPT_FIT_IPL_MAX_vect _R_CG_ATTRIB_INTERRUPT_FIT_IPL_MAX_vect(
    #define R_CG_ATTRIB_INTERRUPT_FIT_IPL_MAX_void void
    #define R_CG_ATTRIB_INTERRUPT_FIT_IPL_MAX(function_name,...) function_name(R_CG_ATTRIB_INTERRUPT_FIT_IPL_MAX_##__VA_ARGS__)

    R_CG_PRAGMA_INTERRUPT_FIT_IPL_MAX(r_Config_RIIC0_transmit_interrupt, VECT(RIIC0,TXI0))
    R_CG_PRAGMA_INTERRUPT_FIT_IPL_MAX(r_Config_RIIC0_receive_interrupt,  VECT(RIIC0,RXI0))

    #define r_Config_RIIC0_transmit_interrupt(...) R_CG_ATTRIB_INTERRUPT_FIT_IPL_MAX(r_Config_RIIC0_transmit_interrupt, __VA_ARGS__)
    #define r_Config_RIIC0_receive_interrupt(...)  R_CG_ATTRIB_INTERRUPT_FIT_IPL_MAX(r_Config_RIIC0_receive_interrupt,  __VA_ARGS__)

    /* End user code. Do not edit comment generated here */

     

    #if FAST_INTERRUPT_VECTOR == VECT_RIIC0_TXI0
    #pragma interrupt r_Config_RIIC0_transmit_interrupt(vect=VECT(RIIC0,TXI0),fint)
    #else
    #pragma interrupt r_Config_RIIC0_transmit_interrupt(vect=VECT(RIIC0,TXI0))
    #endif
    static void r_Config_RIIC0_transmit_interrupt(void)
    {
        …途中省略…
    }

     

    #if FAST_INTERRUPT_VECTOR == VECT_RIIC0_RXI0
    #pragma interrupt r_Config_RIIC0_receive_interrupt(vect=VECT(RIIC0,RXI0),fint)
    #else
    #pragma interrupt r_Config_RIIC0_receive_interrupt(vect=VECT(RIIC0,RXI0))
    #endif
    static void r_Config_RIIC0_receive_interrupt(void)
    {
        …途中省略…
    }

     
    リストファイル:
    コンパイルオプションに一応 -save_acc (割り込み関数でのアキュムレータの退避/復帰を行う)を指定

    00000000             __$_r_Config_RIIC0_transmit_interrupt:
                                .STACK  __$_r_Config_RIIC0_transmit_interrupt=8
                                .RVECTOR    53,__$_r_Config_RIIC0_transmit_interrupt
    00000000 FD76E000           SAVE #00H
    00000004 FD6A01             MVFC PSW, R1
    00000007 FC5A110810         BFMOVZ #18H, #00H, #04H, R1, R1
    0000000C 61A1               CMP #0AH, R1
    0000000E 24rr               BGTU L12
    00000010             L11:   ; if_then_bb
    00000010 75700B             MVTIPL #0BH
    00000013             L12:   ; if_break_bb
    00000013 7FA8               SETPSW I
    00000015 FD76F000           RSTR #00H
    00000019 38rrrr          W  BRA.W __$r_Config_RIIC0_transmit_interrupt
    0000001C FD76F000           RSTR #00H ← ここは実行されません
    00000020 7F95               RTE ← ここは実行されません


    00000045             __$r_Config_RIIC0_transmit_interrupt:
                                .STACK  __$r_Config_RIIC0_transmit_interrupt=24
    00000045 6E14               PUSHM R1-R4
    00000047 FB22rrrrrrrr       MOV.L #_g_riic0_mode_flag, R2

                                …途中省略…

    0000008E 6F14               POPM R1-R4
    00000090 7F95               RTE
                                …途中省略…
    000000AA 6F14               POPM R1-R4
    000000AC 7F95               RTE
                                …途中省略…
    000000C3 6F14               POPM R1-R4
    000000C5 7F95               RTE
                                …途中省略…
    000000E4 6F14               POPM R1-R4
    000000E6 7F95               RTE
                                …途中省略…
    00000114 6F14               POPM R1-R4
    00000116 7F95               RTE
                                …途中省略…
    0000013A 6F14               POPM R1-R4
    0000013C 7F95               RTE
                                …途中省略…
    00000156 6F14               POPM R1-R4
    00000158 7F95               RTE
                                …途中省略…
    00000174 6F14               POPM R1-R4
    00000176 7F95               RTE

     

    00000022             __$_r_Config_RIIC0_receive_interrupt:
                                .STACK  __$_r_Config_RIIC0_receive_interrupt=8
                                .RVECTOR    52,__$_r_Config_RIIC0_receive_interrupt
    00000022 FD76E000           SAVE #00H
    00000026 FD6A01             MVFC PSW, R1
    00000029 FC5A110810         BFMOVZ #18H, #00H, #04H, R1, R1
    0000002E 61A1               CMP #0AH, R1
    00000030 24rr               BGTU L15
    00000032             L14:   ; if_then_bb
    00000032 75700B             MVTIPL #0BH
    00000035             L15:   ; if_break_bb
    00000035 7FA8               SETPSW I
    00000037 FD76F000           RSTR #00H
    0000003B 38rrrr          W  BRA.W __$r_Config_RIIC0_receive_interrupt
    0000003E FD76F000           RSTR #00H ← ここは実行されません
    00000042 7F95               RTE ← ここは実行されません


    000001B8             __$r_Config_RIIC0_receive_interrupt:
                                .STACK  __$r_Config_RIIC0_receive_interrupt=32
    000001B8 6E15               PUSHM R1-R5
    000001BA FB32rrrrrrrr       MOV.L #_g_riic0_state, R3
    000001C0 6040               SUB #04H, R0

                                …途中省略…

    000002B6 6240               ADD #04H, R0
    000002B8 6F15               POPM R1-R5
    000002BA 7F95               RTE

     

Reply
  • こんにちは。NoMaYです。

    ちょっとだけ前進、、、以前の無理矢理な裏技のCC-RXの以下のワーニングは消せました。結局、無理矢理、ですが、、、

    W0521051: Standard requires that parameter "save" be given a type by a subsequent declaration ("int" assumed)

     
    CC-RX

    ソース例: Config_RIIC0_user.c (ピンク文字部分が今回の変更箇所)

    /* Start user code for global. Do not edit comment generated here */

    #pragma inline_asm R_CG_PRAGMA_INTERRUPT_FIT_IPL_MAX_HELPER_RSTR
    static void R_CG_PRAGMA_INTERRUPT_FIT_IPL_MAX_HELPER_RSTR(void);
    static void R_CG_PRAGMA_INTERRUPT_FIT_IPL_MAX_HELPER_RSTR(void)
    {
        RSTR #00H
    }

    #define R_CG_PRAGMA_INTERRUPT_FIT_IPL_MAX(function_name, vector)      static void function_name(int);\
                                                                          R_BSP_PRAGMA(interrupt _##function_name(vect=vector, bank=0))\
                                                                          R_BSP_PRAGMA(inline_asm __##function_name)\
                                                                          static void __##function_name(void);\
                                                                          static void __##function_name(void)\
                                                                          {\
                                                                              BRA.W __$##function_name\
                                                                          }\
                                                                          static void _##function_name(void);\
                                                                          static void _##function_name(void)\
                                                                          {\
                                                                              if(BSP_CFG_FIT_IPL_MAX > (((R_BSP_GET_PSW()) >> 24) & 0xF))\
                                                                              {\
                                                                                  R_BSP_SET_IPL(BSP_CFG_FIT_IPL_MAX);/* MVTIPL #IMM:4 */\
                                                                              }\
                                                                              R_BSP_SETPSW_I();\
                                                                              R_CG_PRAGMA_INTERRUPT_FIT_IPL_MAX_HELPER_RSTR();\
                                                                              /* The following function never return. */\
                                                                              __##function_name();\
                                                                          }


    #define _R_CG_ATTRIB_INTERRUPT_FIT_IPL_MAX_vect(...) save)
    #define R_CG_ATTRIB_INTERRUPT_FIT_IPL_MAX_vect _R_CG_ATTRIB_INTERRUPT_FIT_IPL_MAX_vect(
    #define R_CG_ATTRIB_INTERRUPT_FIT_IPL_MAX_void void
    #define R_CG_ATTRIB_INTERRUPT_FIT_IPL_MAX(function_name,...) function_name(R_CG_ATTRIB_INTERRUPT_FIT_IPL_MAX_##__VA_ARGS__)

    R_CG_PRAGMA_INTERRUPT_FIT_IPL_MAX(r_Config_RIIC0_transmit_interrupt, VECT(RIIC0,TXI0))
    R_CG_PRAGMA_INTERRUPT_FIT_IPL_MAX(r_Config_RIIC0_receive_interrupt,  VECT(RIIC0,RXI0))

    #define r_Config_RIIC0_transmit_interrupt(...) R_CG_ATTRIB_INTERRUPT_FIT_IPL_MAX(r_Config_RIIC0_transmit_interrupt, __VA_ARGS__)
    #define r_Config_RIIC0_receive_interrupt(...)  R_CG_ATTRIB_INTERRUPT_FIT_IPL_MAX(r_Config_RIIC0_receive_interrupt,  __VA_ARGS__)

    /* End user code. Do not edit comment generated here */

     

    #if FAST_INTERRUPT_VECTOR == VECT_RIIC0_TXI0
    #pragma interrupt r_Config_RIIC0_transmit_interrupt(vect=VECT(RIIC0,TXI0),fint)
    #else
    #pragma interrupt r_Config_RIIC0_transmit_interrupt(vect=VECT(RIIC0,TXI0))
    #endif
    static void r_Config_RIIC0_transmit_interrupt(void)
    {
        …途中省略…
    }

     

    #if FAST_INTERRUPT_VECTOR == VECT_RIIC0_RXI0
    #pragma interrupt r_Config_RIIC0_receive_interrupt(vect=VECT(RIIC0,RXI0),fint)
    #else
    #pragma interrupt r_Config_RIIC0_receive_interrupt(vect=VECT(RIIC0,RXI0))
    #endif
    static void r_Config_RIIC0_receive_interrupt(void)
    {
        …途中省略…
    }

     
    リストファイル:
    コンパイルオプションに一応 -save_acc (割り込み関数でのアキュムレータの退避/復帰を行う)を指定

    00000000             __$_r_Config_RIIC0_transmit_interrupt:
                                .STACK  __$_r_Config_RIIC0_transmit_interrupt=8
                                .RVECTOR    53,__$_r_Config_RIIC0_transmit_interrupt
    00000000 FD76E000           SAVE #00H
    00000004 FD6A01             MVFC PSW, R1
    00000007 FC5A110810         BFMOVZ #18H, #00H, #04H, R1, R1
    0000000C 61A1               CMP #0AH, R1
    0000000E 24rr               BGTU L12
    00000010             L11:   ; if_then_bb
    00000010 75700B             MVTIPL #0BH
    00000013             L12:   ; if_break_bb
    00000013 7FA8               SETPSW I
    00000015 FD76F000           RSTR #00H
    00000019 38rrrr          W  BRA.W __$r_Config_RIIC0_transmit_interrupt
    0000001C FD76F000           RSTR #00H ← ここは実行されません
    00000020 7F95               RTE ← ここは実行されません


    00000045             __$r_Config_RIIC0_transmit_interrupt:
                                .STACK  __$r_Config_RIIC0_transmit_interrupt=24
    00000045 6E14               PUSHM R1-R4
    00000047 FB22rrrrrrrr       MOV.L #_g_riic0_mode_flag, R2

                                …途中省略…

    0000008E 6F14               POPM R1-R4
    00000090 7F95               RTE
                                …途中省略…
    000000AA 6F14               POPM R1-R4
    000000AC 7F95               RTE
                                …途中省略…
    000000C3 6F14               POPM R1-R4
    000000C5 7F95               RTE
                                …途中省略…
    000000E4 6F14               POPM R1-R4
    000000E6 7F95               RTE
                                …途中省略…
    00000114 6F14               POPM R1-R4
    00000116 7F95               RTE
                                …途中省略…
    0000013A 6F14               POPM R1-R4
    0000013C 7F95               RTE
                                …途中省略…
    00000156 6F14               POPM R1-R4
    00000158 7F95               RTE
                                …途中省略…
    00000174 6F14               POPM R1-R4
    00000176 7F95               RTE

     

    00000022             __$_r_Config_RIIC0_receive_interrupt:
                                .STACK  __$_r_Config_RIIC0_receive_interrupt=8
                                .RVECTOR    52,__$_r_Config_RIIC0_receive_interrupt
    00000022 FD76E000           SAVE #00H
    00000026 FD6A01             MVFC PSW, R1
    00000029 FC5A110810         BFMOVZ #18H, #00H, #04H, R1, R1
    0000002E 61A1               CMP #0AH, R1
    00000030 24rr               BGTU L15
    00000032             L14:   ; if_then_bb
    00000032 75700B             MVTIPL #0BH
    00000035             L15:   ; if_break_bb
    00000035 7FA8               SETPSW I
    00000037 FD76F000           RSTR #00H
    0000003B 38rrrr          W  BRA.W __$r_Config_RIIC0_receive_interrupt
    0000003E FD76F000           RSTR #00H ← ここは実行されません
    00000042 7F95               RTE ← ここは実行されません


    000001B8             __$r_Config_RIIC0_receive_interrupt:
                                .STACK  __$r_Config_RIIC0_receive_interrupt=32
    000001B8 6E15               PUSHM R1-R5
    000001BA FB32rrrrrrrr       MOV.L #_g_riic0_state, R3
    000001C0 6040               SUB #04H, R0

                                …途中省略…

    000002B6 6240               ADD #04H, R0
    000002B8 6F15               POPM R1-R5
    000002BA 7F95               RTE

     

Children
No Data