/* * 5-2 周期ハンドラによるLED点滅 * * OS: T-Kernel * */ #include /* T-Kernel ヘッダ */ #include /* ハードウェア定義 */ #include /* タスクトレーサ */ /* オブジェクト 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); /* 周期ハンドラAを削除する */ e2: return er; }