RL78/G1xの割込みは、様々なアプリに対応できるように設計されています。しかし、そのハード構成などから、最も適した使い方があります。ここでは、その使い方を解説します。
割込み処理は、マイコン開発にとって重要ポイントです。しかし、機種特定の解説書は、見あたりません。RL78/G1xのアプリケーション・ノートにも、2013年8月時点では無いようです。あまりにも当然の事として、ルネサスは、解説不要と考えているのかもしれません。
そこで、ハード構成やレジスタ・バンク個数などから、素直な、おそらく最もスジが良い割込み処理の設定について考察します。開発当初から、この設定でソフト開発していれば、後々のトラブル回避にも都合が良いと思います。
結論を示します。ハード構成から、多重割込み処理の最適なパラメタ設定は下図です。赤字は、デフォルト以外の設定値を示します。
割込み優先レベルとデフォルト・プライオリティ
マスカブル割込みには、各割込み要因に対して0から53までの、「デフォルト・プライオリティの割込み順位がハードで設定済み」で、0が最高位、53が最低位です。これとは別に、「プログラマが設定可能な割込みの順位が、優先レベル0/1/2/3」です。レベル0が最高、レベル3が最低ですが、CubeSuite+のコード生成ツールでは、レベル0を高、レベル3を低、レベル1/2はそのまま表記します。
デフォルト・プライオリティは、複数の割込み要因が、同じ割込み優先レベルで発生した場合に、優先する順番のことで、通信関連の要因は高く、次がAD、タイマ関連が低いなど、マイコン機種に依存せず大体同じ順番です。一方、割込み優先レベルは、CubeSuite+のコード生成ツールで、「低にデフォルト設定」されています。何も考えずに、コード生成すると、「割込み処理は、全てレベル3に設定」されます。割込み優先レベル、次にデフォルト・プライオリティの順番で優先判定しますので、結局、デフォルト・プライオリティ順位がそのまま割込み受付順位となります。
多重割込み
割込み処理中に、より高い優先レベルの割込みを受け付けるか否かを決めます。デフォルトは、「多重割込み禁止」なので、割込み処理内でEI();により明示的に許可が必要です。最高レベルのレベル0でも許可は可能ですが、レジスタ・バンクが4個のため、避けるのが得策です。
レジスタ・バンク
RL78/G1xの汎用レジスタ格納場所がレジスタ・バンクで、RB0/1/2/3の4個あります。スタートアップで「RB0がデフォルト設定」されており、通常プログラムは、RB0を、割込みプログラムが、残り3個のRB1/2/3を使えます。割込みプログラムでの、レジスタ・バンクの使い方は任意です。コード生成出力は、「全ての割込みプログラムのレジスタ・バンクをデフォルトのRB0に設定」します。
このように、割込み処理のパラメタデフォルト設定値は、全処理で割込み優先レベル3、多重割込み禁止、RB0のみ使用となります。この設定では、本来のハード実力を活かした割込み処理はできません。
割込み優先レベル、多重割込み、レジスタ・バンク、それぞれがともに4個の選択肢があることには、関連があり、最大で4レベルの多重割込みを処理できることを示しています。但し、その最高レベルの0だけは特別で、通常の割込み処理には、レベル3~1を使うのがハード構成に適した使い方です。
レベル0は、最低限の処理を実行後、リセットするような特別な割込み処理用で、例えば、電圧低下を検出して、低下直前の動作状態を保持する用途などが考えられます。従って、専用レジスタ・バンクも不要ですし、多重割込みもなしです。処理後は、リセットするからです。万一、EI();で多重許可した場合には、割込み処理中に、受付けた割込みを再受付するようなトラブルに見舞われます。このトラブルは、結構ありがちです。最優先レベル0の多重割込み処理は、避けるべきです。
割込み優先レベル3~1は、多重割込みを許可し、専用レジスタ・バンクを設定しさえすれば、簡単に、しかも高速に3レベルの多重割込み処理が可能です。スタックを使っても同じ事ができますが、レジスタ・バンクの方が高速ですし、その分スタック節約にもなります。3レベルの処理なら、割込みレベルの割当ても容易です。最高優先処理をレベル1、最低優先処理をレベル3に割付け、それ以外は、レベル2に割付けても問題が発生したことは経験上ありません。
まとめ
割込み処理のトラブルは、処理ソフトのバグ以外にも、優先順位に起因するものもあり、難しいデバッグになりがちです。ソフト設計当初に、ここで示したハード構成に適した多重割込みパラメタを設定することがトラブル回避に役立ちます。