第4章  タスク付属同期機能
 本章では,RI850V4が提供しているタスク付属同期機能について解説しています。
 
 RI850V4におけるタスク付属同期機能では,タスクに従属した同期機能を提供しています。
 
 起床待ち状態への移行(永久待ち)は,以下に示したサービス・コールを処理プログラムから発行することにより実現されます。
 
 -	 
slp_tsk
自タスクをRUNNING状態からWAITING状態(起床待ち状態)へと遷移させます。
ただし,本サービス・コールを発行した際,自タスクの起床要求がキューイングされていた(起床要求カウンタが0x0以外)場合には,状態操作処理は行わず,起床要求カウンタから0x1を減算します。
なお,起床待ち状態の解除は,以下の場合に行われ,起床待ち状態からREADY状態へと遷移します。
 
 
| 
 #include        <kernel.h>              /*標準ヘッダ・ファイルの定義*/
 
 #include        <kernel_id.h>           /*システム情報ヘッダ・ファイルの定義*/
 
 
 
 void
 
 task ( VP_INT exinf )
 
 {
         ER      ercd;                   /*変数の宣言*/
 
 
         ............
         ............
 
 
         ercd = slp_tsk ( );             /*起床待ち状態への移行(永久待ち)*/
 
 
         if ( ercd == E_OK ) {
                 ............            /*正常終了処理*/
                 ............
         } else if ( ercd == E_RLWAI ) {
                 ............            /*強制終了処理*/
                 ............
 | 
| 
         }
 
 
         ............
         ............
 }
 | 
 
 起床待ち状態への移行(タイムアウト付き)は,以下に示したサービス・コールを処理プログラムから発行することにより実現されます。
 
 -	 
tslp_tsk
自タスクをRUNNING状態からタイムアウト付きのWAITING状態(起床待ち状態)へと遷移させます。
ただし,本サービス・コールを発行した際,自タスクの起床要求がキューイングされていた(起床要求カウンタが0x0以外)場合には,状態操作処理は行わず,起床要求カウンタから0x1を減算します。
なお,起床待ち状態の解除は,以下の場合に行われ,起床待ち状態からREADY状態へと遷移します。
 
  
|  |  | 
|  |  | 
|  |  | 
|  |  | 
|  |  | 
| 
 パラメータtmout で指定された待ち時間が経過した
 |  | 
 
 
| 
 #include        <kernel.h>              /*標準ヘッダ・ファイルの定義*/
 
 #include        <kernel_id.h>           /*システム情報ヘッダ・ファイルの定義*/
 
 
 
 void
 
 task ( VP_INT exinf )
 
 {
         ER      ercd;                   /*変数の宣言*/
         TMO     tmout = 3600;           /*変数の宣言,初期化*/
 
 
         ............
         ............
 
 
         ercd = tslp_tsk ( tmout );      /*起床待ち状態への移行(タイムアウト付き)*/
 
 
         if ( ercd == E_OK ) {
                 ............            /*正常終了処理*/
                 ............
         } else if ( ercd == E_RLWAI ) {
                 ............            /*強制終了処理*/
                 ............
         } else if ( ercd == E_TMOUT ) {
                 ............            /*タイムアウト処理*/
                 ............
         }
 
 
         ............
         ............
 }
 | 
 
 備考	 待ち時間
tmoutにTMO_FEVRが指定された際には“
slp_tskと同等の処理”を実行します。
 
 タスクの起床は,以下に示したサービス・コールを処理プログラムから発行することにより実現されます。
 
 -	 
wup_tsk,
iwup_tsk
パラメータ
tskidで指定されたタスクをWAITING状態(起床待ち状態)からREADY状態へ,またはWAITING-SUSPENDED状態からSUSPENDED状態へと遷移させます。
ただし,本サービス・コールを発行した際,対象タスクが起床待ち状態以外の場合には,状態操作処理は行わず,起床要求カウンタに0x1を加算します。
以下に,本サービス・コールの記述例を示します。
 
 
| 
 #include        <kernel.h>              /*標準ヘッダ・ファイルの定義*/
 
 #include        <kernel_id.h>           /*システム情報ヘッダ・ファイルの定義*/
 
 
 
 void
 
 task ( VP_INT exinf )
 
 {
         ID      tskid = ID_TSK1;        /*変数の宣言,初期化*/
 
 
         ............
         ............
 
 
         wup_tsk ( tskid );              /*タスクの起床*/
 
 
         ............
         ............
 }
 | 
 
 備考	 RI850V4が管理する起床要求カウンタは,7ビット幅で構成されています。このため,本サービス・コールでは,起床要求数が127回を越えるような場合には,起床要求のキューイング(起床要求カウンタの加算処理)は行わず,戻り値としてE_QOVRを返します。
 
 起床要求の解除は,以下に示したサービス・コールを処理プログラムから発行することにより実現されます。
 
 -	 
can_wup,
ican_wup
パラメータ
tskidで指定されたタスクにキューイングされている起床要求をすべて解除(起床要求カウンタに0x0を設定)します。
なお,本サービス・コールは戻り値として解除した起床要求数を返します。
以下に,本サービス・コールの記述例を示します。
 
 
| 
 #include        <kernel.h>              /*標準ヘッダ・ファイルの定義*/
 
 #include        <kernel_id.h>           /*システム情報ヘッダ・ファイルの定義*/
 
 
 
 void
 
 task ( VP_INT exinf )
 
 {
         ER_UINT ercd;                   /*変数の宣言*/
         ID      tskid = ID_TSK1;        /*変数の宣言,初期化*/
 
 
         ............
         ............
 
 
         ercd = can_wup ( tskid );       /*起床要求の解除*/
 
 
         if ( ercd >= 0x0 ) {
                 ............            /*正常終了処理*/
                 ............
         }
 
 
         ............
         ............
 }
 | 
 
 WAITING状態の強制解除は,以下に示したサービス・コールを処理プログラムから発行することにより実現されます。
 
 -	 
rel_wai,
irel_wai
パラメータ
tskidで指定されたタスクのWAITING状態を強制的に解除します。これにより,対象タスクは待ちキューから外れ,WAITING状態からREADY状態へ,またはWAITING-SUSPENDED状態からSUSPENDED状態へと遷移します。
なお,本サービス・コールの発行によりWAITING状態を解除されたタスクには,WAITING状態へと遷移するきっかけとなったサービス・コール(
slp_tsk,
wai_semなど)の戻り値としてE_RLWAIを返します。
以下に,本サービス・コールの記述例を示します。
 
 
| 
 #include        <kernel.h>              /*標準ヘッダ・ファイルの定義*/
 
 #include        <kernel_id.h>           /*システム情報ヘッダ・ファイルの定義*/
 
 
 
 void
 
 task ( VP_INT exinf )
 
 {
         ID      tskid = ID_TSK1;        /*変数の宣言,初期化*/
 
 
         ............
         ............
 
 
         rel_wai ( tskid );              /*WAITING状態の強制解除*/
 
 
         ............
         ............
 }
 | 
 
 備考1	 本サービス・コールでは,解除要求のキューイングが行われません。このため,対象タスクがWAITING状態,またはWAITING-SUSPENDED状態以外の場合には,戻り値としてE_OBJを返します。
 
 備考2	 本サービス・コールでは,SUSPENDED状態の解除は行われません。
 
 SUSPENDED状態への移行は,以下に示したサービス・コールを処理プログラムから発行することにより実現されます。
 
 -	 
sus_tsk,
isus_tsk
パラメータ
tskidで指定されたタスクをRUNNING状態からSUSPENDED状態へ,READY状態からSUSPENDED状態へ,またはWAITING状態からWAITING-SUSPENDED状態へと遷移させます。
ただし,本サービス・コールを発行した際,対象タスクがSUSPENDED状態,またはWAITING-SUSPENDED状態へと遷移していた場合には,状態操作処理は行わず,サスペンド要求カウンタに0x1を加算します。
以下に,本サービス・コールの記述例を示します。
 
 
| 
 #include        <kernel.h>              /*標準ヘッダ・ファイルの定義*/
 
 #include        <kernel_id.h>           /*システム情報ヘッダ・ファイルの定義*/
 
 
 
 void
 
 task ( VP_INT exinf )
 
 {
         ID      tskid = ID_TSK1;        /*変数の宣言,初期化*/
 
 
         ............
         ............
 
 
         sus_tsk ( tskid );              /*SUSPENDED状態への移行*/
 
 
         ............
         ............
 }
 | 
 
 備考	 RI850V4が管理するサスペンド要求カウンタは,7ビット幅で構成されています。このため,本サービス・コールでは,サスペンド要求数が127回を越えるような場合には,サスペンド要求のキューイング(サスペンド要求カウンタの加算処理)は行わず,戻り値としてE_QOVRを返します。
 
 SUSPENDED状態の解除は,以下に示したサービス・コールを処理プログラムから発行することにより実現されます。
 
 -	 
rsm_tsk,
irsm_tsk
パラメータ
tskidで指定されたタスクをSUSPENDED状態からREADY状態へ,またはWAITING-SUSPENDED状態からWAITING状態へと遷移させます。
ただし,本サービス・コールを発行した際,サスペンド要求がキューイングされていた場合には,状態操作処理は行わず,サスペンド要求カウンタの減算処理のみを行います。
以下に,本サービス・コールの記述例を示します。
 
 
| 
 #include        <kernel.h>              /*標準ヘッダ・ファイルの定義*/
 
 #include        <kernel_id.h>           /*システム情報ヘッダ・ファイルの定義*/
 
 
 
 void
 
 task ( VP_INT exinf )
 
 {
         ID      tskid = ID_TSK1;        /*変数の宣言,初期化*/
 
 
         ............
         ............
 
 
         rsm_tsk ( tskid );              /*SUSPENDED状態の解除*/
 
 
         ............
         ............
 }
 | 
 
 備考	 本サービス・コールでは,解除要求のキューイングが行われません。このため,対象タスクがSUSPENDED状態,またはWAITING-SUSPENDED状態以外の場合には,戻り値としてE_OBJを返します。
 
 SUSPENDED状態の強制解除は,以下に示したサービス・コールを処理プログラムから発行することにより実現されます。
 
 -	 
frsm_tsk,
ifrsm_tsk
パラメータ
tskidで指定されたタスクに発行されているサスペンド要求をすべて解除(サスペンド要求カウンタに0x0を設定)します。これにより,対象タスクはSUSPENDED状態からREADY状態へ,またはWAITING-SUSPENDED状態からWAITING状態へと遷移します。
以下に,本サービス・コールの記述例を示します。
 
 
| 
 #include        <kernel.h>              /*標準ヘッダ・ファイルの定義*/
 
 #include        <kernel_id.h>           /*システム情報ヘッダ・ファイルの定義*/
 
 
 
 void
 
 task ( VP_INT exinf )
 
 {
         ID      tskid = ID_TSK1;        /*変数の宣言,初期化*/
 
 
         ............
         ............
 
 
         frsm_tsk ( tskid );             /*SUSPENDED状態の強制解除*/
 
 
         ............
         ............
 }
 | 
 
 備考	 本サービス・コールでは,解除要求のキューイングが行われません。このため,対象タスクがSUSPENDED状態,またはWAITING-SUSPENDED状態以外の場合には,戻り値としてE_OBJを返します。
 
 時間経過待ち状態への移行は,以下に示したサービス・コールを処理プログラムから発行することにより実現されます。
 
 -	 
dly_tsk
自タスクをパラメータ
dlytimで指定された遅延時間が経過するまでの間,RUNNING状態からWAITING状態(時間経過待ち状態)へと遷移させます。
なお,時間経過待ち状態の解除は,以下の場合に行われ,時間経過待ち状態からREADY状態へと遷移します。
 
  
|  |  | 
| 
 パラメータdlytim で指定された遅延時間が経過した
 |  | 
|  |  | 
|  |  | 
 
 
| 
 #include        <kernel.h>              /*標準ヘッダ・ファイルの定義*/
 
 #include        <kernel_id.h>           /*システム情報ヘッダ・ファイルの定義*/
 
 
 
 void
 
 task ( VP_INT exinf )
 
 {
         ER      ercd;                   /*変数の宣言*/
         RELTIM  dlytim = 3600;          /*変数の宣言,初期化*/
 
 
         ............
         ............
 
 
         ercd = dly_tsk ( dlytim );      /*時間経過待ち状態への移行*/
 
 
         if ( ercd == E_OK ) {
                 ............            /*正常終了処理*/
                 ............
         } else if ( ercd == E_RLWAI ) {
                 ............            /*強制終了処理*/
                 ............
         }
 
 
         ............
         ............
 }
 | 
 
 4.9	 タイムアウト付き起床待ちと時間経過待ちの違い
 
 タイムアウト付き起床待ちと時間経過待ちには,以下にのような違いがあります。
 
 表4−1  タイムアウト付き起床待ちと時間経過待ちの違い
 
 
|  |  |  | 
|  |  |  | 
|  |  |  | 
|  |  | 
 起床要求をキューイング(時間経過待ちの解除は行われない)
 |