﻿/* RTP_sp_5-2 */
/*
 *  周期ハンドラによるLED点滅
 *
 *  OS: T-Kernel
 *
 */

#include <tk/tkernel.h> /* T-Kernel ヘッダ */
#include <tk/sysdef.h>  /* ハードウェア定義 */
#include <trace/trace.h> /* タスクトレーサ */

/* オブジェクト ID 番号 */
LOCAL ID cycA; /* 周期ハンドラ A の ID */
LOCAL ID tidA; /* タスク A の ID */

/* 周期ハンドラ A */
LOCAL void cychdrA(void *exinf)
{
    tk_wup_tsk(tidA); /* タスク A を起床する */
}

/* タスク A */
LOCAL void taskA(INT stacd, void *exinf)
{
    /* LED3 に出力するように設定する */
    PIO_IE(F) &= ~(1 << 3);
    PIO_CR(F) |= (1 << 3);

    tk_sta_cyc(cycA); /* 周期ハンドラ A を動作開始する */

    for (;;) {
        /* LED3 点灯 */
        PIO_DATA(F) &= ~(1 << 3);

        /* 周期ハンドラ A から起床されるまで待つ */
        tk_slp_tsk(TMO_FEVR);

        /* LED3 消灯 */
        PIO_DATA(F) |= (1 << 3);

        /* 周期ハンドラ A から起床されるまで待つ */
        tk_slp_tsk(TMO_FEVR);
    }

    /* このタスクは終了しない */
}

/* 初期化処理 */
EXPORT INT usermain(void)
{
    ER     er;
    T_CCYC cc;
    T_CTSK ct;

    /* 周期ハンドラ A を生成する */
    cc.exinf = (void*)('c' | 'y' << 8 | 'c' << 16 | 'A' << 24); /* 拡張情報 */
    cc.cycatr = TA_HLNG;            /* 周期ハンドラ属性 */
    cc.cychdr = cychdrA;            /* 周期ハンドラアドレス */
    cc.cyctim = 100;                /* 周期起動時間間隔 */
    cycA = tk_cre_cyc(&cc);         /* 周期ハンドラ A を生成 */
    if (cycA < E_OK) { er = cycA; goto e2; } /* 周期ハンドラ生成失敗時 */

    /* タスク A を生成する */
    ct.exinf = (void*)('t' | 's' << 8 | 'k' << 16 | 'A' << 24); /* 拡張情報 */
    ct.tskatr = TA_HLNG | TA_RNG0;  /* タスク属性 */
    ct.task = taskA;                /* タスク起動アドレス */
    ct.itskpri = 1;                 /* タスク起動時優先度 */
    ct.stksz = 1024;                /* スタックサイズ */
    tidA = tk_cre_tsk(&ct);         /* タスク A を生成 */
    if (tidA < E_OK) { er = tidA; goto e1; } /* タスク生成失敗時 */

    tk_sta_tsk(tidA, 0);            /* タスク A を起動 */

    return E_OK;

e1: tk_del_cyc(cycA);
e2: return er;
}
