Toppers/ASP3の使い方

図

ここでは、Toppers/ASP3のタスク以外の実装方法について解説します。CARTOS編と同様の環境で使用することを前提としていますので、併せてご覧ください。

CARTOS編 第4回 「組み込みシステムにおけるデバイスドライバの役割」
CARTOS編 第5回 「デバッグを効率化する機能とRTOSのタスク実装を実践」

イベントフラグ

イベントフラグについても、簡単に触れておきます。

イベントフラグの場合は、T_CFLGを使用しています。

						T_CFLG flg;

						flg.flgatr = TA_CLR;
						flg.iflgptn = 0;
					

イベントフラグの生成

fid = acre_flg(&flg);

イベントフラグのセット

set_flg(fid, FLG_PTN);
FLG_PTNは任意の32ビット長

タスクでイベントフラグを使うときは、wai_flgでイベントフラグがセットされるのを待ちます。

イベントフラグの使用例

						void adc_task(intptr_t exif) {
						    FLGPTN flg_ptn;

						    /* ToDo */
						    for(;;) {
						        wai_flg(fid, FLG_PTN, TWF_ANDW, &flg_ptn);
						        clr_flg(fid, 0); 
						    }
						}
					

イベントフラグを待つときは、事前にFLGPTN flg_ptnを定義して、フラグパターンを受け取とれるようにする必要があります。そして、wai_flg(…)は、対象とするイベントフラグID(fid)が、指定パターン(FLG_PTN)と受け取ったフラグパターン(flg_ptn)が完全一致(TWF_ANDW)した時にだけ、次の行を実行することができます。それ以外の場合は、他のタスクに処理が移ります。(通常、この動作を「ディスパッチされる」と言ったりします。)

また、wai_flg()でパターンが合致した場合は、受け取ったフラグのパターンをクリアしてやる必要があります。clr_flg(fid, 0);とすることで、イベントフラグが解除され、この例のタスクの場合、またイベントフラグ待ちになります。

図1は、イベントフラグをセットしたところでプログラムを止めた時のRTOSビューアーの様子です。フラグパターンが0x5555AAAAにセットされたことがわかります。

図図1:イベントフラグの状態を表示

周期ハンドラの設定

周期ハンドラについても、簡単に触れておきます。

周期ハンドラの登録

周期ハンドラの場合は、T_CCYCT_NFYINFOを使用しています。この例では、cyc_funcという周期ハンドラを10秒ごとに起動させます。

						T_CCYC cyc;
						T_NFYINFO nfy;

						nfy.nfymode = 0;
						nfy.nfy.handler.tmehdr = cyc_func;

						cyc.cycatr = TA_NULL;
						cyc.nfyinfo = nfy;
						cyc.cyctim = (RELTIM)10000000;
						cyc.cycphs = (RELTIM)10000000;

						周期ハンドラ本体は、タスクと同じように、関数のように記述します。
						void cyc_func(intptr_t exif)
						{
						    /* ToDo */
						}
					

周期ハンドラの生成

周期ハンドラの生成は、acre_cycです。

cycid = acre_cyc(&cyc);

周期ハンドラの起動

周期ハンドラの起動は、sta_cycです。

ercd = sta_cyc(cycid);

図2は、RTOSビューアーで周期ハンドラの状態を確認したものです。

図図2:周期ハンドラの状態

割り込みの設定

割り込みは、どんなにCPUが速くなってもほぼ全てのシステムで使われるといっても過言ではないでしょう。それだけ、多くの組込みシステム開発に使われています。

SOLID-OSによる割り込みは、Toppers/ASP3がベースになっており、カーネルの管理下で割り込みの処理を行いますので、「割り込みサービスルーチン(ISR)」または「管理内割り込み」と呼んだりします。それ以外のものは、「割り込みハンドラ」もしくは「カーネル管理外割り込み」と呼びます。

割り込みベクタテーブル

組み込みシステムで割り込みを使う場合、いくつかファイルをいじらなければいけなくなります。その一つが、割り込みベクターテーブルと呼ばれるものです。

SOLID-OSの場合も、基本的には同じ考えではありますが、kernel_cfg.cの中で登録できてしまいます。実際に見てみましょう。

						使用する割り込みリソースの数を登録します。
						kernel_cfg.c中に、
						#define TNUM_AID_ISR    0     //ISR(割り込みサービスルーチン

						となっています。ISRとして2本使用する場合は、
						#define TNUM_AID_ISR    2     //ISR(割り込みサービスルーチン
					

割り込み初期化設定ブロック

次に、「割り込み初期化設定ブロック」の設定をします。今回は、CARTOS編の第4回で使用したGPIを割り込みとして使用します。RZ/Aの場合は、割り込みIDが該当し、GPI_234GPI_335になります。

						const INTINIB _kernel_intinib_table[] = {
						    {34, TA_NULL, INTINIB_USE_ISR, TA_NULL, -16},
						    {35, TA_NULL, INTINIB_USE_ISR, TA_NULL, -16},
						}
					

この内容で登録します。もし、他の割り込みソースを使用するのであれば、割り込みIDを変更して下さい。この設定が、割り込みベクターテーブルへの登録に該当します。SOLID-OSは、kernel_cfg.c内で記述できるので、とても便利ですね。

割り込みサービスルーチンの登録

次に、割り込みサービスルーチンの登録です。T_CISRを使用します。

						T_CISR adisr[2];

						adisr[0].isr = adc_start_isr;
						adisr[0].intno = 34;
						adisr[0].isratr = TA_NULL;
						adisr[0].isrpri = 2;

						adisr[1].isr = adc_stop_isr;
						adisr[1].intno = 35;
						adisr[1].isratr = TA_NULL;
						adisr[1].isrpri = 2;
					

adisr[0]で登録しているのは、「スタートボタン」を割り込みとして使用した時の設定で、GPI_2にアサインされています。そして、割り込みの優先度は比較的高くしているので、「2」としています。割り込みサービスルーチンに該当する関数は、「adc_start_isr」としています。

adc_start_isrは、下記のようにしています。

						void adc_start_isr(intptr_t exif)
						{
						    /* フラグ設定 */
						    /* 待ち状態のタスクを起動*/
						    wup_tsk(…);
						}	
					

同じように、adisr[1]には、「ストップボタン」として登録し、GPI_3をアサインしています。割り込みサービスルーチンの関数としては、「adc_stop_isr」としています。

adc_stop_isrは、下記のようにしています。

						void adc_start_isr(intptr_t exif)
						{
						    /* フラグ設定 */
						}
					

ここでのフラグ設定は、イベントフラグではなく、グローバル変数のフラグを設定しているだけです(図3)。もちろん、イベントフラグを指定しても構いません。

図図3:割り込み割り込みサービスルーチンによるフラグ操作

同じμITRON系でも割り込みサービスルーチン内でタスクの制御を行う場合は、iwup_tskとしなければいけないものもありますが、Toppers/ASP3の場合は、同一のものとして扱われます。

割り込みサービスルーチンの生成

割り込みの登録ができたら、割り込みサービスルーチンを生成する必要があります。

						acre_isr(&adisr[0]);
						acre_isr(&adisr[1]);
					

これで割り込みサービスルーチンがカーネル管理下に登録されました。

割り込みの許可と禁止

割り込みサービスルーチンを動かすためには、割り込みを許可する必要があります。

割り込み許可と割り込み禁止
  • 割り込み許可 ena_int(…)
  • 割り込み禁止 dis_int(…)

引数には、該当する割り込み番号(RZ/Aでは、割り込みID)を指定する必要があります。これで、いつでもボタンの割り込みが働くようになります。今回は、実際にSOLID-OSのリソースを使用して、タスク、イベントフラグ、周期ハンドラ、割り込みサービスルーチンの使用方法まで触れてみました。

CARTOS編 第5回 「デバッグを効率化する機能とRTOSのタスク実装を実践」

前の記事を読む