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です。

    割り込み関数の先頭/末尾でのPUSH/POPが大量になるよう意図的にソースの記述やコンパイルオプションの設定を行い、CC-RXとICCRXとGNURXで生成されたコードを見てみました。e2 studio 2022-07のプロジェクトのファイル一式を以下のzipファイルに固めました。

    issue_RXv3_RegBankSave_20221002.zip

    今回、困惑していることが1つあって、ICCRXで--save_accを指定してもアキュムレータの値を退避/復帰させるコードが生成されませんでした。半日悩んでみましたが、結構深刻なバグ、なのでは?、という考えを解消出来ませんでした。

    以下、生成されたコードの例です。(抜粋です。可能なら割り込み関数先頭で多重割り込み許可にしています。)

    CC-RX : RXv3_RegBankSave_CCRX/HardwareDebug/src/RXv3_RegBankSave_CCRX_ex4.lst

                                            .SECTION    P,CODE
    00000000                         __$i_hdr_4_1:
    00000000 7FA8                           SETPSW I
    00000002 6E4F                           PUSHM R4-R15
    00000004 7EA3                           PUSH.L R3
    00000006 FD1FB3                         MVFACGU #00H, A1, R3
    00000009 7EA2                           PUSH.L R2
    0000000B FD1F82                         MVFACHI #00H, A1, R2
    0000000E 7EA1                           PUSH.L R1
    00000010 FD1F91                         MVFACLO #00H, A1, R1
    00000013 7EA3                           PUSH.L R3
    00000015 FD1F33                         MVFACGU #00H, A0, R3
    00000018 7EA2                           PUSH.L R2
    0000001A FD1F02                         MVFACHI #00H, A0, R2
    0000001D 7EA1                           PUSH.L R1
    0000001F FD1F11                         MVFACLO #00H, A0, R1
    00000022 6E13                           PUSHM R1-R3
    …1行省略…
    0000002A 7100A8                         ADD #0FFFFFFA8H, R0
    …2行省略…
    00000033 6240                           ADD #04H, R0

    …途中省略…

    00000169 710054                         ADD #54H, R0
    0000016C 7EB1                           POP R1
    0000016E 7EB2                           POP R2
    00000170 7EB3                           POP R3
    00000172 FD1711                         MVTACLO R1, A0
    00000175 FD1702                         MVTACHI R2, A0
    00000178 7EB1                           POP R1
    0000017A FD1733                         MVTACGU R3, A0
    0000017D 7EB2                           POP R2
    0000017F 7EB3                           POP R3
    00000181 FD1791                         MVTACLO R1, A1
    00000184 FD1782                         MVTACHI R2, A1
    00000187 FD17B3                         MVTACGU R3, A1
    0000018A 6F1F                           POPM R1-R15
    0000018C 7F95                           RTE

     
    ICCRX : RXv3_RegBankSave_IAR/HardwareDebug/RXv3_RegBankSave_IAR_ex4.lst

       \                                 In section .text, align 8, keep-with-next
       \                     _i_hdr_4_1:
       \   000000 7F A8        SETPSW    I
       \   000002 6E EF        PUSHM     R14-R15
       \   000004 6E 1B        PUSHM     R1-R11
       \   000006 71 00 C8     ADD       #-0x38,SP,SP

    …途中省略…

       \   00011E 71 00 38     ADD       #0x38,SP,SP
       \   000121 6F 1B        POPM      R1-R11
       \   000123 6F EF        POPM      R14-R15
       \   000125 7F 95        RTE

     
    GNURX : RXv3_RegBankSave_GCC/HardwareDebug/RXv3_RegBankSave_GCC_ex4.lst

     136                                    .section    .text.i_hdr_4_1,"ax",@progbits
     138                                _i_hdr_4_1:
     141                                    ; Note: Interrupt Handler
     142 0000 6E 1F                         pushm   r1-r15
     144 0002 FD 1F 11                      mvfaclo #0, A0, r1
     145 0005 FD 1F 02                      mvfachi r2
     146 0008 6E 12                         pushm   r1-r2
     147 000a FD 1F 31                      mvfacgu #0, A0, r1
     148 000d FD 1F 92                      mvfaclo #0, A1, r2
     149 0010 6E 12                         pushm   r1-r2
     150 0012 FD 1F 81                      mvfachi #0, A1, r1
     151 0015 FD 1F B2                      mvfacgu #0, A1, r2
     152 0018 6E 12                         pushm   r1-r2
     153 001a 71 00 C0                      add #-64, r0

    …途中省略…

     452 0165 71 00 40                      add #0x40, r0
     453 0168 6F 12                         popm    r1-r2
     454 016a FD 17 81                      mvtachi r1, A1
     455 016d FD 17 B2                      mvtacgu r2, A1
     456 0170 6F 12                         popm    r1-r2
     457 0172 FD 17 31                      mvtacgu r1, A0
     458 0175 FD 17 92                      mvtaclo r2, A1
     459 0178 6F 12                         popm    r1-r2
     460 017a FD 17 11                      mvtaclo r1
     461 017d FD 17 02                      mvtachi r2
     462 0180 6F 1F                         popm    r1-r15
     465 0182 7F 95                         rte

     

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

    割り込み関数の先頭/末尾でのPUSH/POPが大量になるよう意図的にソースの記述やコンパイルオプションの設定を行い、CC-RXとICCRXとGNURXで生成されたコードを見てみました。e2 studio 2022-07のプロジェクトのファイル一式を以下のzipファイルに固めました。

    issue_RXv3_RegBankSave_20221002.zip

    今回、困惑していることが1つあって、ICCRXで--save_accを指定してもアキュムレータの値を退避/復帰させるコードが生成されませんでした。半日悩んでみましたが、結構深刻なバグ、なのでは?、という考えを解消出来ませんでした。

    以下、生成されたコードの例です。(抜粋です。可能なら割り込み関数先頭で多重割り込み許可にしています。)

    CC-RX : RXv3_RegBankSave_CCRX/HardwareDebug/src/RXv3_RegBankSave_CCRX_ex4.lst

                                            .SECTION    P,CODE
    00000000                         __$i_hdr_4_1:
    00000000 7FA8                           SETPSW I
    00000002 6E4F                           PUSHM R4-R15
    00000004 7EA3                           PUSH.L R3
    00000006 FD1FB3                         MVFACGU #00H, A1, R3
    00000009 7EA2                           PUSH.L R2
    0000000B FD1F82                         MVFACHI #00H, A1, R2
    0000000E 7EA1                           PUSH.L R1
    00000010 FD1F91                         MVFACLO #00H, A1, R1
    00000013 7EA3                           PUSH.L R3
    00000015 FD1F33                         MVFACGU #00H, A0, R3
    00000018 7EA2                           PUSH.L R2
    0000001A FD1F02                         MVFACHI #00H, A0, R2
    0000001D 7EA1                           PUSH.L R1
    0000001F FD1F11                         MVFACLO #00H, A0, R1
    00000022 6E13                           PUSHM R1-R3
    …1行省略…
    0000002A 7100A8                         ADD #0FFFFFFA8H, R0
    …2行省略…
    00000033 6240                           ADD #04H, R0

    …途中省略…

    00000169 710054                         ADD #54H, R0
    0000016C 7EB1                           POP R1
    0000016E 7EB2                           POP R2
    00000170 7EB3                           POP R3
    00000172 FD1711                         MVTACLO R1, A0
    00000175 FD1702                         MVTACHI R2, A0
    00000178 7EB1                           POP R1
    0000017A FD1733                         MVTACGU R3, A0
    0000017D 7EB2                           POP R2
    0000017F 7EB3                           POP R3
    00000181 FD1791                         MVTACLO R1, A1
    00000184 FD1782                         MVTACHI R2, A1
    00000187 FD17B3                         MVTACGU R3, A1
    0000018A 6F1F                           POPM R1-R15
    0000018C 7F95                           RTE

     
    ICCRX : RXv3_RegBankSave_IAR/HardwareDebug/RXv3_RegBankSave_IAR_ex4.lst

       \                                 In section .text, align 8, keep-with-next
       \                     _i_hdr_4_1:
       \   000000 7F A8        SETPSW    I
       \   000002 6E EF        PUSHM     R14-R15
       \   000004 6E 1B        PUSHM     R1-R11
       \   000006 71 00 C8     ADD       #-0x38,SP,SP

    …途中省略…

       \   00011E 71 00 38     ADD       #0x38,SP,SP
       \   000121 6F 1B        POPM      R1-R11
       \   000123 6F EF        POPM      R14-R15
       \   000125 7F 95        RTE

     
    GNURX : RXv3_RegBankSave_GCC/HardwareDebug/RXv3_RegBankSave_GCC_ex4.lst

     136                                    .section    .text.i_hdr_4_1,"ax",@progbits
     138                                _i_hdr_4_1:
     141                                    ; Note: Interrupt Handler
     142 0000 6E 1F                         pushm   r1-r15
     144 0002 FD 1F 11                      mvfaclo #0, A0, r1
     145 0005 FD 1F 02                      mvfachi r2
     146 0008 6E 12                         pushm   r1-r2
     147 000a FD 1F 31                      mvfacgu #0, A0, r1
     148 000d FD 1F 92                      mvfaclo #0, A1, r2
     149 0010 6E 12                         pushm   r1-r2
     150 0012 FD 1F 81                      mvfachi #0, A1, r1
     151 0015 FD 1F B2                      mvfacgu #0, A1, r2
     152 0018 6E 12                         pushm   r1-r2
     153 001a 71 00 C0                      add #-64, r0

    …途中省略…

     452 0165 71 00 40                      add #0x40, r0
     453 0168 6F 12                         popm    r1-r2
     454 016a FD 17 81                      mvtachi r1, A1
     455 016d FD 17 B2                      mvtacgu r2, A1
     456 0170 6F 12                         popm    r1-r2
     457 0172 FD 17 31                      mvtacgu r1, A0
     458 0175 FD 17 92                      mvtaclo r2, A1
     459 0178 6F 12                         popm    r1-r2
     460 017a FD 17 11                      mvtaclo r1
     461 017d FD 17 02                      mvtachi r2
     462 0180 6F 1F                         popm    r1-r15
     465 0182 7F 95                         rte

     

Children
No Data