タスク ― tTask

タスクはプログラムの並行実行の単位です。

課題

to be filled in

使用方法

タスクの生成

アプリケーション開発者は tTask セルタイプのセルを生成することにより、タスクを生成することができます。次の例では MyTask という名前のタスクセルを生成し、 MyCelleTaskBody をメインルーチンとして結合しています。

app.cdl
celltype tMyCellType {
    entry sTaskBody eTaskBody;
};

cell tMyCellType MyCell {};

cell tTask MyTask {
    attribute = C_EXP("TA_ACT");
    stackSize = 1024;
    priority = 42;

    cTaskBody = MyCell.eTaskBody;
};
tMyCellType.c
void eTaskBody_main(CELLIDX idx)
{
    CELLCB  *p_cellcb = GET_CELLCB(idx);
    // ...
}

タスクの制御

tTask が提供する eTask という名前の受け口を利用することにより、タスクの制御及び状態の取得を行うことができます。

app.cdl
cell tTask MyTask {};

celltype tMyAnotherCellType {
    call sTask cTask;
};

cell tMyAnotherCellType MyAnotherCell {
    cTask = MyTask.eTask;
};
tMyAnotherCellType.c
// タスクの起動
cTask_activate();

// タスクの現在状態の参照
T_RTSK taskStatus;
cTask_refer(&taskStatus);

なお、非タスクコンテキスト内では、eTask の代わりに eiTask を使用する必要があります。

リファレンス

セルタイプ

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

生成するタスクを制約タスクとします。

注意

ASP3 カーネルでは、制約タスクはサポートしません [ASPS0102]。 ただし、制約タスク拡張パッケージを用いることで、制約タスクの機能を追加することができます [NGKI1022]。

attr PRI priority

タスクの起動時優先度を指定します。

attr size_t stackSize

スタック領域のサイズを指定します (バイト数)。

entry sTask  eTask

タスクの制御及び状態の取得を行うための受け口です。

entry siTask  eiTask

タスクの制御を行うための受け口です (非タスクコンテキスト用)。

call sTaskBody  cTaskBody

タスクの本体として呼び出される受け口をこの呼び口に結合します。

entry siNotificationHandler  eiActivateNotificationHandler

タイムイベント通知 の通知方法として「タスクの起動による通知」を用いる場合に結合する受け口です。

entry siNotificationHandler  eiWakeUpNotificationHandler

タイムイベント通知 の通知方法として「タスクの起床による通知」を用いる場合に結合する受け口です。

シグニチャ

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 wakeup(void)

タスクを起床します。

この関数は wup_tsk サービスコール [NGKI3531] のラッパーです。

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 raiseTerminate(void)

タスクに終了要求を行います。

この関数は ras_ter サービスコール [NGKI3469] のラッパーです。

Return:正常終了 (E_OK) またはエラーコード。
ER terminate(void)

タスクを終了させます。

この関数は ter_tsk サービスコール [NGKI1170] のラッパーです。

Return:正常終了 (E_OK) またはエラーコード。
signature siTask

タスクの制御を行うためのシグニチャです (非タスクコンテキスト用)。

ER activate(void)

タスクに対して起動要求を行います。

この関数は iact_tsk サービスコール [NGKI3529][NGKI0562] のラッパーです。

Return:正常終了 (E_OK) またはエラーコード。
ER wakeup(void)

タスクを起床します。

この関数は iwup_tsk サービスコール [NGKI3531][NGKI0562] のラッパーです。

Return:正常終了 (E_OK) またはエラーコード。
ER releaseWait(void)

タスクを強制的に待ち解除します。

この関数は irel_wai サービスコール [NGKI3532][NGKI0562] のラッパーです。

Return:正常終了 (E_OK) またはエラーコード。
signature sTaskBody

タスクのメインルーチンとして呼び出される受け口に使用するシグニチャです。

void main(void)

タスクのメインルーチンとして呼び出されます。

実装の詳細

タスクの生成

tTask によるタスクの生成は、以下に示しているようなファクトリ記述により静的 API 記述を生成することで実現されています。

kernel.cdl (抜粋)
factory {
    write("tecsgen.cfg",
      "CRE_TSK(%s, { %s, $cbp$, tTask_start, %s, %s, NULL });",
                id, attribute, priority, stackSize);
};

最初の MyTask を用いた例の場合、以下のような静的API記述が生成されます。

tecsgen.cfg
CRE_TSK(TSKID_tTask_MyTask, { TA_ACT, &tTask_CB_tab[0], tTask_start, 42, 1024, NULL });

tTask が持つ属性は、 id を除き実行時にはすべて未使用である為、[omit] 指定を行うことでこれらの属性値へのメモリ割り当てが行われないようにしています。

メインルーチン

上で示した静的 API 記述では、メインルーチンとして tTask_start という名前の関数が指定されています。この関数では以下に示すコードにより TECS への橋渡しを行います。

tTask.c
void
tTask_start(intptr_t exinf)
{
    CELLCB  *p_cellcb = (CELLCB *) exinf;

    cTaskBody_main();
}

サービスコール

eTask 及び eiTask に対する呼出しは、以下に示すような受け口関数により TOPPERS/ASP3 カーネルのサービスコールへの呼出しに変換されます。

tTask_inline.h
Inline ER
eTask_activate(CELLIDX idx)
{
    CELLCB  *p_cellcb = GET_CELLCB(idx);
    return(act_tsk(ATTR_id));
}