お世話になっております。現在Rx65N target boardを使用しており、現在割り込みの処理について悩んでおります。
例えば以下のように2種類の処理+main関数があったとします。2つのコンペアマッチタイマを使用しております。
タイマ割り込み処理1(0.5秒間隔、処理は0.1秒で終了)、タイマ割り込み処理2(10秒間隔、処理は9秒継続)
処理1、処理2は同時に開始され、処理1を優先して実行したく、処理2の実行を中断し、処理1を行い、また処理2を続きから実施したいイメージです。
(質問1)
割り込みは優先度が設定できますが、割り込み先(この場合処理2)に多重割り込みを受けつける(R_BSP_SETPSW_I();)がないと処理2が始まった場合、処理1の割り込みが機能しないという認識でよいでしょうか?
(質問2)
タイマはコンペアマッチタイマでは多重割り込みを設定するスマートコンフィギュレータの項目がありますが、TMR(8ビットタイマ)にはそのような項目がありませんでした。TMRに処理2を載せ、R_BSP_SETPSW_I();としても処理1の割り込みができなかったのですが、TMRは多重割り込みができないという認識で良いでしょうか?その場合、TMRに落としたくない処理(処理1)を実装するような使い方が正しいでしょうか?
(質問3)
コンペアマッチタイマと8ビットタイマの使い分けについてお教え頂ければ幸いです。
(質問4)
処理2に多重割り込みを許可した場合に、処理2の処理時間が割り込み間隔10秒を超え15秒かかった場合どのような処理になるでしょうか?
いつもご支援いただきありがとうございます。どうぞよろしくお願いいたします。
回答1)PSWのIビットをセットすることで多重割り込みが有効化されます。最近のバージョンからスマートコンフィギュータの設定に多重割り込みが有効化するコード生成が一部できるようになりましたが。できないものもあるのでそこは別途、コード生成で追加コードを無視するための書き方をする必要があります。複数の割り込みがあって、実行されたハンドラのみが実行されます。Iフラグがセットされるまでは割り込みハンドラが一つだけ呼び出され、それが終了するまで別のハンドラは実行できません。多重割り込み有効にすれば優先度が高いイベントが発生したら先行するハンドラ実行中、処理を中断して優先順位が高い方のハンドラを実行します。
回答2)スマートコンフィギュータの設定で多重割り込みできるようになったのはここ一年くらいで以前はコメントでコード生成で消さないで欲しい旨を記述する必要がありました。この場合もそれで対応できます。
https://www.renesas.com/ja/document/mat/rx-smart-configurator-users-guide-e-studio?r=1622686
10章の「ユーザーコード保護機能」参照
回答3)コンペアマッチというタイマがある訳ではなくコンペアマッチというタイマの使い方の一つがあるだけです。コンペアマッチという場合はCMTもしくはCMTWです。ビット数が16、32と違いがありますので例えばタイマの解像度が必要ならプリスケーラを小さく、ビット数が多い方がいいですね。周期処理をするだけなら8ビットでも構わないでしょうね。
回答4)10秒サイクルで呼び出される処理が10秒で完結しないなら10秒は実現できませんので考えを改めてください。合わせて10秒ずっと割り込みハンドラの中で処理するのではなく、mainループ側にイベントが起こったことを大域変数で通知してmainループで処理をするのがいいです。
Yamamoto ご丁寧にありがとうございます。とても良く理解いたしました。今後ともどうぞよろしくお願いいたします。