こんにちは。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%高速化します。」
こんにちは。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,CODE00000000 __$i_hdr_5_1:00000000 7FA8 SETPSW I00000002 FD76E000 SAVE #00H00000006 7100A8 ADD #0FFFFFFA8H, R0…3行省略…00000015 6240 ADD #04H, R0…途中省略…0000014E 710054 ADD #54H, R000000151 FD76F000 RSTR #00H00000155 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 : 未サポート