目次

時間待ちはシステムに一任

 タスクが時間待ちをして動作する必要があるときは、システムコール
 wai_tskを利用するように工夫した方がよいでしょう。

 人間や機械が相手の場合は、10msのN倍でだいたいの処理を実現
 可能です。

 時間待ちのために、タイマー割込みを使う方法もありますが、RTOSの
 もつ機能に任せた方が、簡単で安全です。


周期的データ取得例

 周期的にデータ取得しながら、動作するシステムでは、wai_tsk  システムコールを利用します。  計測分野では、このような周期的データ取得タスクが便利です。  温度センサーからデータ取得し保存する例を説明します。  温度センサーへ、データ変換開始を指定してから750ms後に  結果を取得して保存するには、次のシーケンスを適用します。
  1. 温度センサーからデータ取得
  2. データ保存
  3. 温度変換の指令発行
  4. システムコールで時間指定
 タスクでは、次のコードにします。 typedef unsigend short UWORD ; void tsk8_proc(void) { UWORD tmp ; /* 温度センサーからデータ取得 */ tmp = get_thermometer(); /* データ保存 */ store_data( tmp ); /* 温度変換の指令発行 */ start_thermometer(); /* システムコールで時間指定 */ wai_tsk( 75 ) ; }  タスクの初期状態はREADYにします。 sta_tsk( TSK_ID8 , TTS_READY ) ;  初期状態をREADYとしたので、タスクは次の状態遷移を繰り返します。 READY->RUN->WAIT->READY->RUN->WAIT->READY->  最初の温度は、ゴミになりますが、2回目以降の正常値になります。  システムコールwai_tskは、10msから655350msまで  時間差を扱えます。  1分ごとの温度計測にしたいときは wai_tsk( 60 * 100 )  とします。

限時タイマー処理

 システムにより、特定イベント発生直後に、信号をONし、指定時間後に  その信号をOFFしたいことがあります。  これは、オフディレイタイマーと呼ばれます。  また、特定イベント発生から指定時間後に、信号をONしたいことも発生  します。この動作は、オンディレイタイマーと呼ばれます。  オフディレイとオンディレイは、まとめて限時タイマーと呼ばれます。  オフディレイタイマーを、タスクで実現します。  イベントをとらえて、信号をONしてから、システムコールで  時間待ちのタスクを起動します。  待ち時間は、10msの整数倍で制御することにしてカウンタを  使います。 unsigned short count ; void tsk5_proc(void) { if ( OUT_EVENT == ON ) { XSIGNAL = ON ; count = XPERIOD ; rsm_tsk( TSK_ID6 ); } }  指定時間内ではCycle動作をし、タイムアウトした時点で信号を  OFFします。タスクとしては、その時点で終了します。 void tsk6_proc(void) { count-- ; if ( count == 0 ) { XSIGNAL = OFF ; slp_tsk(); } else { wai_tsk( 1 ); } }  イベントを監視するタスクはREADY、オフディレイ用タスクは  SUSPENDで起動します。 sta_tsk( TSK_ID5 , TTS_READY ); sta_tsk( TSK_ID6 , TTS_SUSPEND );  オンディレイタイマーを、タスクで実現します。  イベントをとらえて、システムコールで時間待ちのタスクを起動します。  待ち時間は、10msの整数倍で制御することにしてカウンタを  使います。 unsigned short count ; void tsk5_proc(void) { if ( OUT_EVENT == ON ) { count = XPERIOD ; rsm_tsk( TSK_ID6 ); } }  指定時間内ではCycle動作をし、タイムアウトした時点で信号を  ONします。タスクとしては、その時点で終了します。 void tsk6_proc(void) { count-- ; if ( count == 0 ) { XSIGNAL = ON ; slp_tsk(); } else { wai_tsk( 1 ); } }  イベントを監視するタスクはREADY、オフディレイ用タスクは  SUSPENDで起動します。 sta_tsk( TSK_ID5 , TTS_READY ); sta_tsk( TSK_ID6 , TTS_SUSPEND );
目次

inserted by FC2 system