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

    割り込み関数でレジスタ一括退避機能を使用してみました。e2 studio 2022-07のプロジェクトのファイル一式を以下のzipファイルに固めました。

    issue_RXv3_RegBankSave_20221003.zip

    ちなみに、レジスタ一括退避先バンク数は、RXv3命令セット上は、最大256バンク持てるようになっていますが、実際の製品では、今のところ、16バンクとなっていますけれども、割り込み優先順位とレジスタ一括退避先バンク番号を常にソースコード上で正しく整合させていれば、16バンクあれば、以下の理由により、全ての割り込みでレジスタ一括退避機能を使用出来るような気がします。

    (1) 割り込み優先順位は16レベルである(ただし最低優先順位にすると割り込み不可となるので実質は15レベルである)
    (2) 多重割り込みを許可しても同一優先順位の割り込みは許可されない(優先順位が高い割り込みのみ許可される)
    (3) レジスタ一括退避先バンク数は16バンクなので割り込み優先順位毎に1つ割り当てることが出来る
    (4) 多重割り込みを許可しても優先順位が高い割り込みのみ許可されるので使用中のバンクを上書きしてしまうことは無い

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

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

                                            .SECTION    P,CODE
    00000000                         __$i_hdr_5_1:
    00000000 7FA8                           SETPSW I
    00000002 FD76E000                       SAVE #00H
    00000006 7100A8                         ADD #0FFFFFFA8H, R0
    …3行省略…
    00000015 6240                           ADD #04H, R0

    …途中省略…

    0000014E 710054                         ADD #54H, R0
    00000151 FD76F000                       RSTR #00H
    00000155 7F95                           RTE

     
    ICCRX : RXv3_RegBankSave_IAR/HardwareDebug/RXv3_RegBankSave_IAR_ex5.lst

       \                                 In section .text, align 8, keep-with-next
       \                     _i_hdr_5_1:
       \   000000 7F A8        SETPSW    I
       \   000002 FD 76 E0 00  SAVE      #0x0
       \   000006 71 00 C8     ADD       #-0x38,SP,SP

    …途中省略…

       \   00011E 71 00 38     ADD       #0x38,SP,SP
       \   000121 FD 76 F0 00  RSTR      #0x0
       \   000125 7F 95        RTE

     
    GNURX : 未サポート

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

    割り込み関数でレジスタ一括退避機能を使用してみました。e2 studio 2022-07のプロジェクトのファイル一式を以下のzipファイルに固めました。

    issue_RXv3_RegBankSave_20221003.zip

    ちなみに、レジスタ一括退避先バンク数は、RXv3命令セット上は、最大256バンク持てるようになっていますが、実際の製品では、今のところ、16バンクとなっていますけれども、割り込み優先順位とレジスタ一括退避先バンク番号を常にソースコード上で正しく整合させていれば、16バンクあれば、以下の理由により、全ての割り込みでレジスタ一括退避機能を使用出来るような気がします。

    (1) 割り込み優先順位は16レベルである(ただし最低優先順位にすると割り込み不可となるので実質は15レベルである)
    (2) 多重割り込みを許可しても同一優先順位の割り込みは許可されない(優先順位が高い割り込みのみ許可される)
    (3) レジスタ一括退避先バンク数は16バンクなので割り込み優先順位毎に1つ割り当てることが出来る
    (4) 多重割り込みを許可しても優先順位が高い割り込みのみ許可されるので使用中のバンクを上書きしてしまうことは無い

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

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

                                            .SECTION    P,CODE
    00000000                         __$i_hdr_5_1:
    00000000 7FA8                           SETPSW I
    00000002 FD76E000                       SAVE #00H
    00000006 7100A8                         ADD #0FFFFFFA8H, R0
    …3行省略…
    00000015 6240                           ADD #04H, R0

    …途中省略…

    0000014E 710054                         ADD #54H, R0
    00000151 FD76F000                       RSTR #00H
    00000155 7F95                           RTE

     
    ICCRX : RXv3_RegBankSave_IAR/HardwareDebug/RXv3_RegBankSave_IAR_ex5.lst

       \                                 In section .text, align 8, keep-with-next
       \                     _i_hdr_5_1:
       \   000000 7F A8        SETPSW    I
       \   000002 FD 76 E0 00  SAVE      #0x0
       \   000006 71 00 C8     ADD       #-0x38,SP,SP

    …途中省略…

       \   00011E 71 00 38     ADD       #0x38,SP,SP
       \   000121 FD 76 F0 00  RSTR      #0x0
       \   000125 7F 95        RTE

     
    GNURX : 未サポート

Children
No Data