タスク ― tTask
¶
タスクはプログラムの並行実行の単位です。
課題
to be filled in
使用方法¶
タスクの生成¶
アプリケーション開発者は tTask
セルタイプのセルを生成することにより、タスクを生成することができます。次の例では MyTask
という名前のタスクセルを生成し、 MyCell
の eTaskBody
をメインルーチンとして結合しています。
celltype tMyCellType {
entry sTaskBody eTaskBody;
};
cell tMyCellType MyCell {};
cell tTask MyTask {
attribute = C_EXP("TA_ACT");
stackSize = 1024;
priority = 42;
cTaskBody = MyCell.eTaskBody;
};
void eTaskBody_main(CELLIDX idx)
{
CELLCB *p_cellcb = GET_CELLCB(idx);
// ...
}
リファレンス¶
セルタイプ¶
-
celltype
tTask
¶ タスクの生成、制御及び状態の取得を行うコンポーネントです。
本コンポーネントは
CRE_TSK
静的API [NGKI1023] によりタスクの生成を行います。静的APIの引数の値には、一部を除き属性値が用いられます。-
attr ID
id
= C_EXP("TSKID_$id$")¶ タスクのID番号の識別子 (詳しくは カーネルオブジェクトのID番号 を参照) を
C_EXP
で囲んで指定します (省略可能)。
-
attr ATR
attribute
= C_EXP("TA_NULL")¶ タスク属性 [NGKI3526] を
C_EXP
で囲んで指定します (省略可能)。複数個指定する場合、ビット毎の論理和演算子を用いてC_EXP("TA_ACT | TA_NOACTQUE")
のようにして指定します。-
TA_ACT
¶ タスクの生成時にタスクを起動します。
-
TA_NOACTQUE
¶ タスクに対する起動要求をキューイングしません。
-
TA_RSTR
¶ 生成するタスクを制約タスクとします。
-
-
attr PRI
priority
¶ タスクの起動時優先度を指定します。
-
attr size_t
stackSize
¶ スタック領域のサイズを指定します (バイト数)。
-
entry siNotificationHandler
eiActivateNotificationHandler
¶ タイムイベント通知 の通知方法として「タスクの起動による通知」を用いる場合に結合する受け口です。
-
entry siNotificationHandler
eiWakeUpNotificationHandler
¶ タイムイベント通知 の通知方法として「タスクの起床による通知」を用いる場合に結合する受け口です。
-
attr ID
シグニチャ¶
-
signature
sTask
¶ タスクの制御、及び状態の取得を行うためのシグニチャです。
-
ER
activate
(void)¶ タスクに対して起動要求を行います。
この関数は
act_tsk
サービスコール [NGKI3529] のラッパーです。- Return
正常終了 (
E_OK
) またはエラーコード。
-
ER_UINT
cancelActivate
(void)¶ タスクに対する処理されていない起動要求をすべてキャンセルし、キャンセルした起動要求の数を返します。
この関数は
can_act
サービスコール [NGKI1138] のラッパーです。- Return
キューイングされていた起動要求の数 (正の値または0) またはエラーコード。
-
ER
getTaskState
([out]STAT * p_tskstat)¶ タスクの状態を参照します。
この関数は
get_tst
サービスコール [NGKI3613] のラッパーです。- Param p_tskstat
タスク状態を入れるメモリ領域へのポインタ
- Return
正常終了 (
E_OK
) またはエラーコード。
-
ER
changePriority
([in]PRI priority)¶ タスクのベース優先度を、
priority
で指定した優先度に変更します。この関数は
chg_pri
サービスコール [NGKI1183] のラッパーです。- Param priority
ベース優先度。
- Return
正常終了 (
E_OK
) またはエラーコード。
-
ER
getPriority
([out]PRI * p_priority)¶ タスクの現在優先度を参照します。
この関数は
get_pri
サービスコール [NGKI1202] のラッパーです。- Param p_priority
現在優先度を入れるメモリ領域へのポインタ
- Return
正常終了 (
E_OK
) またはエラーコード。
-
ER
refer
([out]T_RTSK * pk_taskStatus)¶ タスクの現在状態を参照します。
この関数は
ref_tsk
サービスコール [NGKI1217] のラッパーです。- Param pk_taskStatus
タスクの現在状態を入れるメモリ領域へのポインタ
- Return
正常終了 (
E_OK
) またはエラーコード。
-
ER_UINT
cancelWakeup
(void)¶ タスクに対する処理されていない起床要求をすべてキャンセルし、キャンセルした起床要求の数を返します。
この関数は
can_wup
サービスコール [NGKI1276] のラッパーです。- Return
キューイングされていた起床要求の数 (正の値または0) またはエラーコード。
-
ER
releaseWait
(void)¶ タスクを強制的に待ち解除します。
この関数は
rel_wai
サービスコール [NGKI3532] のラッパーです。- Return
正常終了 (
E_OK
) またはエラーコード。
-
ER
suspend
(void)¶ タスクを強制待ちにします。
この関数は
sus_tsk
サービスコール [NGKI1298] のラッパーです。- Return
正常終了 (
E_OK
) またはエラーコード。
-
ER
resume
(void)¶ タスクを強制待ちから再開します。
この関数は
rsm_tsk
サービスコール [NGKI1312] のラッパーです。- Return
正常終了 (
E_OK
) またはエラーコード。
-
ER
実装の詳細¶
タスクの生成¶
tTask
によるタスクの生成は、以下に示しているようなファクトリ記述により静的 API 記述を生成することで実現されています。
factory {
write("tecsgen.cfg",
"CRE_TSK(%s, { %s, $cbp$, tTask_start, %s, %s, NULL });",
id, attribute, priority, stackSize);
};
最初の MyTask
を用いた例の場合、以下のような静的API記述が生成されます。
CRE_TSK(TSKID_tTask_MyTask, { TA_ACT, &tTask_CB_tab[0], tTask_start, 42, 1024, NULL });
tTask
が持つ属性は、 id
を除き実行時にはすべて未使用である為、[omit]
指定を行うことでこれらの属性値へのメモリ割り当てが行われないようにしています。
メインルーチン¶
上で示した静的 API 記述では、メインルーチンとして tTask_start
という名前の関数が指定されています。この関数では以下に示すコードにより TECS への橋渡しを行います。
void
tTask_start(intptr_t exinf)
{
CELLCB *p_cellcb = (CELLCB *) exinf;
cTaskBody_main();
}