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の -nouse_div_inst というコンパイルオプションです。ちなみに、ICCRXにもGNURXにも類似のものは無いようでした。

    しかしながら、1つ前の投稿で命令実行時間を眺めていて気になったのですが、割り込み応答性を低下させる命令として他にも以下のものもありますね。後でコンパイラでの対応を調べてみようと思います。

    PUSHM命令(レジスタ数が多い場合(最大15レジスタ)) : 最大 15 クロック
    POPM命令(レジスタ数が多い場合(最大15レジスタ))  : 最大 15 or 15+1 クロック
    RTSD命令(レジスタ数が多い場合(最大15レジスタ))  : 最大 15+1 or 15+2 クロック

    DPUSHM命令(レジスタ数が多い場合(最大16レジスタ)) : 最大 16 クロック
    DPOPM命令(レジスタ数が多い場合(最大16レジスタ))  : 最大 16 or 16+1 クロック

    FSQRT命令 : 16 or 18 クロック

    DSQRT命令 : 33 or 33+1 クロック

     
    以下、CC-RXのヘルプの画面コピーです。



    [追記]

    RXv2までは、割り込み応答が最も低下するのは命令実行に 16 or 18 クロック掛かるFDIV命令やFSQRT命令の場合だったのだが、RXv3になって、命令実行に 33 or 33+1 クロック掛かるDDIV命令やDSQRT命令が追加されることになったので、その悪化分をレジスタ一括退避機能を搭載することで挽回出来るようにした、ということだったりするのだろうか、、、

    もしそうだったとしても、コンパイラは割り込み関数の先頭で必ずしも全てのレジスタと全てのアキュムレータを退避するようにしていたわけでは無いので、挽回するにはちょっと足りてないかな、というところだったりするのかも、、、

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

    > なお、コンパイラには、命令実行に時間が掛かる命令(割り込みルーチンへ飛ぶのが遅れる命令)を使わないようにするコンパイルオプションもあります。

    具体的には、以下の画面コピーの、CC-RXの -nouse_div_inst というコンパイルオプションです。ちなみに、ICCRXにもGNURXにも類似のものは無いようでした。

    しかしながら、1つ前の投稿で命令実行時間を眺めていて気になったのですが、割り込み応答性を低下させる命令として他にも以下のものもありますね。後でコンパイラでの対応を調べてみようと思います。

    PUSHM命令(レジスタ数が多い場合(最大15レジスタ)) : 最大 15 クロック
    POPM命令(レジスタ数が多い場合(最大15レジスタ))  : 最大 15 or 15+1 クロック
    RTSD命令(レジスタ数が多い場合(最大15レジスタ))  : 最大 15+1 or 15+2 クロック

    DPUSHM命令(レジスタ数が多い場合(最大16レジスタ)) : 最大 16 クロック
    DPOPM命令(レジスタ数が多い場合(最大16レジスタ))  : 最大 16 or 16+1 クロック

    FSQRT命令 : 16 or 18 クロック

    DSQRT命令 : 33 or 33+1 クロック

     
    以下、CC-RXのヘルプの画面コピーです。



    [追記]

    RXv2までは、割り込み応答が最も低下するのは命令実行に 16 or 18 クロック掛かるFDIV命令やFSQRT命令の場合だったのだが、RXv3になって、命令実行に 33 or 33+1 クロック掛かるDDIV命令やDSQRT命令が追加されることになったので、その悪化分をレジスタ一括退避機能を搭載することで挽回出来るようにした、ということだったりするのだろうか、、、

    もしそうだったとしても、コンパイラは割り込み関数の先頭で必ずしも全てのレジスタと全てのアキュムレータを退避するようにしていたわけでは無いので、挽回するにはちょっと足りてないかな、というところだったりするのかも、、、

Children
No Data