かふぇルネから飛んでこられた方。こんにちは、ふぐりんです。
このドキュメントは「NORTi を RX Smartconfigurator と一緒に使う方法」の解説です。
NoMaYさん考案のプログラムによって、NORTiとスマートコンフィグレータを一緒に使うことができるようになりました。スマートコンフィグレータ(FIT/CG)の自動生成コードは何も改変せずに、ユーザコードエリアやコールバックからNORTiの機能を使えます。またNORTi方式の割り込みもそのまま併用できます。
経緯については以下のかふぇルネのスレッドをご覧ください。
【謝辞】
NoMaYさんが考案したプログラムを中心に解説しています。NoMaYさんにあらためてお礼申し上げます。
株式会社ミスポ様には関連コードの公開を許諾いただきました。ありがとうございました。お礼申し上げます。
ka.makiharaさんにはNoMaYさんのプログラム作成に協力いただき、また実証実験もしていただきました。ありがとうございました。お礼申し上げます。
【お願い】
ミスポ様にご協力いただいた情報を参考にしていますが、NoMaYさんのプログラムおよび今回の解説にミスポ様は直接関係されていません。NoMaYさんのプログラムおよび今回の解説について直接ミスポ様へ問い合わせすることはおやめください。
【ご利用について】
ここで解説されている情報は商用/非商用にかかわらずご利用いただけますが、何も保証しません。
動作の解説 <--詳細はクリック
・これまで(NoMaYさん考案前)
・これから(NoMaYさん考案のフックルーチンがある)
・割り込みレベル自動判定【2023.05.05 追記】
- RXシリーズの開発環境(CS+,CC-RX)でプロジェクトを作ります
- プロジェクトにNoMaYさんの下記プログラムを追加します
動作の解説の「割り込みレベル自動判定 有/無 のどちらを使うべきか」参照
- NORTiを組み込みます
- NORTiのintini()の "initialize interrupt vector table" 部分を以下と入れ替えます
/* initialize interrupt vector table (on RAM) */
#if (INTVSZ != 0) // NORTi管理の割り込みベクタテーブルがRAMであれば普通は1024
extern void NORTi_INT_HOOK_init(void); // Int_Hook_Vectors[]をINTBレジスタにセット(NoMaYさん作成)
NORTi_INT_HOOK_init(); //
{
int i;
UW *vect = (UW *)__sectop("C$VECT"); // C$VECTセクション(CC-RXオリジナルの割り込みベクタテーブル)
UW *hook = (UW *)get_intb(); // NORTi対応割り込みベクタテーブル(NoMaYさん作成,Int_Hook_Vectors[])
for (i = 0; i < INTVSZ / 4; i++) { // 割り込みベクタテーブル(NORTi管理,RAM)全体にコピー
intvec[i] = (i<16)?vect[i]:hook[i]; // 0~15は無条件トラップ専用なのでC$VECT、それ以外はInt_Hook_Vectors[]
}
}
#endif
- NORTi_interrupt_safe.cを使う場合は、プログラムのどこかに以下を定義しておきます。
uint8_t NORTi_INT_HOOK_KNL_LEVEL = KNL_LEVEL;
上記でセットアップは完了です。
ユーザコードエリアやコールバック内でNORTiを利用できます。
割り込みサービスルーチン(cre_isr())を使う前に、1回だけ def_inh(割り込み番号, NULL) をしてください。(NULLを指定することで、割り込みベクタにNORTiの管理用ルーチンが上書きされます)
動作の解説の「割り込みレベル自動判定【2023.05.05 追記】」参照
デモ <--詳細はクリック
・使用ツールと実験プログラムについて
・実験1.r_cmt_rx(FIT)の10msec周期コールバックからNORTiのチックタイム通知(isig_tim())
・実験2.TMR0(CG)で#pragma interrupt の割り込みルーチンからタスク起床(wup_tsk())
・実験3.TMR1(CG)の改造でdef_inh() のNORTi割り込みハンドラからタスク起床(wup_tsk())
・実験4.TMR2(CG)の改造でcre_isr() のNORTi割り込みサービスルーチンからタスク起床(wup_tsk())
・実験5.TMR3(CG)で#pragma interrupt の割り込みルーチンを非NORTiとして再登録(def_inh())してカウンタ変数更新を確認
・おまけ1(スタックがぎりぎりやった)
・おまけ2(エミュレータ経由のデバッグコンソール出力はけっこう遅い)
ソフトウェア割り込み発生から実際の割り込み処理に到達するまでの時間を観測しました。
処理ケース | 実測値 | API |
---|---|---|
① CCRX 割り込みルーチン(#pragma interrupt) | 0.66usec | × |
② NORTi CCRX割り込み対応(ient_int()) | 1.25usec | 〇 |
③ NORTi 割り込みハンドラ(def_inh()) | 1.12usec | 〇 |
④ NORTi 割り込みサービスルーチン(cre_isr()) | 1.22usec | 〇 |
⑤ NoMaYさんフックルーチン 割り込みレベル自動判定なし (NORTi_interrupt.c) | 1.40usec | 〇 |
⑥ NoMaYさんフックルーチン 割り込みレベル自動判定あり (NORTi_interrupt_safe.c) | 1.50usec(≦KNL_LEVEL) | 〇 |
1.04usec(> KNL_LEVEL) | × |
API:NORTiのAPI呼出の可否
【条件】
・Target Board for RX65N,CS+
・システムクロック(ICLK)=120MHz
【処理ケースの概要】
#pragma interrupt を使ったCCRXの割込みルーチン。FITでも使用
割り込み発生+「CCRX 入口処理」--> 割り込み処理
MiSPOさん提供のient_int()/iret_int()を使用して、#pragma interrupt を使ったCCRXの割込みルーチンをNORTi対応にした場合
割り込み発生+「CCRX 入口処理」+(左記スタック破棄)+「NORTi 入口処理」--> 割り込み処理
NORTiの割込みハンドラの場合。NoMaYさんフックルーチン使用時も利用可能
割り込み発生+「NORTi 入口処理」--> 割り込み処理
NORTiの割込みサービスルーチンの場合。NoMaYさんフックルーチン使用時も利用可能(おまじない必要)
割り込み発生+「NORTi 入口処理」+isrサービス管理 --> 割り込み処理
NoMaYさんフックルーチン(NORTi_interrupt.c)を経由した#pragma interrupt を使ったCCRXの割込みルーチンの場合
割り込み発生+「NORTi 入口処理」+「CCRX 入口処理」 --> 割り込み処理
NoMaYさんフックルーチン(NORTi_interrupt_safe.c)を経由した#pragma interrupt を使ったCCRXの割込みルーチンの場合
(≦KNL_LEVEL)であれば
割り込み発生+「割り込みレベル判定」+「NORTi 入口処理」+「CCRX 入口処理」 --> 割り込み処理
(> KNL_LEVEL)であれば
割り込み発生+「割り込みレベル判定」+「CCRX 入口処理」 --> 割り込み処理