目次
前
次
時間待ちはシステムに一任
タスクが時間待ちをして動作する必要があるときは、システムコール
wai_tskを利用するように工夫した方がよいでしょう。
人間や機械が相手の場合は、10msのN倍でだいたいの処理を実現
可能です。
時間待ちのために、タイマー割込みを使う方法もありますが、RTOSの
もつ機能に任せた方が、簡単で安全です。
周期的データ取得例
周期的にデータ取得しながら、動作するシステムでは、wai_tsk
システムコールを利用します。
計測分野では、このような周期的データ取得タスクが便利です。
温度センサーからデータ取得し保存する例を説明します。
温度センサーへ、データ変換開始を指定してから750ms後に
結果を取得して保存するには、次のシーケンスを適用します。
- 温度センサーからデータ取得
- データ保存
- 温度変換の指令発行
- システムコールで時間指定
タスクでは、次のコードにします。
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 );
目次
前
次