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