第4章  タスク付属同期機能


本章では,RI78V4が提供しているタスク付属同期機能について解説しています。

4.1 概  要

RI78V4におけるタスク付属同期機能では,タスクに従属した同期機能を提供しています。

4.2 起床待ち状態への移行

起床待ち状態への移行(永久待ち,タイムアウト付き)は,以下に示したサービス・コールを処理プログラムから発行することにより実現されます。

- slp_tsk
自タスクをRUNNING状態からWAITING状態(起床待ち状態)へと遷移させます。
これにより,自タスクは,レディ・キューから外れ,RI78V4のスケジューリング対象から除外されます。
ただし,本サービス・コールを発行した際,自タスクに起床要求がキューイングされていた(起床要求カウンタが0x0以外であった)場合には,状態操作処理は実行されず,起床要求カウンタの減算処理(起床要求カウンタから0x1を減算)が実行されます。
なお,起床待ち状態の解除は,以下の場合に行われ,起床待ち状態からREADY状態へと遷移します。




 
起床待ち状態の解除操作

エラー・コード

wup_tskの発行により,起床要求が発行された

E_OK

iwup_tskの発行により,起床要求が発行された

E_OK

rel_waiの発行により,起床待ち状態を強制的に解除された

E_RLWAI

irel_waiの発行により,起床待ち状態を強制的に解除された

E_RLWAI



以下に,本サービス・コールの記述例を示します。

 #include        <kernel.h>              /*標準ヘッダ・ファイルの定義*/
 #include        <kernel_id.h>           /*システム情報ヘッダ・ファイルの定義*/
 
 void
 func_task ( VP_INT exinf )
 {
         ER      ercd;                   /*変数の宣言*/
 
         ............
         ............
 
         ercd = slp_tsk ( );             /*起床待ち状態への移行(永久待ち)*/
 
         if ( ercd == E_OK ) {
                 ............            /*正常終了処理*/
                 ............
         } else if ( ercd == E_RLWAI ) {
                 ............            /*強制終了処理*/
                 ............
         }
 
         ............
         ............
 }
 

- tslp_tsk
自タスクをRUNNING状態からWAITING状態(起床待ち状態)へと遷移させます。
これにより,自タスクは,レディ・キューから外れ,RI78V4のスケジューリング対象から除外されます。
ただし,本サービス・コールを発行した際,自タスクに起床要求がキューイングされていた(起床要求カウンタが0x0以外であった)場合には,状態操作処理は実行されず,起床要求カウンタの減算処理(起床要求カウンタから0x1を減算)が実行されます。
なお,起床待ち状態の解除は,以下の場合に行われ,起床待ち状態からREADY状態へと遷移します。




 
起床待ち状態の解除操作

エラー・コード

wup_tskの発行により,起床要求が発行された

E_OK

iwup_tskの発行により,起床要求が発行された

E_OK

rel_waiの発行により,起床待ち状態を強制的に解除された

E_RLWAI

irel_waiの発行により,起床待ち状態を強制的に解除された

E_RLWAI

パラメータtmoutで指定された待ち時間が経過した

E_TMOUT



以下に,本サービス・コールの記述例を示します。

 #include        <kernel.h>              /*標準ヘッダ・ファイルの定義*/
 #include        <kernel_id.h>           /*システム情報ヘッダ・ファイルの定義*/
 
 void
 func_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と同等の処理”を実行します。

4.3 タスクの起床

タスクの起床は,以下に示したサービス・コールを処理プログラムから発行することにより実現されます。

- wup_tskiwup_tsk
パラメータtskidで指定されたタスクのWAITING状態(起床待ち状態)を解除します。
これにより,対象タスクは,起床待ち状態からREADY状態へ,またはWAITING-SUSPENDED状態からSUSPENDED状態へと遷移します。
ただし,本サービス・コールを発行した際,対象タスクが起床待ち状態以外であった場合には,状態操作処理は実行されず,起床要求カウンタの加算処理(起床要求カウンタに0x1を加算)が実行されます。
以下に,本サービス・コールの記述例を示します。




 #include        <kernel.h>              /*標準ヘッダ・ファイルの定義*/
 #include        <kernel_id.h>           /*システム情報ヘッダ・ファイルの定義*/
 
 void
 func_task ( VP_INT exinf )
 {
         ID      tskid = ID_tskA;        /*変数の宣言,初期化*/
 
         ............
         ............
 
         wup_tsk ( tskid );              /*タスクの起床*/
 
         ............
         ............
 }
 

備考1 本サービス・コールを発行した際,対象タスクがREADY状態へと遷移する場合は,該当タスクの優先度に対応したレディ・キューの最後尾にキューイングし直す処理もあわせて実行されます。

備考2 RI78V4が管理している起床要求カウンタは,7ビット幅で構成されています。このため,本サービス・コールの発行により,起床要求数が最大カウント値127を越える場合には,カウンタ操作処理は実行されず,戻り値として“E_QOVR”が返されます。

4.4 起床要求の解除

起床要求の解除は,以下に示したサービス・コールを処理プログラムから発行することにより実現されます。

- can_wupican_wup
パラメータtskidで指定されたタスクにキューイングされている起床要求をすべて解除(起床要求カウンタに0x0を設定)します。
なお,本サービス・コールが正常終了した際には,戻り値として“解除した起床要求数”が返されます。
以下に,本サービス・コールの記述例を示します。



 #include        <kernel.h>              /*標準ヘッダ・ファイルの定義*/
 #include        <kernel_id.h>           /*システム情報ヘッダ・ファイルの定義*/
 
 void
 func_task ( VP_INT exinf )
 {
         ER_UINT ercd;                   /*変数の宣言*/
         ID      tskid = ID_tskA;        /*変数の宣言,初期化*/
 
         ............
         ............
 
         ercd = can_wup ( tskid );       /*起床要求の解除*/
 
         if ( ercd >= 0x0 ) {
                 ............            /*正常終了処理*/
                 ............
         }
 
         ............
         ............
 }
 

4.5 WAITING状態の強制解除

WAITING状態の強制解除は,以下に示したサービス・コールを処理プログラムから発行することにより実現されます。

- rel_waiirel_wai
パラメータtskidで指定されたタスクのWAITING状態を強制的に解除します。
これにより,対象タスクは待ちキューから外れ,WAITING状態からREADY状態へ,またはWAITING-SUSPENDED状態からSUSPENDED状態へと遷移します。
なお,本サービス・コールの発行によりWAITING状態を解除されたタスクには,WAITING状態へと遷移するきっかけとなったサービス・コール(slp_tskwai_semなど)の戻り値として“E_RLWAI”が返されます。
以下に,本サービス・コールの記述例を示します。




 #include        <kernel.h>              /*標準ヘッダ・ファイルの定義*/
 #include        <kernel_id.h>           /*システム情報ヘッダ・ファイルの定義*/
 
 void
 func_task ( VP_INT exinf )
 {
         ID      tskid = ID_tskA;        /*変数の宣言,初期化*/
 
         ............
         ............
 
         rel_wai ( tskid );              /*WAITING状態の強制解除*/
 
         ............
         ............
 }
 

備考1 本サービス・コールを発行した際,対象タスクがREADY状態へと遷移する場合は,該当タスクの優先度に対応したレディ・キューの最後尾にキューイングし直す処理もあわせて実行されます。

備考2 本サービス・コールでは,強制解除要求のキューイングが行われません。このため,対象タスクがWAITING状態,またはWAITING-SUSPENDED状態以外の場合には,戻り値として“E_OBJ”が返されます。

4.6 SUSPENDED状態への移行

SUSPENDED状態への移行は,以下に示したサービス・コールを処理プログラムから発行することにより実現されます。

- sus_tskisus_tsk
パラメータtskidで指定されたタスクのサスペンド要求カウンタに0x1を加算したのち,対象タスクをRUNNING状態からSUSPENDED状態へ,READY状態からSUSPENDED状態へ,またはWAITING状態からWAITING-SUSPENDED状態へと遷移させます。
ただし,本サービス・コールを発行した際,対象タスクがSUSPENDED状態,またはWAITING-SUSPENDED状態へと遷移していた場合には,状態操作処理は実行されず,サスペンド要求カウンタの加算処理のみが実行されます。
なお,SUSPENDED状態の解除は,以下の場合に行われ,SUSPENDED状態からREADY状態へと遷移します。



 
SUSPENDED状態の解除操作

エラー・コード

rsm_tskの発行により,解除要求が発行された

E_OK

irsm_tskの発行により,解除要求が発行された

E_OK

frsm_tskの発行により,SUSPENDED状態を強制的に解除された

E_OK

ifrsm_tskの発行により,SUSPENDED状態を強制的に解除された

E_OK



以下に,本サービス・コールの記述例を示します。

 #include        <kernel.h>              /*標準ヘッダ・ファイルの定義*/
 #include        <kernel_id.h>           /*システム情報ヘッダ・ファイルの定義*/
 
 void
 func_task ( VP_INT exinf )
 {
         ID      tskid = ID_tskA;        /*変数の宣言,初期化*/
 
         ............
         ............
 
         sus_tsk ( tskid );              /*SUSPENDED状態への移行*/
 
         ............
         ............
 }
 

備考1 本サービス・コールを発行した際,対象タスクが自タスクの場合は,レディ・キューから外れ,RI78V4のスケジューリング対象から除外されます。

備考2 RI78V4が管理するサスペンド要求カウンタは,7ビット幅で構成されています。このため,本サービス・コールの発行により,サスペンド要求数が最大カウント値127を越える場合には,カウンタ操作処理は実行されず,戻り値として“E_QOVR”が返されます。

4.7 SUSPENDED状態の解除

SUSPENDED状態の解除は,以下に示したサービス・コールを処理プログラムから発行することにより実現されます。

- rsm_tskirsm_tsk
パラメータtskidで指定されたタスクのサスペンド要求カウンタから0x1を減算したのち,対象タスクのSUSPENDED状態を解除します。
これにより,対象タスクは,SUSPENDED状態からREADY状態へ,またはWAITING-SUSPENDED状態からWAITING状態へと遷移します。
ただし,本サービス・コールを発行した際,サスペンド要求がキューイングされていた(減算結果が0x0以外)場合には,状態操作処理は実行されず,サスペンド要求カウンタの減算処理のみが実行されます。
以下に,本サービス・コールの記述例を示します。




 #include        <kernel.h>              /*標準ヘッダ・ファイルの定義*/
 #include        <kernel_id.h>           /*システム情報ヘッダ・ファイルの定義*/
 
 void
 func_task ( VP_INT exinf )
 {
         ID      tskid = ID_tskA;        /*変数の宣言,初期化*/
 
         ............
         ............
 
         rsm_tsk ( tskid );              /*SUSPENDED状態の解除*/
 
         ............
         ............
 }
 

備考1 本サービス・コールを発行した際,対象タスクがREADY状態へと遷移する場合は,該当タスクの優先度に対応したレディ・キューの最後尾にキューイングし直す処理もあわせて実行されます。

備考2 本サービス・コールでは,解除要求のキューイングが行われません。このため,対象タスクがSUSPENDED状態,またはWAITING-SUSPENDED状態以外の場合には,戻り値として“E_OBJ”が返されます。

- frsm_tskifrsm_tsk
パラメータtskidで指定されたタスクのサスペンド要求カウンタに0x0を設定し,対象タスクのSUSPENDED状態を強制的に解除します。
これにより,対象タスクは,SUSPENDED状態からREADY状態へ,またはWAITING-SUSPENDED状態からWAITING状態へと遷移します。
以下に,本サービス・コールの記述例を示します。



 #include        <kernel.h>              /*標準ヘッダ・ファイルの定義*/
 #include        <kernel_id.h>           /*システム情報ヘッダ・ファイルの定義*/
 
 void
 func_task ( VP_INT exinf )
 {
         ID      tskid = ID_tskA;        /*変数の宣言,初期化*/
 
         ............
         ............
 
         frsm_tsk ( tskid );             /*SUSPENDED状態の強制解除*/
 
         ............
         ............
 }
 

備考1 本サービス・コールを発行した際,対象タスクがREADY状態へと遷移する場合は,該当タスクの優先度に対応したレディ・キューの最後尾にキューイングし直す処理もあわせて実行されます。

備考2 本サービス・コールでは,強制解除要求のキューイングが行われません。このため,対象タスクがSUSPENDED状態,またはWAITING-SUSPENDED状態以外の場合には,戻り値として“E_OBJ”が返されます。

4.8 時間経過待ち状態への移行

時間経過待ち状態への移行は,以下に示したサービス・コールを処理プログラムから発行することにより実現されます。

- dly_tsk
自タスクをRUNNING状態からWAITING状態(時間経過待ち状態)へと遷移させます。
これにより,自タスクは,レディ・キューから外れ,RI78V4のスケジューリング対象から除外されます。
なお,時間経過待ち状態の解除は,以下の場合に行われ,時間経過待ち状態からREADY状態へと遷移します。



 
時間経過待ち状態の解除操作

エラー・コード

パラメータdlytimで指定された遅延時間が経過した

E_OK

rel_waiの発行により,時間経過待ち状態を強制的に解除された

E_RLWAI

irel_waiの発行により,時間経過待ち状態を強制的に解除された

E_RLWAI



以下に,本サービス・コールの記述例を示します。

 #include        <kernel.h>              /*標準ヘッダ・ファイルの定義*/
 #include        <kernel_id.h>           /*システム情報ヘッダ・ファイルの定義*/
 
 void
 func_task ( VP_INT exinf )
 {
         ER      ercd;                   /*変数の宣言*/
         RELTIM  dlytim = 3600;          /*変数の宣言,初期化*/
 
         ............
         ............
 
         ercd = dly_tsk ( dlytim );      /*時間経過待ち状態への移行*/
 
         if ( ercd == E_OK ) {
                 ............            /*正常終了処理*/
                 ............
         } else if ( ercd == E_RLWAI ) {
                 ............            /*強制終了処理*/
                 ............
         }
 
         ............
         ............
 }