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

    > 割り込み応答性を低下させる命令として他にも以下のものもありますね。後でコンパイラでの対応を調べてみようと思います。

    考えてみれば、割り込み応答性を低下させてしまう開平演算(√)命令のFSQRT命令やDSQRT命令はC言語標準ライブラリのsqrt()族を使用しなければ良いだけで、案の定、CC-RXでも -nouse_div_inst といった系統のコンパイルオプションは存在しませんでした。(もちろん、ICCRXにもGNURXにも。) 他方、同じく割り込み応答性を低下させてしまう除算命令のFDIV命令やDDIV命令はC言語標準ライブラリの数学関数でのアルゴリズム実装において至る所で使用されていると思われますので、CC-RXの -nouse_div_inst コンパイルオプションで抑止しなければ手に負えないよね、とかも思いました。

    もちろん、C言語標準ライブラリのsqrt()族を使用しなければ良いだけ、といっても、当然ながら代替アルゴリズムを自前で用意する必要はありますけれども。(それは、自前でsqrt()を計算する関数を用意する、というやり方の他に、そもそも開平演算(√)を全く使用せずにプログラムとして所望の結果を導き出すことが出来る別の数学アルゴリズムに置き換える、というやり方もあり得ます。)

    他の割り込み応答性を低下させる命令に関しても、引き続きコンパイラでの対応を調べてみようと思います。

    [追記]

    ちなみに、FSQRT命令やDSQRT命令をダイレクトにコンパイラの生成コードで使用する場合には、C言語標準ライブラリの仕様で規定された errno 変数へのエラー番号の設定をどうするか、というトレードオフ問題が生じてしまうらしくて、その対応方法を選べるように、CC-RXもICCRXもGNURXも以下の画面コピーのコンパイルオプションを用意していました。(そして、それは何れのコンパイラでも、FDIV命令やDDIV命令を使うか使わないかを選ぶ、というのでは無かったです。)

    [訂正] すみません、GNURXは違ったようです。以下の -mrxv2-fsqrt オプションは文字通りにFSQRT命令に関するもので、DSQRT命令には関知していませんでした。そして、-mrxv2-fsqrt オプションを指定しない場合はFSQRT命令が使われなくなります。他方、-mrxv3-dsqrt オプションは存在しませんけれどもDSQRT命令は使われていました。標準ライブラリ内ではFSQRT命令もDSQRT命令も使われていなかったです。これは、どうも、FSQRT命令とDSQRT命令とでバランスがとても悪いことになっているようです。(歴史的経緯と互換性維持の兼ね合いによる落としどころなのだと思いますけれども。)

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

    CC-RX


    ICCRX


    GNURX

     

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

    > 割り込み応答性を低下させる命令として他にも以下のものもありますね。後でコンパイラでの対応を調べてみようと思います。

    考えてみれば、割り込み応答性を低下させてしまう開平演算(√)命令のFSQRT命令やDSQRT命令はC言語標準ライブラリのsqrt()族を使用しなければ良いだけで、案の定、CC-RXでも -nouse_div_inst といった系統のコンパイルオプションは存在しませんでした。(もちろん、ICCRXにもGNURXにも。) 他方、同じく割り込み応答性を低下させてしまう除算命令のFDIV命令やDDIV命令はC言語標準ライブラリの数学関数でのアルゴリズム実装において至る所で使用されていると思われますので、CC-RXの -nouse_div_inst コンパイルオプションで抑止しなければ手に負えないよね、とかも思いました。

    もちろん、C言語標準ライブラリのsqrt()族を使用しなければ良いだけ、といっても、当然ながら代替アルゴリズムを自前で用意する必要はありますけれども。(それは、自前でsqrt()を計算する関数を用意する、というやり方の他に、そもそも開平演算(√)を全く使用せずにプログラムとして所望の結果を導き出すことが出来る別の数学アルゴリズムに置き換える、というやり方もあり得ます。)

    他の割り込み応答性を低下させる命令に関しても、引き続きコンパイラでの対応を調べてみようと思います。

    [追記]

    ちなみに、FSQRT命令やDSQRT命令をダイレクトにコンパイラの生成コードで使用する場合には、C言語標準ライブラリの仕様で規定された errno 変数へのエラー番号の設定をどうするか、というトレードオフ問題が生じてしまうらしくて、その対応方法を選べるように、CC-RXもICCRXもGNURXも以下の画面コピーのコンパイルオプションを用意していました。(そして、それは何れのコンパイラでも、FDIV命令やDDIV命令を使うか使わないかを選ぶ、というのでは無かったです。)

    [訂正] すみません、GNURXは違ったようです。以下の -mrxv2-fsqrt オプションは文字通りにFSQRT命令に関するもので、DSQRT命令には関知していませんでした。そして、-mrxv2-fsqrt オプションを指定しない場合はFSQRT命令が使われなくなります。他方、-mrxv3-dsqrt オプションは存在しませんけれどもDSQRT命令は使われていました。標準ライブラリ内ではFSQRT命令もDSQRT命令も使われていなかったです。これは、どうも、FSQRT命令とDSQRT命令とでバランスがとても悪いことになっているようです。(歴史的経緯と互換性維持の兼ね合いによる落としどころなのだと思いますけれども。)

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

    CC-RX


    ICCRX


    GNURX

     

Children
No Data