/* * イベントフラグによる同期 * * OS: T-Kernel * */ #include /* T-Kernel ヘッダ */ #include /* tm_printf() など */ #include /* ハードウェア定義 */ /* オブジェクト ID 番号 */ LOCAL ID tidA; /* タスク A の ID */ LOCAL ID flgid; /* イベントフラグの ID */ /* 割込みハンドラ A */ LOCAL void inthdrA(UINT intno) { /* イベントフラグflgidのビット0をセットする */ /* ヒント:nビット目が1のデータの作り方 1 << n */ /*??*/; /* 割込みをクリアする */ CLKCTRL_CGICRCG = intno; ClearInt(intno); } /* タスク A */ LOCAL void taskA(INT stacd, void *exinf) { UINT ptn; /* SW3 (PA3) から入力するように設定する */ PIO_CR(A) &= ~(1 << 3); PIO_IE(A) |= (1 << 3); /* SW3 (INT3) の割込みのモード設定を行う : 立ち下がりエッジ(1→0) */ CLKCTRL_CGIMCGA = (CLKCTRL_CGIMCGA & ~(7 << (8 * 3 + 4))) | (2 << (8 * 3 + 4)); /* SW3 (INT3) の割込みを許可する */ CLKCTRL_CGIMCGA |= (1 << (8 * 3)); ClearInt(3); EnableInt(3, INTPRI_GROUP(5, 0)); for (;;) { /* イベントフラグのビット0がセットされるまで待つ */ tk_wai_flg(flgid, 1 << 0, TWF_ANDW | TWF_CLR, &ptn, TMO_FEVR); /* メッセージを表示する */ tm_printf((UB*)"SW3: 1->0\n"); } /* このタスクは終了しない */ } /* 初期化処理 */ EXPORT INT usermain(void) { ER er; T_CFLG cf; T_DINT di; T_CTSK ct; /* イベントフラグを生成する */ cf.exinf = 0; /* 拡張情報 */ cf.flgatr = TA_TFIFO | TA_WSGL; /* イベントフラグ属性 */ cf.iflgptn = 0; /* イベントフラグの初期値 */ flgid = /*??*/; /* システムコール呼出し */ if (flgid < E_OK) { er = flgid; goto e3; } /* 割込みハンドラ A を定義する */ di.intatr = TA_HLNG; /* 割込みハンドラ属性 */ di.inthdr = inthdrA; /* 割込みハンドラアドレス */ er = /*??*/; /* 割込みハンドラ A を定義, 割込み番号は3 */ if (er < E_OK) 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 = /*??*/; /* タスク A を生成 */ if (tidA < E_OK) { er = tidA; goto e1; } /* タスク生成失敗時 */ /*??*/; /* タスク A を起動 */ return E_OK; e1: /*??*/; /* 割込みハンドラ定義を削除,割込み番号は3 */ /* ヒント:割込みハンドラ定義をNULLにする */ e2: /*??*/; /* イベントフラグflgidを削除 */ e3: return er; }