目次
前
次
システムコール
システムコールは、OSのもつ機能を呼び出し、使うための関数です。
μITRONに準拠したシステムコールを用意しました。
以下のシステムコールを持ちます。
- cre_tsk タスクをシステムに登録します
- sta_tsk タスクを指定の状態で起動します
- sus_tsk IDを指定して、タスクをSUSPEND状態にします
- rsm_tsk IDを指定して、タスクをREADY状態にします
- slp_tsk 自タスクを、SUSPEND状態にします
- wai_tsk 指定時間、自タスクをWAIT状態にします
システムコールを利用すると、個々のタスクは、下図のように状態遷移します。
タスクは、RUN、READY、SUSPEND、WAITの4状態をもちます。
- RUN CPUを使い、必要な処理を実行中です
- READY CPUの割当てを待っています
- SUSPEND 時間待ちではない、待ち状態にいます
- WAIT タイムアウトになるのを待っています
READY→RUNは、USOのタスクディスパッチャが担当します。
RUN→SUSPENDは、システムコールslp_tskを利用します。
RUN→WAITは、システムコールwai_tskを利用します。
READY→SUSPENDは、システムコールsus_tskを利用します。
SUSPEND→READYは、システムコールrsm_tskを利用します。
WAIT→READYは、USOのスケジューラが担当します。
RTOSを理解して使いこなすには、タスクの状態をどうしたいかを
考えればよいことになります。タスクの状態を考えにくい場合は
タスクを職人として、どう働かせたいかを考えます。
タスクが職人であれば、専門の仕事があります。
仕事のやり方を考えるのが、タスク内部の処理に相当します。
各システムコールについて説明します。
cre_tsk
タスクをシステムに登録します。
タスク動作を関数としてシステムに登録します。
実際には、次のように使います。
cre_tsk(TSK_ID0,tsk0_proc);
cre_tsk(TSK_ID1,tsk1_proc);
このとき、タスクの状態は不定です。
sta_tsk
タスクを指定の状態で起動します。
タスクの担当処理により、起動時にはSUSPENDであった方がよい
こともあるので、READY、SUSPEND、WAITのいずれかの状態を指定
できるようにしました。
実際には、次のように使います。
sta_tsk(TSK_ID0,TTS_READY) ;
sta_tsk(TSK_ID1,TTS_SUSPEND);
sta_tsk(TSK_ID2,TTS_WAIT);
sus_tsk
IDを指定して、タスクをSUSPEND状態にします。
タスク間に主従関係があるときは、主タスクが従タスクの状態を
操作したい場面に出くわします。
その場合に、タスクIDを指定して、従タスクをSUSPENDに
遷移させます。
実際には、次のように使います。
sus_tsk( TSK_ID3 ) ;
rsm_tsk
IDを指定して、タスクをREADY状態にします。
タスク間に主従関係があると、主タスクが従タスクの状態を
操作したい場面に出くわします。
その場合に、タスクのIDを指定して、従タスクをREADYに
遷移させます。
実際には、次のように使います。
rsm_tsk( TSK_ID2 ) ;
slp_tsk
自タスクを、SUSPEND状態にします
1回だけ、そのタスクを実行したいような場合、主タスクが
該当タスクを起動後、主タスクは手を加えない使い方を実現
したいときに利用します。
実際には、そのタスクでの作業をすべて終了したならば、次の
ようにシステムコールを発行します。
slp_tsk() ;
wai_tsk
指定時間、自タスクをWAIT状態にします。
該当タスクが、周期的に処理を実行したい場合に利用します。
時間は、10msのN倍(Nは、1〜65535)で
10msから65535ms(=655.35秒)までタスクをWAIT
にできます。
1分ごとに温度を取得し、シリアル回線に流す場合などに
このシステムコールを利用できます。
実際のタスクで、定義してみると、以下となります。
unsigned char counter ;
void tsk2_proc(void)
{
/* increment */
counter++ ;
/* turn on or off LED */
LED_BIT = counter & 1 ;
/* wait 1 second */
wai_tsk( 100 ) ;
}
目次
前
次