こんにちは。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です。ちょっと脱線しますけれども、今回のスレッドで調べ物をしていて、RXマイコンを触り始めて10年目にしてようやく気付いたRXコアのアキュムレータについての驚きの事実がありました。(以前にRL78コアのDTC保留命令というものに気付いた時と同じぐらいの驚きでした。) もっとも、10年目という数字も大雑把ですし、アキュムレータもちゃんと使ったことが無かったですし、ということでもありますけれども。(1) メイン処理側でしかアキュムレータを使っていなくても、(適切な割り込み設定をしていないと)割り込み処理の実行後にアキュムレータの値が壊れてしまっていることが有り得る(2) 特定の1つのタスクでしかアキュムレータを使っていなくても、(もしも正しいコンテキスト切り替え処理をしていないRTOSカーネルだったら)他のタスクから戻った後にアキュムレータの値が壊れてしまっていることが有り得る理由は、以下の画面コピーの説明の通りです。(以下は一例としてRX660のものです。)RX660グループ ユーザーズマニュアル ハードウェア編R01UH0937JJ0100 Rev.1.00 Pages 2302 2022.03.18www.renesas.com/jp/ja/document/mah/rx660-group-users-manual-hardware#page=118RXファミリ RXv3命令セットアーキテクチャ ユーザーズマニュアル ソフトウェア編R01US0316JJ0100 Rev.1.00 Pages 373 2018.11.20www.renesas.com/jp/ja/document/mas/rx-family-rxv3-instruction-set-architecture-users-manual-software-rev100#page=24EMUL (普通の算術演算命令)EMULU (普通の算術演算命令)FMUL (普通の単精度浮動小数点演算命令)MUL (普通の算術演算命令)RMPA (この積和演算命令はともかくとして)[関連リンク]RL78コアのDTC保留命令というものについて。RL78 FreeRTOS APIを特別なおまじない記述無しで割り込みルーチンから呼び出せるようにしてみた(CC-RL/GNURL78)community-ja.renesas.com/cafe_rene/forums-groups/tools/f/forum21/5845/rl78-freertos-api-cc-rl-gnurl78/33975#33975
こんにちは。NoMaYです。この際ですので、アキュムレータACC0の値が、EMUL、EMULU、FMUL、MULといった命令の実行後に、壊れるのかどうかを実際に見てみました。確かに壊れました。以下、CS+の画面コピーです。(以前にe2 studioで困惑する事態があったので、私は今回はCS+です。ひとそれぞれですが。)くだんの命令群の実行前くだんの命令群の実行後試したコード
#pragma inline_asm code1, code2void code1(void){ MOV.L #12121212H, R6 MOV.L #34343434H, R7 MVTACLO R6, A0 MVTACHI R6, A0 MVTACGU R6, A0 MVTACLO R7, A1 MVTACHI R7, A1 MVTACGU R7, A1}void code2(void){ MOV.L #12121212H, R6 MOV.L #34343434H, R7 EMUL R6, R7 MOV.L #12121212H, R6 MOV.L #34343434H, R7 EMULU R6, R7 MOV.L #0, R6 MOV.L #0, R7 FMUL R6, R7 MOV.L #12121212H, R6 MOV.L #34343434H, R7 MUL R6, R7, R8}int main(void){ code1(); __nop(); code2(); __nop(); for(;;);}