Smalight OSを使おう 8タスク目 タスク管理を使う2 [Smalight OS]
この記事は、某SNSで書いているものを転載しています。
今回は、前回やり残したタスク管理機構の「tslp_tsk」です。μITRON仕様にも、同じサービスコールが存在します。
しかしこのサービスコールは既にサンプルプログラムで何度も登場しているので、使い方に付いては既に把握して居らっしゃるかと思います。
このサービスコールは、その名前をご覧頂ければ判る様に、自タスクを待ち状態に遷移する「slp_tsk」に、時間管理機能を付加したもので、先頭の"t"が時間管理機能を表しています。
引数は単位をmsとした相対時間であり、符号付き32bitで表現されますので、最大は0x7fffffffとなります。しかし前から思うのですが、現在のシステムタイマーの値からの相対時間なので、ロールオーバーしちゃったらどうなるんでしょうかね。
動作を説明しますと、このサービスコールを発行することで、自タスクをRUNからWAITに遷移させます。
基本的に「slp_tsk」である事から、別のタスク等から起床要求を受けると、READYに遷移してしまいます。
この辺がμITRON仕様の「dly_tsk」と異なる所で、タスクがこのサービスコールから帰って来た時、その要因をリザルトコードで調べる処理が、場合に拠っては必要となります。
また、他タスク等からの起床要求を受けなかった時は、引数の相対時間が経過した後のシステムタイマーの更新タイミングで起床されます。
※「dly_tsk」は、自タスクの実行を引数の時間だけ遅延させ、時間が来たらREADYに遷移する。
リザルトコードとして取り得る値は、
E_OK:正常終了。起床要求を受けて待ち状態が解除された時、このリザルトコードが返ります。
E_TMOUT:ポーリング失敗(引数に TMO_POL(=0) を設定)、またはタイムアウト(相対時間が経過)した時、このリザルトコードが返ります。
ではサンプルプログラムを作成して、実際に体験してみましょう。
コンパイラの設定は、
SYSTIMEを有効
config.cの設定は、
tsk01:優先度1、起動時READY
tsk02:優先度2、起動時READY
SYSTIM_CYCLIC_TIMは10
ユーザー初期化関数uinitの設定は、
システムクロック10MHz
Raタイマー割り込み周期10ms
/***********************************/ /*** reset process ***/ /***********************************/ void uinit(void) { /* initialize */ pd2 = 0xff; /* Processor clock init */ init_clock(); /* systime initialize */ systim_init(); /* cyclic timer initialze */ init_timerRA(); }
tsk01、tsk02
void tsk01( void ) { W ercd; ercd = tslp_tsk( 1000 ); if( ercd == E_OK ) /*起床要求を受けた時*/ p2_0 = 0; /*ここにブレークポイントを設定*/ else /*タイムアウトした時*/ p2_0 = 1; /*ここにブレークポイントを設定*/ slp_tsk() ; } void tsk02( void ) { #if 1 #else wup_tsk( TID_1 ); #endif while( 1 ) ; }
オンチップデバッカーを起動し、tsk02の#if~#else文の条件を変更して、tsk01のブレークポイントのどちらで停止するか試してみて下さい。
まずtsk01が先に起動し、tslp_tskで時間を設定した上で、WAITに遷移しています。
次にtsk01がWAITに遷移した為に,tsk02がREADYからRUNに遷移し、実行を始めます。
この時#if 1ならば、何もせずに無限ループに入ります。
tsk01は何処からも起床要求を受けなかったので、タイムアウトでtslp_tskから抜けて来ます。
その結果、条件式のelse側の処理が行われる事となります。
#if 0とした時は、tsk02はtsk01の起床要求を発行します。
そうするとtsk01はWAITからREADYに遷移しますが、サービスコールの中で実行中のタスク(tsk02)と優先度が比較され、当然tsk01の方が優先度が高い事から、実行中のタスクが切り替えられるプリエンプトが発生し、その時のリザルトコードからE_OK側の処理が行われます。
やはりこれですね。(ループ中)
ITRONプログラミング入門―H8マイコンとHOSで始める組み込み開発
- 作者: 浜原 和明
- 出版社/メーカー: オーム社
- 発売日: 2005/04/25
- メディア: 単行本
コメント 0