/* RTP_sp_4-5 */ /* * 4-5 ディスパッチ禁止 * * OS: T-Kernel * */ #include /* T-Kernel ヘッダ */ #include /* タスクトレーサ */ /* オブジェクト ID 番号 */ LOCAL ID tidA; /* タスク A の ID */ LOCAL ID tidB; /* タスク B の ID */ LOCAL ID tidC; /* タスク C の ID */ /* タスク A */ LOCAL void taskA(INT stacd, void *exinf) { /* スリープ(起床待ち)する */ tk_slp_tsk(TMO_FEVR); /* スリープ(起床待ち)する */ tk_slp_tsk(TMO_FEVR); /* 自タスクを終了・削除する */ tk_exd_tsk(); } /* タスク B */ LOCAL void taskB(INT stacd, void *exinf) { /* ディスパッチを禁止する */ tk_dis_dsp(); /* タスク A を起床する */ tk_wup_tsk(tidA); /* タスク A を起床する */ tk_wup_tsk(tidA); /* ディスパッチを許可する */ tk_ena_dsp(); /* 自タスクを終了・削除する */ tk_exd_tsk(); } /* タスク C */ LOCAL void taskC(INT stacd, void *exinf) { /* タスク A を起動する */ tk_sta_tsk(tidA, 0); /* タスク B を起動する */ tk_sta_tsk(tidB, 0); /* 自タスクを終了・削除する */ tk_exd_tsk(); } /* 初期化処理 */ EXPORT INT usermain(void) { ER er; T_CTSK ct; /* タスク 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 e3; } /* タスク生成失敗時 */ /* タスク B を生成する */ ct.exinf = (void*)('t' | 's' << 8 | 'k' << 16 | 'B' << 24); /* 拡張情報 */ ct.tskatr = TA_HLNG | TA_RNG0; /* タスク属性 */ ct.task = taskB; /* タスク起動アドレス */ ct.itskpri = 2; /* タスク起動時優先度 */ ct.stksz = 1024; /* スタックサイズ */ tidB = tk_cre_tsk(&ct); /* タスク B を生成 */ if (tidB < E_OK) { er = tidB; goto e2; } /* タスク生成失敗時 */ /* タスク C を生成する */ ct.exinf = (void*)('t' | 's' << 8 | 'k' << 16 | 'C' << 24); /* 拡張情報 */ ct.tskatr = TA_HLNG | TA_RNG0; /* タスク属性 */ ct.task = taskC; /* タスク起動アドレス */ ct.itskpri = 3; /* タスク起動時優先度 */ ct.stksz = 1024; /* スタックサイズ */ tidC = tk_cre_tsk(&ct); /* タスク C を生成 */ if (tidC < E_OK) { er = tidC; goto e1; } /* タスク生成失敗時 */ tk_sta_tsk(tidC, 0); /* タスク C を起動 */ return E_OK; e1: tk_del_tsk(tidB); /* タスクBを削除する */ e2: tk_del_tsk(tidA); /* タスクAを削除する */ e3: return er; }