void alarm1_handler(intptr_t exinf) { ER_UINT ercd; check_point(4); ercd = wup_tsk(TASK3); check_ercd(ercd, E_NOSPT); ercd = rel_wai(TASK3); check_ercd(ercd, E_NOSPT); ercd = wup_tsk(TASK1); check_ercd(ercd, E_OK); ercd = act_tsk(TASK3); check_ercd(ercd, E_OK); ercd = act_tsk(TASK4); check_ercd(ercd, E_OK); ercd = rot_rdq(MID_PRIORITY); check_ercd(ercd, E_OK); ercd = rot_rdq(MID_PRIORITY); check_ercd(ercd, E_NOSPT); return; check_point(0); }
void task2(intptr_t exinf) { ER_UINT ercd; switch (++task2_count) { case 1: check_point(2); ercd = slp_tsk(); check_ercd(ercd, E_NOSPT); ercd = tslp_tsk(TEST_TIME_PROC); check_ercd(ercd, E_NOSPT); ercd = dly_tsk(TEST_TIME_PROC); check_ercd(ercd, E_NOSPT); ercd = wai_sem(SEM1); check_ercd(ercd, E_NOSPT); ercd = pol_sem(SEM1); check_ercd(ercd, E_OK); ercd = pol_sem(SEM1); check_ercd(ercd, E_TMOUT); ercd = twai_sem(SEM1, TEST_TIME_PROC); check_ercd(ercd, E_NOSPT); ercd = ext_tsk(); check_ercd(ercd, E_OK); check_point(0); case 2: check_point(6); ercd = rot_rdq(MID_PRIORITY); check_ercd(ercd, E_NOSPT); ercd = ext_tsk(); check_ercd(ercd, E_OK); check_point(0); case 3: check_point(10); ercd = rot_rdq(MID_PRIORITY); check_ercd(ercd, E_OK); ercd = ext_tsk(); check_ercd(ercd, E_OK); check_point(0); default: check_point(0); } check_point(0); }
void task2(intptr_t exinf) { ER_UINT ercd; switch (++task2_count) { case 1: check_point(2); ercd = slp_tsk(); check_ercd(ercd, E_NOSPT); check_point(3); ercd = tslp_tsk(10); check_ercd(ercd, E_NOSPT); check_point(4); ercd = dly_tsk(10); check_ercd(ercd, E_NOSPT); check_point(5); ercd = ext_tsk(); check_ercd(ercd, E_OK); check_point(0); case 2: check_point(23); ercd = rot_rdq(MID_PRIORITY); check_ercd(ercd, E_NOSPT); check_point(24); ercd = ext_tsk(); check_ercd(ercd, E_OK); check_point(0); case 3: check_point(30); ercd = rot_rdq(MID_PRIORITY); check_ercd(ercd, E_OK); check_point(31); ercd = ext_tsk(); check_ercd(ercd, E_OK); check_point(0); default: check_point(0); } check_point(0); }
ER_UINT extsvc_routine(intptr_t par1, intptr_t par2, intptr_t par3, intptr_t par4, intptr_t par5, ID cdmid) { ER ercd; switch ((uint_t) par1) { case 1: ercd = loc_cpu(); break; case 2: ercd = unl_cpu(); break; case 3: ercd = dis_dsp(); break; case 4: ercd = ena_dsp(); break; case 5: ercd = chg_ipm((PRI) par2); break; case 6: ercd = rot_rdq((PRI) par2); break; default: ercd = E_NOSPT; break; } return(ercd); }
void task2(intptr_t exinf) { ER_UINT ercd; check_point(22); check_state(false, false, TIPM_ENAALL, false, false, true); check_point(23); ercd = ena_tex(); check_ercd(ercd, E_OK); check_state(false, false, TIPM_ENAALL, false, false, false); ercd = rot_rdq(TPRI_SELF); check_ercd(ercd, E_OK); check_point(30); ercd = ras_tex(TSK_SELF, 0x0002); check_ercd(ercd, E_OK); check_point(34); ercd = ena_dsp(); check_ercd(ercd, E_OK); check_finish(36); check_point(0); }
void tex_task2(TEXPTN texptn, intptr_t exinf) { ER ercd; switch (texptn) { case 0x0001: check_point(29); check_state(false, false, TIPM_ENAALL, false, false, true); break; case 0x0002: check_point(31); check_state(false, false, TIPM_ENAALL, false, false, true); /* * disable dispatch, raise dispatch request */ check_point(32); ercd = dis_dsp(); check_ercd(ercd, E_OK); ercd = rot_rdq(TPRI_SELF); check_ercd(ercd, E_OK); /* * task dispatch happens when task exception routine returns */ check_point(33); break; default: check_point(0); break; } }
void task2(intptr_t exinf) { ER_UINT ercd; PRI tskpri; check_point(14); ercd = slp_tsk(); check_ercd(ercd, E_OK); check_point(24); ercd = slp_tsk(); check_ercd(ercd, E_OK); check_point(50); ercd = loc_mtx(MTX2); check_ercd(ercd, E_OK); check_point(56); ercd = wup_tsk(TASK1); check_ercd(ercd, E_OK); check_point(57); ercd = loc_mtx(MTX1); check_ercd(ercd, E_OK); check_point(60); ercd = unl_mtx(MTX1); check_ercd(ercd, E_OK); check_point(61); ercd = unl_mtx(MTX2); check_ercd(ercd, E_OK); check_point(62); ercd = loc_mtx(MTX1); check_ercd(ercd, E_OK); check_point(63); ercd = rot_rdq(MID_PRIORITY); check_ercd(ercd, E_OK); check_point(66); ercd = unl_mtx(MTX1); check_ercd(ercd, E_OK); ercd = get_pri(TASK1, &tskpri); check_ercd(ercd, E_OK); check_assert(tskpri == MID_PRIORITY); check_point(67); ercd = ext_tsk(); check_point(0); }
void task2(intptr_t exinf) { ID tskid; ER_UINT ercd; uint_t load; check_point(7); ercd = get_lod(TPRI_SELF, &load); check_ercd(ercd, E_OK); check_assert(load == 3U); ercd = get_nth(TPRI_SELF, 0U, &tskid); check_ercd(ercd, E_OK); check_assert(tskid == TASK2); check_point(8); ercd = slp_tsk(); check_ercd(ercd, E_OK); check_point(17); ercd = get_lod(TPRI_SELF, &load); check_ercd(ercd, E_OK); check_assert(load == 1U); check_point(18); ercd = chg_pri(TASK5, MID_PRIORITY); check_ercd(ercd, E_OK); ercd = get_lod(TPRI_SELF, &load); check_ercd(ercd, E_OK); check_assert(load == 2U); ercd = rot_rdq(TPRI_SELF); check_ercd(ercd, E_OK); check_point(0); }
void run() { for (;;) { try { // 意図的にデッドロックを発生させる。 left_->take(); syslog(LOG_NOTICE, "#%d take left fork(%d)", tskid_, left_->id()); dly_tsk(100 * (rnd() % 5 + 1)); right_->take(); syslog(LOG_NOTICE, "#%d take right fork(%d)", tskid_, right_->id()); eat(); left_->give(); syslog(LOG_NOTICE, "#%d give left fork(%d)", tskid_, left_->id()); right_->give(); syslog(LOG_NOTICE, "#%d give right fork(%d)", tskid_, right_->id()); think(); } catch (timeout_error&) { // タイムアウトによりデッドロックを検出すると、フォークを放す。 syslog(LOG_NOTICE, "#%d !!!! timeout error !!!!", tskid_); if (left_->is_used()) { left_->give(); syslog(LOG_NOTICE, "#%d give left fork(%d)", tskid_, left_->id()); } if (right_->is_used()) { right_->give(); syslog(LOG_NOTICE, "#%d give right fork(%d)", tskid_, right_->id()); } rot_rdq(TPRI_SELF); } } }
void tex_task2(TEXPTN texptn, intptr_t exinf) { ER_UINT ercd; switch (++tex_task2_count) { case 1: check_point(29); check_assert(texptn == 0x0001); check_state(false, false, TIPM_ENAALL, false, false, true); return; check_point(0); case 2: check_point(31); check_assert(texptn == 0x0002); check_state(false, false, TIPM_ENAALL, false, false, true); check_point(32); ercd = dis_dsp(); check_ercd(ercd, E_OK); ercd = rot_rdq(TPRI_SELF); check_ercd(ercd, E_OK); check_point(33); return; check_point(0); default: check_point(0); } check_point(0); }
void task2(intptr_t exinf) { ER ercd; /* * 初期状態のチェック */ check_point(21); check_state(false, false, TIPM_ENAALL, false, false, true); /* * タスク例外処理の許可 */ check_point(22); ercd = ena_tex(); check_ercd(ercd, E_OK); check_state(false, false, TIPM_ENAALL, false, false, false); /* * タスク3に切り換える */ ercd = rot_rdq(TPRI_SELF); /* ここで他のタスクが動作する */ check_ercd(ercd, E_OK); /* * タスク例外処理を要求 */ check_point(29); ercd = ras_tex(TSK_SELF, 0x0002); /* ここでタスク例外処理ルーチンが動作する */ check_ercd(ercd, E_OK); /* * テスト終了 */ check_finish(34); }
void task2(intptr_t exinf) { ER ercd; /* * check init state */ check_point(22); check_state(false, false, TIPM_ENAALL, false, false, true); /* * enable task exception */ check_point(23); ercd = ena_tex(); check_ercd(ercd, E_OK); check_state(false, false, TIPM_ENAALL, false, false, false); /* * switch to task3 */ ercd = rot_rdq(TPRI_SELF); /* other tasks run here */ check_ercd(ercd, E_OK); /* * raise task exception request */ check_point(30); ercd = ras_tex(TSK_SELF, 0x0002); /* task exception routine runs here */ check_ercd(ercd, E_OK); /* * test exits */ check_finish(35); }
void task3(intptr_t exinf) { ER_UINT ercd; check_point(16); ercd = wup_tsk(TASK1); check_ercd(ercd, E_OK); check_point(17); ercd = slp_tsk(); check_ercd(ercd, E_OK); check_point(26); ercd = wup_tsk(TASK1); check_ercd(ercd, E_OK); check_point(27); ercd = slp_tsk(); check_ercd(ercd, E_OK); check_point(51); ercd = chg_pri(TASK1, HIGH_PRIORITY); check_ercd(ercd, E_OK); ercd = wup_tsk(TASK1); check_ercd(ercd, E_OK); check_point(65); ercd = rot_rdq(MID_PRIORITY); check_ercd(ercd, E_OK); check_point(68); ercd = ext_tsk(); check_point(0); }
void tex_task2(TEXPTN texptn, intptr_t exinf) { ER ercd; switch (texptn) { case 0x0001: check_point(28); check_state(false, false, TIPM_ENAALL, false, false, true); break; case 0x0002: check_point(30); check_state(false, false, TIPM_ENAALL, false, false, true); /* * ディスパッチを禁止して,タスク切換えを要求する. */ check_point(31); ercd = dis_dsp(); check_ercd(ercd, E_OK); ercd = rot_rdq(TPRI_SELF); check_ercd(ercd, E_OK); /* * タスク例外処理ルーチンからのリターンで,タスク切換えが発生 * する. */ check_point(32); break; default: check_point(0); break; } }
void task1(intptr_t exinf) { ER ercd; T_RTEX rtex; /* * 初期状態のチェック */ check_point(1); check_state(false, false, TIPM_ENAALL, false, false, true); ercd = ref_tex(TSK_SELF, &rtex); check_ercd(ercd, E_OK); check_assert((rtex.texstat & TTEX_DIS) != 0); check_assert(rtex.pndptn == 0); /* * ras_texのエラー検出 */ ercd = ras_tex(TASK3, 0x0001); check_ercd(ercd, E_OBJ); ercd = ras_tex(TASK4, 0x0001); check_ercd(ercd, E_OBJ); /* * ref_texのエラー検出 */ ercd = ref_tex(TASK3, &rtex); check_ercd(ercd, E_OBJ); ercd = ref_tex(TASK4, &rtex); check_ercd(ercd, E_OBJ); /* * タスク例外処理の許可 */ check_point(2); ercd = ena_tex(); check_ercd(ercd, E_OK); check_state(false, false, TIPM_ENAALL, false, false, false); ercd = ref_tex(TSK_SELF, &rtex); check_ercd(ercd, E_OK); check_assert((rtex.texstat & TTEX_ENA) != 0); check_assert(rtex.pndptn == 0); /* * タスク例外処理を要求 */ check_point(3); ercd = ras_tex(TSK_SELF, 0x0001); /* ここでタスク例外処理ルーチンが動作する */ check_ercd(ercd, E_OK); /* * タスク例外処理からのリターンにより元の状態に戻っていることを * チェック */ check_point(6); check_state(false, false, TIPM_ENAALL, false, false, false); /* * ディスパッチ禁止,割込み優先度マスク変更,タスク例外処理禁止 */ check_point(7); ercd = dis_dsp(); check_ercd(ercd, E_OK); ercd = chg_ipm(TMIN_INTPRI); check_ercd(ercd, E_OK); ercd = dis_tex(); check_ercd(ercd, E_OK); check_state(false, false, TMIN_INTPRI, true, true, true); /* * タスク例外処理を要求 */ check_point(8); ercd = ras_tex(TASK1, 0x0002); check_ercd(ercd, E_OK); ercd = ref_tex(TSK_SELF, &rtex); check_ercd(ercd, E_OK); check_assert((rtex.texstat & TTEX_DIS) != 0); check_assert(rtex.pndptn == 0x0002); /* * タスク例外処理を許可 */ check_point(9); ercd = ena_tex(); /* ここでタスク例外処理ルーチンが動作する */ check_ercd(ercd, E_OK); /* * タスク例外処理からのリターンにより元の状態に戻っていることを * チェック */ check_point(19); check_state(false, false, TMIN_INTPRI, true, true, false); /* * タスク2に切り換える */ check_point(20); ercd = ena_dsp(); check_ercd(ercd, E_OK); ercd = chg_ipm(TIPM_ENAALL); check_ercd(ercd, E_OK); ercd = rot_rdq(TPRI_SELF); /* ここで他のタスクが動作する */ check_ercd(ercd, E_OK); /* * タスク2に対してタスク例外処理を要求 */ check_point(26); ercd = ras_tex(TASK2, 0x0001); check_ercd(ercd, E_OK); ercd = ref_tex(TASK2, &rtex); check_ercd(ercd, E_OK); check_assert((rtex.texstat & TTEX_ENA) != 0); check_assert(rtex.pndptn == 0x0001); /* * タスク2に切り換える */ check_point(27); ercd = rot_rdq(TPRI_SELF); /* ここで他のタスクが動作する */ check_ercd(ercd, E_OK); /* * タスク終了 */ check_point(33); }
void task1(intptr_t exinf) { ER_UINT ercd; PRI tskpri; test_start(__FILE__); set_bit_func(bit_mutex); check_point(1); ercd = dis_dsp(); check_ercd(ercd, E_OK); check_point(2); ercd = act_tsk(TASK2); check_ercd(ercd, E_OK); ercd = act_tsk(TASK4); check_ercd(ercd, E_OK); check_point(3); ercd = ploc_mtx(MTX2); check_ercd(ercd, E_OK); ercd = get_pri(TSK_SELF, &tskpri); check_ercd(ercd, E_OK); check_assert(tskpri == HIGH_PRIORITY); check_point(4); ercd = ena_dsp(); check_ercd(ercd, E_OK); check_point(5); ercd = unl_mtx(MTX2); check_ercd(ercd, E_OK); check_point(8); ercd = get_pri(TSK_SELF, &tskpri); check_ercd(ercd, E_OK); check_assert(tskpri == MID_PRIORITY); check_point(9); ercd = dis_dsp(); check_ercd(ercd, E_OK); check_point(10); ercd = rot_rdq(MID_PRIORITY); check_ercd(ercd, E_OK); check_point(11); ercd = act_tsk(TASK3); check_ercd(ercd, E_OK); check_point(12); ercd = ploc_mtx(MTX1); check_ercd(ercd, E_OK); ercd = get_pri(TSK_SELF, &tskpri); check_ercd(ercd, E_OK); check_assert(tskpri == MID_PRIORITY); check_point(13); ercd = ena_dsp(); check_ercd(ercd, E_OK); check_point(15); ercd = slp_tsk(); check_ercd(ercd, E_OK); check_point(18); ercd = wup_tsk(TASK2); check_ercd(ercd, E_OK); check_point(19); ercd = dis_dsp(); check_ercd(ercd, E_OK); check_point(20); ercd = rot_rdq(MID_PRIORITY); check_ercd(ercd, E_OK); check_point(21); ercd = wup_tsk(TASK3); check_ercd(ercd, E_OK); check_point(22); ercd = unl_mtx(MTX1); check_ercd(ercd, E_OK); ercd = get_pri(TSK_SELF, &tskpri); check_ercd(ercd, E_OK); check_assert(tskpri == MID_PRIORITY); check_point(23); ercd = ena_dsp(); check_ercd(ercd, E_OK); check_point(25); ercd = slp_tsk(); check_ercd(ercd, E_OK); check_point(28); ercd = dis_dsp(); check_ercd(ercd, E_OK); check_point(29); ercd = wup_tsk(TASK4); check_ercd(ercd, E_OK); check_point(30); ercd = ploc_mtx(MTX2); check_ercd(ercd, E_OK); check_point(31); ercd = rot_rdq(HIGH_PRIORITY); check_ercd(ercd, E_OK); check_point(32); ercd = act_tsk(TASK5); check_ercd(ercd, E_OK); check_point(33); ercd = ploc_mtx(MTX1); check_ercd(ercd, E_OK); ercd = get_pri(TSK_SELF, &tskpri); check_ercd(ercd, E_OK); check_assert(tskpri == HIGH_PRIORITY); check_point(34); ercd = ena_dsp(); check_ercd(ercd, E_OK); check_point(36); ercd = slp_tsk(); check_ercd(ercd, E_OK); check_point(39); ercd = dis_dsp(); check_ercd(ercd, E_OK); check_point(40); ercd = wup_tsk(TASK4); check_ercd(ercd, E_OK); check_point(41); ercd = rot_rdq(HIGH_PRIORITY); check_ercd(ercd, E_OK); check_point(42); ercd = wup_tsk(TASK5); check_ercd(ercd, E_OK); check_point(43); ercd = unl_mtx(MTX1); check_ercd(ercd, E_OK); ercd = get_pri(TSK_SELF, &tskpri); check_ercd(ercd, E_OK); check_assert(tskpri == HIGH_PRIORITY); check_point(44); ercd = ena_dsp(); check_ercd(ercd, E_OK); check_point(46); ercd = slp_tsk(); check_ercd(ercd, E_OK); check_point(49); ercd = wup_tsk(TASK2); check_ercd(ercd, E_OK); ercd = wup_tsk(TASK3); check_ercd(ercd, E_OK); ercd = slp_tsk(); check_ercd(ercd, E_OK); check_point(52); ercd = unl_mtx(MTX2); check_ercd(ercd, E_OK); ercd = get_pri(TASK2, &tskpri); check_ercd(ercd, E_OK); check_assert(tskpri == HIGH_PRIORITY); check_point(53); ercd = loc_mtx(MTX3); check_ercd(ercd, E_OK); ercd = chg_pri(TASK1, TPRI_INI); check_ercd(ercd, E_OK); check_point(54); ercd = loc_mtx(MTX1); check_ercd(ercd, E_OK); check_point(55); ercd = slp_tsk(); check_ercd(ercd, E_OK); check_point(58); ercd = unl_mtx(MTX1); check_ercd(ercd, E_OK); ercd = get_pri(TASK2, &tskpri); check_ercd(ercd, E_OK); check_assert(tskpri == HIGH_PRIORITY); check_point(59); ercd = unl_mtx(MTX3); check_ercd(ercd, E_OK); check_point(64); ercd = loc_mtx(MTX1); check_ercd(ercd, E_OK); check_finish(69); check_point(0); }
void task1(intptr_t exinf) { ER_UINT ercd; T_RTEX rtex; test_start(__FILE__); check_point(1); check_state(false, false, TIPM_ENAALL, false, false, true); ercd = ref_tex(TSK_SELF, &rtex); check_ercd(ercd, E_OK); check_assert((rtex.texstat & TTEX_DIS) != 0U); check_assert(rtex.pndptn == 0U); ercd = ras_tex(TASK3, 0x0001); check_ercd(ercd, E_OBJ); ercd = ras_tex(TASK4, 0x0001); check_ercd(ercd, E_OBJ); ercd = ref_tex(TASK3, &rtex); check_ercd(ercd, E_OBJ); ercd = ref_tex(TASK4, &rtex); check_ercd(ercd, E_OBJ); check_point(2); ercd = ena_tex(); check_ercd(ercd, E_OK); check_state(false, false, TIPM_ENAALL, false, false, false); ercd = ref_tex(TSK_SELF, &rtex); check_ercd(ercd, E_OK); check_assert((rtex.texstat & TTEX_ENA) != 0U); check_assert(rtex.pndptn == 0U); check_point(3); ercd = ras_tex(TSK_SELF, 0x0001); check_ercd(ercd, E_OK); check_point(6); check_state(false, false, TIPM_ENAALL, false, false, false); check_point(7); ercd = dis_dsp(); check_ercd(ercd, E_OK); ercd = dis_tex(); check_ercd(ercd, E_OK); check_state(false, false, TIPM_ENAALL, true, true, true); check_point(8); ercd = ras_tex(TASK1, 0x0002); check_ercd(ercd, E_OK); ercd = ref_tex(TSK_SELF, &rtex); check_ercd(ercd, E_OK); check_assert((rtex.texstat & TTEX_DIS) != 0); check_assert(rtex.pndptn == 0x0002); check_point(9); ercd = ena_tex(); check_ercd(ercd, E_OK); check_point(20); check_state(false, false, TIPM_ENAALL, true, true, false); check_point(21); ercd = ena_dsp(); check_ercd(ercd, E_OK); ercd = rot_rdq(TPRI_SELF); check_ercd(ercd, E_OK); check_point(27); ercd = ras_tex(TASK2, 0x0001); check_ercd(ercd, E_OK); ercd = ref_tex(TASK2, &rtex); check_ercd(ercd, E_OK); check_point(28); ercd = rot_rdq(TPRI_SELF); check_ercd(ercd, E_OK); check_point(34); return; check_point(0); }
void task4(intptr_t exinf) { ER_UINT ercd; PRI tskpri; check_point(18); ercd = wup_tsk(TASK1); check_ercd(ercd, E_OK); check_point(19); ercd = slp_tsk(); check_ercd(ercd, E_OK); check_point(31); ercd = wup_tsk(TASK1); check_ercd(ercd, E_OK); check_point(32); ercd = rot_rdq(MID_PRIORITY); check_ercd(ercd, E_OK); check_point(35); ercd = get_pri(TASK1, &tskpri); check_ercd(ercd, E_OK); check_assert(tskpri == LOW_PRIORITY); check_point(36); ercd = slp_tsk(); check_ercd(ercd, E_OK); check_point(56); ercd = loc_mtx(MTX4); check_ercd(ercd, E_OK); check_point(63); ercd = unl_mtx(MTX4); check_ercd(ercd, E_OK); check_point(64); ercd = slp_tsk(); check_ercd(ercd, E_OK); check_point(76); ercd = loc_mtx(MTX4); check_ercd(ercd, E_OK); check_point(83); ercd = unl_mtx(MTX4); check_ercd(ercd, E_OK); check_point(84); ercd = slp_tsk(); check_ercd(ercd, E_OK); check_point(96); ercd = ext_tsk(); check_point(0); }
/* * メインタスク */ void main_task(intptr_t exinf) { char c; ID tskid = TASK1; int_t tskno = 1; ER_UINT ercd; PRI tskpri; #ifndef TASK_LOOP volatile ulong_t i; SYSTIM stime1, stime2; #endif /* TASK_LOOP */ HRTCNT hrtcnt1, hrtcnt2; SVC_PERROR(syslog_msk_log(LOG_UPTO(LOG_INFO), LOG_UPTO(LOG_EMERG))); syslog(LOG_NOTICE, "Sample program starts (exinf = %d).", (int_t) exinf); /* * シリアルポートの初期化 * * システムログタスクと同じシリアルポートを使う場合など,シリアル * ポートがオープン済みの場合にはここでE_OBJエラーになるが,支障は * ない. */ ercd = serial_opn_por(TASK_PORTID); if (ercd < 0 && MERCD(ercd) != E_OBJ) { syslog(LOG_ERROR, "%s (%d) reported by `serial_opn_por'.", itron_strerror(ercd), SERCD(ercd)); } SVC_PERROR(serial_ctl_por(TASK_PORTID, (IOCTL_CRLF | IOCTL_FCSND | IOCTL_FCRCV))); /* * ループ回数の設定 * * 並行実行されるタスク内での空ループの回数(task_loop)は,空ルー * プの実行時間が約0.4秒になるように設定する.この設定のために, * LOOP_REF回の空ループの実行時間を,その前後でget_timを呼ぶことで * 測定し,その測定結果から空ループの実行時間が0.4秒になるループ回 * 数を求め,task_loopに設定する. * * LOOP_REFは,デフォルトでは1,000,000に設定しているが,想定したよ * り遅いプロセッサでは,サンプルプログラムの実行開始に時間がかか * りすぎるという問題を生じる.逆に想定したより速いプロセッサでは, * LOOP_REF回の空ループの実行時間が短くなり,task_loopに設定する値 * の誤差が大きくなるという問題がある. * * そこで,そのようなターゲットでは,target_test.hで,LOOP_REFを適 * 切な値に定義するのが望ましい. * * また,task_loopの値を固定したい場合には,その値をTASK_LOOPにマ * クロ定義する.TASK_LOOPがマクロ定義されている場合,上記の測定を * 行わずに,TASK_LOOPに定義された値を空ループの回数とする. * * ターゲットによっては,空ループの実行時間の1回目の測定で,本来よ * りも長めになるものがある.このようなターゲットでは,MEASURE_TWICE * をマクロ定義することで,1回目の測定結果を捨てて,2回目の測定結果 * を使う. */ #ifdef TASK_LOOP task_loop = TASK_LOOP; #else /* TASK_LOOP */ #ifdef MEASURE_TWICE task_loop = LOOP_REF; SVC_PERROR(get_tim(&stime1)); for (i = 0; i < task_loop; i++); SVC_PERROR(get_tim(&stime2)); #endif /* MEASURE_TWICE */ task_loop = LOOP_REF; SVC_PERROR(get_tim(&stime1)); for (i = 0; i < task_loop; i++); SVC_PERROR(get_tim(&stime2)); task_loop = LOOP_REF * 400LU / (ulong_t)(stime2 - stime1) * 1000LU; #endif /* TASK_LOOP */ /* * タスクの起動 */ SVC_PERROR(act_tsk(TASK1)); SVC_PERROR(act_tsk(TASK2)); SVC_PERROR(act_tsk(TASK3)); /* * メインループ */ do { SVC_PERROR(serial_rea_dat(TASK_PORTID, &c, 1)); switch (c) { case 'e': case 's': case 'S': case 'd': case 'y': case 'Y': case 'z': case 'Z': message[tskno-1] = c; break; case '1': tskno = 1; tskid = TASK1; break; case '2': tskno = 2; tskid = TASK2; break; case '3': tskno = 3; tskid = TASK3; break; case 'a': syslog(LOG_INFO, "#act_tsk(%d)", tskno); SVC_PERROR(act_tsk(tskid)); break; case 'A': syslog(LOG_INFO, "#can_act(%d)", tskno); SVC_PERROR(ercd = can_act(tskid)); if (ercd >= 0) { syslog(LOG_NOTICE, "can_act(%d) returns %d", tskno, ercd); } break; case 't': syslog(LOG_INFO, "#ter_tsk(%d)", tskno); SVC_PERROR(ter_tsk(tskid)); break; case '>': syslog(LOG_INFO, "#chg_pri(%d, HIGH_PRIORITY)", tskno); SVC_PERROR(chg_pri(tskid, HIGH_PRIORITY)); break; case '=': syslog(LOG_INFO, "#chg_pri(%d, MID_PRIORITY)", tskno); SVC_PERROR(chg_pri(tskid, MID_PRIORITY)); break; case '<': syslog(LOG_INFO, "#chg_pri(%d, LOW_PRIORITY)", tskno); SVC_PERROR(chg_pri(tskid, LOW_PRIORITY)); break; case 'G': syslog(LOG_INFO, "#get_pri(%d, &tskpri)", tskno); SVC_PERROR(ercd = get_pri(tskid, &tskpri)); if (ercd >= 0) { syslog(LOG_NOTICE, "priority of task %d is %d", tskno, tskpri); } break; case 'w': syslog(LOG_INFO, "#wup_tsk(%d)", tskno); SVC_PERROR(wup_tsk(tskid)); break; case 'W': syslog(LOG_INFO, "#can_wup(%d)", tskno); SVC_PERROR(ercd = can_wup(tskid)); if (ercd >= 0) { syslog(LOG_NOTICE, "can_wup(%d) returns %d", tskno, ercd); } break; case 'l': syslog(LOG_INFO, "#rel_wai(%d)", tskno); SVC_PERROR(rel_wai(tskid)); break; case 'u': syslog(LOG_INFO, "#sus_tsk(%d)", tskno); SVC_PERROR(sus_tsk(tskid)); break; case 'm': syslog(LOG_INFO, "#rsm_tsk(%d)", tskno); SVC_PERROR(rsm_tsk(tskid)); break; case 'x': syslog(LOG_INFO, "#ras_ter(%d)", tskno); SVC_PERROR(ras_ter(tskid)); break; case 'r': syslog(LOG_INFO, "#rot_rdq(three priorities)"); SVC_PERROR(rot_rdq(HIGH_PRIORITY)); SVC_PERROR(rot_rdq(MID_PRIORITY)); SVC_PERROR(rot_rdq(LOW_PRIORITY)); break; case 'c': syslog(LOG_INFO, "#sta_cyc(1)"); SVC_PERROR(sta_cyc(CYCHDR1)); break; case 'C': syslog(LOG_INFO, "#stp_cyc(1)"); SVC_PERROR(stp_cyc(CYCHDR1)); break; case 'b': syslog(LOG_INFO, "#sta_alm(1, 5000000)"); SVC_PERROR(sta_alm(ALMHDR1, 5000000)); break; case 'B': syslog(LOG_INFO, "#stp_alm(1)"); SVC_PERROR(stp_alm(ALMHDR1)); break; case 'V': hrtcnt1 = fch_hrt(); hrtcnt2 = fch_hrt(); syslog(LOG_NOTICE, "hrtcnt1 = %tu, hrtcnt2 = %tu", hrtcnt1, hrtcnt2); break; case 'o': #ifdef TOPPERS_SUPPORT_OVRHDR syslog(LOG_INFO, "#sta_ovr(%d, 2000000)", tskno); SVC_PERROR(sta_ovr(tskid, 2000000)); #else /* TOPPERS_SUPPORT_OVRHDR */ syslog(LOG_NOTICE, "sta_ovr is not supported."); #endif /* TOPPERS_SUPPORT_OVRHDR */ break; case 'O': #ifdef TOPPERS_SUPPORT_OVRHDR syslog(LOG_INFO, "#stp_ovr(%d)", tskno); SVC_PERROR(stp_ovr(tskid)); #else /* TOPPERS_SUPPORT_OVRHDR */ syslog(LOG_NOTICE, "stp_ovr is not supported."); #endif /* TOPPERS_SUPPORT_OVRHDR */ break; case 'v': SVC_PERROR(syslog_msk_log(LOG_UPTO(LOG_INFO), LOG_UPTO(LOG_EMERG))); break; case 'q': SVC_PERROR(syslog_msk_log(LOG_UPTO(LOG_NOTICE), LOG_UPTO(LOG_EMERG))); break; #ifdef BIT_KERNEL case ' ': SVC_PERROR(loc_cpu()); { extern ER bit_kernel(void); SVC_PERROR(ercd = bit_kernel()); if (ercd >= 0) { syslog(LOG_NOTICE, "bit_kernel passed."); } } SVC_PERROR(unl_cpu()); break; #endif /* BIT_KERNEL */ default: break; } } while (c != '\003' && c != 'Q'); syslog(LOG_NOTICE, "Sample program ends."); SVC_PERROR(ext_ker()); assert(0); }
void task1(intptr_t exinf) { ER ercd; T_RTEX rtex; /* * check init state */ check_point(1); check_state(false, false, TIPM_ENAALL, false, false, true); ercd = ref_tex(TSK_SELF, &rtex); check_ercd(ercd, E_OK); check_assert((rtex.texstat & TTEX_DIS) != 0); check_assert(rtex.pndptn == 0); /* * error check of ras_tex */ ercd = ras_tex(TASK3, 0x0001); check_ercd(ercd, E_OBJ); ercd = ras_tex(TASK4, 0x0001); check_ercd(ercd, E_OBJ); /* * error check of ref_tex */ ercd = ref_tex(TASK3, &rtex); check_ercd(ercd, E_OBJ); ercd = ref_tex(TASK4, &rtex); check_ercd(ercd, E_OBJ); /* * enable task exception */ check_point(2); ercd = ena_tex(); check_ercd(ercd, E_OK); check_state(false, false, TIPM_ENAALL, false, false, false); ercd = ref_tex(TSK_SELF, &rtex); check_ercd(ercd, E_OK); check_assert((rtex.texstat & TTEX_ENA) != 0); check_assert(rtex.pndptn == 0); /* * raise task exception request */ check_point(3); ercd = ras_tex(TSK_SELF, 0x0001); /* task exception routine runs here */ check_ercd(ercd, E_OK); /* * check the state when task exception routine returns */ check_point(6); check_state(false, false, TIPM_ENAALL, false, false, false); /* * dispatch disabled, task exception disabled */ check_point(7); ercd = dis_dsp(); check_ercd(ercd, E_OK); ercd = dis_tex(); check_ercd(ercd, E_OK); check_state(false, false, TIPM_ENAALL, true, true, true); /* * raise task exception request */ check_point(8); ercd = ras_tex(TASK1, 0x0002); check_ercd(ercd, E_OK); ercd = ref_tex(TSK_SELF, &rtex); check_ercd(ercd, E_OK); check_assert((rtex.texstat & TTEX_DIS) != 0); check_assert(rtex.pndptn == 0x0002); /* * enable task exception */ check_point(9); ercd = ena_tex(); /* task exception routine runs here */ check_ercd(ercd, E_OK); /* * check the state when task exception routine returns */ check_point(20); check_state(false, false, TIPM_ENAALL, true, true, false); /* * switch task2 */ check_point(21); ercd = ena_dsp(); check_ercd(ercd, E_OK); ercd = rot_rdq(TPRI_SELF); /* other tasks run here */ check_ercd(ercd, E_OK); /* * raise the task exception of task2 */ check_point(27); ercd = ras_tex(TASK2, 0x0001); check_ercd(ercd, E_OK); ercd = ref_tex(TASK2, &rtex); check_ercd(ercd, E_OK); check_assert((rtex.texstat & TTEX_ENA) != 0); check_assert(rtex.pndptn == 0x0001); /* * switch to task2 */ check_point(28); ercd = rot_rdq(TPRI_SELF); /* other tasks run here */ check_ercd(ercd, E_OK); /* * task exits */ check_point(34); }
/* * main task */ void main_task(intptr_t exinf) { char_t c; ID tskid = TASK1; int_t tskno = 1; ER_UINT ercd; PRI tskpri; #ifndef TASK_LOOP volatile ulong_t i; SYSTIM stime1, stime2; #endif /* TASK_LOOP */ #ifdef TOPPERS_SUPPORT_GET_UTM SYSUTM utime1, utime2; #endif /* TOPPERS_SUPPORT_GET_UTM */ SVC_PERROR(syslog_msk_log(LOG_UPTO(LOG_INFO), LOG_UPTO(LOG_EMERG))); syslog(LOG_NOTICE, "Sample program starts (exinf = %d).", (int_t) exinf); /* * initialize the serial port * * If the same serial port is shared between main task and system * log task. As this serial port is already opened in system log * task, serial_opn_por will return E_OBJ which is not a real * error. */ ercd = serial_opn_por(TASK_PORTID); if (ercd < 0 && MERCD(ercd) != E_OBJ) { syslog(LOG_ERROR, "%s (%d) reported by `serial_opn_por'.", itron_strerror(ercd), SERCD(ercd)); } SVC_PERROR(serial_ctl_por(TASK_PORTID, (IOCTL_CRLF | IOCTL_FCSND | IOCTL_FCRCV))); /* * adjustment of task_loop. * * If TASK_LOOP is defined, the adjustment of task_loop will not be * done. * * If MEASURE_TWICE is defined, 2 measurements are made. The 2nd * result is adopted as the 1st is a little longer than the 2nd. */ #ifdef TASK_LOOP task_loop = TASK_LOOP; #else /* TASK_LOOP */ #ifdef MEASURE_TWICE task_loop = LOOP_REF; SVC_PERROR(get_tim(&stime1)); for (i = 0; i < task_loop; i++); SVC_PERROR(get_tim(&stime2)); #endif /* MEASURE_TWICE */ task_loop = LOOP_REF; SVC_PERROR(get_tim(&stime1)); for (i = 0; i < task_loop; i++); SVC_PERROR(get_tim(&stime2)); task_loop = LOOP_REF * 400UL / (stime2 - stime1); #endif /* TASK_LOOP */ tex_loop = task_loop / 5; /* * activate the target tasks */ SVC_PERROR(act_tsk(TASK1)); SVC_PERROR(act_tsk(TASK2)); SVC_PERROR(act_tsk(TASK3)); /* * main loop */ do { SVC_PERROR(serial_rea_dat(TASK_PORTID, &c, 1)); switch (c) { case 'e': case 's': case 'S': case 'd': case 'y': case 'Y': case 'z': case 'Z': message[tskno-1] = c; break; case '1': tskno = 1; tskid = TASK1; break; case '2': tskno = 2; tskid = TASK2; break; case '3': tskno = 3; tskid = TASK3; break; case 'a': syslog(LOG_INFO, "#act_tsk(%d)", tskno); SVC_PERROR(act_tsk(tskid)); break; case 'A': syslog(LOG_INFO, "#can_act(%d)", tskno); SVC_PERROR(ercd = can_act(tskid)); if (ercd >= 0) { syslog(LOG_NOTICE, "can_act(%d) returns %d", tskno, ercd); } break; case 't': syslog(LOG_INFO, "#ter_tsk(%d)", tskno); SVC_PERROR(ter_tsk(tskid)); break; case '>': syslog(LOG_INFO, "#chg_pri(%d, HIGH_PRIORITY)", tskno); SVC_PERROR(chg_pri(tskid, HIGH_PRIORITY)); break; case '=': syslog(LOG_INFO, "#chg_pri(%d, MID_PRIORITY)", tskno); SVC_PERROR(chg_pri(tskid, MID_PRIORITY)); break; case '<': syslog(LOG_INFO, "#chg_pri(%d, LOW_PRIORITY)", tskno); SVC_PERROR(chg_pri(tskid, LOW_PRIORITY)); break; case 'G': syslog(LOG_INFO, "#get_pri(%d, &tskpri)", tskno); SVC_PERROR(ercd = get_pri(tskid, &tskpri)); if (ercd >= 0) { syslog(LOG_NOTICE, "priority of task %d is %d", tskno, tskpri); } break; case 'w': syslog(LOG_INFO, "#wup_tsk(%d)", tskno); SVC_PERROR(wup_tsk(tskid)); break; case 'W': syslog(LOG_INFO, "#can_wup(%d)", tskno); SVC_PERROR(ercd = can_wup(tskid)); if (ercd >= 0) { syslog(LOG_NOTICE, "can_wup(%d) returns %d", tskno, ercd); } break; case 'l': syslog(LOG_INFO, "#rel_wai(%d)", tskno); SVC_PERROR(rel_wai(tskid)); break; case 'u': syslog(LOG_INFO, "#sus_tsk(%d)", tskno); SVC_PERROR(sus_tsk(tskid)); break; case 'm': syslog(LOG_INFO, "#rsm_tsk(%d)", tskno); SVC_PERROR(rsm_tsk(tskid)); break; case 'x': syslog(LOG_INFO, "#ras_tex(%d, 0x0001U)", tskno); SVC_PERROR(ras_tex(tskid, 0x0001U)); break; case 'X': syslog(LOG_INFO, "#ras_tex(%d, 0x0002U)", tskno); SVC_PERROR(ras_tex(tskid, 0x0002U)); break; case 'r': syslog(LOG_INFO, "#rot_rdq(three priorities)"); SVC_PERROR(rot_rdq(HIGH_PRIORITY)); SVC_PERROR(rot_rdq(MID_PRIORITY)); SVC_PERROR(rot_rdq(LOW_PRIORITY)); break; case 'c': syslog(LOG_INFO, "#sta_cyc(1)"); SVC_PERROR(sta_cyc(CYCHDR1)); break; case 'C': syslog(LOG_INFO, "#stp_cyc(1)"); SVC_PERROR(stp_cyc(CYCHDR1)); break; case 'b': syslog(LOG_INFO, "#sta_alm(1, 5000)"); SVC_PERROR(sta_alm(ALMHDR1, 5000)); break; case 'B': syslog(LOG_INFO, "#stp_alm(1)"); SVC_PERROR(stp_alm(ALMHDR1)); break; case 'V': #ifdef TOPPERS_SUPPORT_GET_UTM SVC_PERROR(get_utm(&utime1)); SVC_PERROR(get_utm(&utime2)); syslog(LOG_NOTICE, "utime1 = %ld, utime2 = %ld", (ulong_t) utime1, (ulong_t) utime2); #else /* TOPPERS_SUPPORT_GET_UTM */ syslog(LOG_NOTICE, "get_utm is not supported."); #endif /* TOPPERS_SUPPORT_GET_UTM */ break; case 'v': SVC_PERROR(syslog_msk_log(LOG_UPTO(LOG_INFO), LOG_UPTO(LOG_EMERG))); break; case 'q': SVC_PERROR(syslog_msk_log(LOG_UPTO(LOG_NOTICE), LOG_UPTO(LOG_EMERG))); break; #ifdef BIT_KERNEL case ' ': SVC_PERROR(loc_cpu()); { extern ER bit_kernel(void); SVC_PERROR(ercd = bit_kernel()); if (ercd >= 0) { syslog(LOG_NOTICE, "bit_kernel passed."); } } SVC_PERROR(unl_cpu()); break; #endif /* BIT_KERNEL */ default: break; } } while (c != '\003' && c != 'Q'); syslog(LOG_NOTICE, "Sample program ends."); SVC_PERROR(ext_ker()); assert(0); }
void task1(intptr_t exinf) { ER ercd; T_RMTX rmtx; set_bit_func(bit_mutex); check_point(1); ercd = act_tsk(TASK2); check_ercd(ercd, E_OK); check_point(2); ercd = rot_rdq(TPRI_SELF); check_ercd(ercd, E_OK); check_point(5); ercd = ref_mtx(MTX1, &rmtx); check_ercd(ercd, E_OK); check_assert(rmtx.htskid == TSK_NONE); check_assert(rmtx.wtskid == TSK_NONE); check_point(6); ercd = act_tsk(TASK2); check_ercd(ercd, E_OK); ercd = act_tsk(TASK3); check_ercd(ercd, E_OK); check_point(7); ercd = rot_rdq(TPRI_SELF); check_ercd(ercd, E_OK); check_point(11); ercd = wup_tsk(TASK2); check_ercd(ercd, E_OK); check_point(14); ercd = act_tsk(TASK2); check_ercd(ercd, E_OK); check_point(15); ercd = rot_rdq(TPRI_SELF); check_ercd(ercd, E_OK); check_point(18); ercd = ref_mtx(MTX1, &rmtx); check_ercd(ercd, E_OK); check_assert(rmtx.htskid == TSK_NONE); check_assert(rmtx.wtskid == TSK_NONE); ercd = ref_mtx(MTX2, &rmtx); check_ercd(ercd, E_OK); check_assert(rmtx.htskid == TSK_NONE); check_assert(rmtx.wtskid == TSK_NONE); check_point(19); ercd = act_tsk(TASK2); check_ercd(ercd, E_OK); ercd = wup_tsk(TASK3); check_ercd(ercd, E_OK); ercd = act_tsk(TASK4); check_ercd(ercd, E_OK); check_point(20); ercd = rot_rdq(TPRI_SELF); check_ercd(ercd, E_OK); check_point(25); ercd = chg_pri(TSK_SELF, TPRI_INI); check_ercd(ercd, E_OK); check_point(28); ercd = wup_tsk(TASK2); check_ercd(ercd, E_OK); check_finish(32); check_point(0); }
void task2(intptr_t exinf) { ER ercd; switch (++task2_count) { case 1: check_point(3); ercd = loc_mtx(MTX1); check_ercd(ercd, E_OK); check_point(4); ercd = ext_tsk(); check_point(0); case 2: check_point(8); ercd = loc_mtx(MTX1); check_ercd(ercd, E_OK); check_point(9); ercd = slp_tsk(); check_ercd(ercd, E_OK); check_point(12); ercd = ext_tsk(); check_point(0); case 3: check_point(16); ercd = loc_mtx(MTX1); check_ercd(ercd, E_OK); ercd = loc_mtx(MTX2); check_ercd(ercd, E_OK); check_point(17); ercd = ext_tsk(); check_point(0); case 4: check_point(21); ercd = loc_mtx(MTX1); check_ercd(ercd, E_OK); ercd = loc_mtx(MTX2); check_ercd(ercd, E_OK); check_point(22); ercd = chg_pri(TASK1, HIGH_PRIORITY); check_ercd(ercd, E_OK); check_point(23); ercd = rot_rdq(TPRI_SELF); check_ercd(ercd, E_OK); check_point(24); ercd = slp_tsk(); check_ercd(ercd, E_OK); check_point(29); ercd = ext_tsk(); check_point(0); } check_point(0); }
void task1(intptr_t exinf) { ER_UINT ercd; test_start(__FILE__); set_bit_func(bit_mutex); check_point(1); ercd = loc_mtx(MTX1); check_ercd(ercd, E_OK); check_point(2); ercd = act_tsk(TASK2); check_ercd(ercd, E_OK); check_point(3); ercd = act_tsk(TASK5); check_ercd(ercd, E_OK); check_point(6); ercd = sus_tsk(TASK2); check_ercd(ercd, E_OK); check_point(7); ercd = loc_mtx(MTX1); check_ercd(ercd, E_OK); ercd = loc_mtx(MTX2); check_ercd(ercd, E_OK); check_point(8); ercd = act_tsk(TASK3); check_ercd(ercd, E_OK); check_point(9); ercd = dis_dsp(); check_ercd(ercd, E_OK); check_point(10); ercd = rot_rdq(MID_PRIORITY); check_ercd(ercd, E_OK); check_point(11); ercd = act_tsk(TASK4); check_ercd(ercd, E_OK); check_point(12); ercd = wup_tsk(TASK5); check_ercd(ercd, E_OK); check_point(13); ercd = ena_dsp(); check_ercd(ercd, E_OK); check_point(17); ercd = slp_tsk(); check_ercd(ercd, E_OK); check_point(20); ercd = loc_mtx(MTX3); check_ercd(ercd, E_OK); check_point(21); ercd = wup_tsk(TASK3); check_ercd(ercd, E_OK); check_point(22); ercd = dis_dsp(); check_ercd(ercd, E_OK); check_point(23); ercd = rot_rdq(MID_PRIORITY); check_ercd(ercd, E_OK); check_point(24); ercd = wup_tsk(TASK4); check_ercd(ercd, E_OK); check_point(25); ercd = wup_tsk(TASK5); check_ercd(ercd, E_OK); check_point(26); ercd = ena_dsp(); check_ercd(ercd, E_OK); check_point(30); ercd = slp_tsk(); check_ercd(ercd, E_OK); check_point(33); ercd = rsm_tsk(TASK2); check_ercd(ercd, E_OK); check_point(34); ercd = ini_mtx(MTX2); check_ercd(ercd, E_OK); check_point(37); ercd = wup_tsk(TASK5); check_ercd(ercd, E_OK); check_point(40); ercd = loc_mtx(MTX1); check_ercd(ercd, E_OK); check_point(41); ercd = loc_mtx(MTX4); check_ercd(ercd, E_OK); check_point(47); ercd = unl_mtx(MTX4); check_ercd(ercd, E_OK); check_point(48); ercd = wup_tsk(TASK5); check_ercd(ercd, E_OK); check_point(51); ercd = wup_tsk(TASK3); check_ercd(ercd, E_OK); check_point(53); ercd = loc_mtx(MTX1); check_ercd(ercd, E_OK); ercd = loc_mtx(MTX2); check_ercd(ercd, E_OK); check_point(54); ercd = loc_mtx(MTX4); check_ercd(ercd, E_OK); check_point(62); ercd = unl_mtx(MTX4); check_ercd(ercd, E_OK); check_point(65); ercd = slp_tsk(); check_ercd(ercd, E_OK); check_point(73); ercd = loc_mtx(MTX3); check_ercd(ercd, E_OK); check_point(74); ercd = loc_mtx(MTX4); check_ercd(ercd, E_OK); check_point(82); ercd = unl_mtx(MTX4); check_ercd(ercd, E_OK); check_point(85); ercd = unl_mtx(MTX2); check_ercd(ercd, E_OK); check_point(87); ercd = sus_tsk(TASK2); check_ercd(ercd, E_OK); check_point(88); ercd = loc_mtx(MTX1); check_ercd(ercd, E_OK); check_point(89); ercd = wup_tsk(TASK3); check_ercd(ercd, E_OK); check_point(90); ercd = rot_rdq(MID_PRIORITY); check_ercd(ercd, E_OK); check_point(92); ercd = wup_tsk(TASK5); check_ercd(ercd, E_OK); check_point(98); ercd = loc_mtx(MTX1); check_ercd(ercd, E_OK); check_point(99); ercd = wup_tsk(TASK3); check_ercd(ercd, E_OK); check_point(100); ercd = rot_rdq(MID_PRIORITY); check_ercd(ercd, E_OK); check_point(102); ercd = rsm_tsk(TASK2); check_ercd(ercd, E_OK); check_point(103); ercd = slp_tsk(); check_ercd(ercd, E_OK); check_point(0); }
static int __ui_rot_rdq(struct pt_regs *regs) { PRI tskpri = __xn_reg_arg1(regs); return rot_rdq(tskpri); }
/* * アラームハンドラ * * HIGH_PRIORITY,MID_PRIORITY,LOW_PRIORITY の各優先度のレディキュー * を回転させる. */ void alarm_handler(intptr_t exinf) { SVC_PERROR(rot_rdq(HIGH_PRIORITY)); SVC_PERROR(rot_rdq(MID_PRIORITY)); SVC_PERROR(rot_rdq(LOW_PRIORITY)); }
/* * メインタスク */ void main_task(intptr_t exinf) { char c; ID tskid = TASK1; int_t tskno = 1; ER_UINT ercd; PRI tskpri; #ifndef TASK_LOOP volatile ulong_t i; SYSTIM stime1, stime2; #endif /* TASK_LOOP */ #ifdef TOPPERS_SUPPORT_GET_UTM SYSUTM utime1, utime2; #endif /* TOPPERS_SUPPORT_GET_UTM */ T_CTSK ctsk; T_DTEX dtex; ID TASK3 = -1; SVC_PERROR(syslog_msk_log(LOG_UPTO(LOG_INFO), LOG_UPTO(LOG_EMERG))); syslog(LOG_NOTICE, "Sample program starts (exinf = %d).", (int_t) exinf); /* * シリアルポートの初期化 * * システムログタスクと同じシリアルポートを使う場合など,シリアル * ポートがオープン済みの場合にはここでE_OBJエラーになるが,支障は * ない. */ ercd = serial_opn_por(TASK_PORTID); if (ercd < 0 && MERCD(ercd) != E_OBJ) { syslog(LOG_ERROR, "%s (%d) reported by `serial_opn_por'.", itron_strerror(ercd), SERCD(ercd)); } SVC_PERROR(serial_ctl_por(TASK_PORTID, (IOCTL_CRLF | IOCTL_FCSND | IOCTL_FCRCV))); /* * ループ回数の設定 * * 並行実行されるタスク内での空ループの回数(task_loop)は,空ルー * プの実行時間が約0.4秒になるように設定する.この設定のために, * LOOP_REF回の空ループの実行時間を,その前後でget_timを呼ぶことで * 測定し,その測定結果から空ループの実行時間が0.4秒になるループ回 * 数を求め,task_loopに設定する. * * LOOP_REFは,デフォルトでは1,000,000に設定しているが,想定したよ * り遅いプロセッサでは,サンプルプログラムの実行開始に時間がかか * りすぎるという問題を生じる.逆に想定したより速いプロセッサでは, * LOOP_REF回の空ループの実行時間が短くなり,task_loopに設定する値 * の誤差が大きくなるという問題がある. * * そこで,そのようなターゲットでは,target_test.hで,LOOP_REFを適 * 切な値に定義するのが望ましい. * * また,task_loopの値を固定したい場合には,その値をTASK_LOOPにマ * クロ定義する.TASK_LOOPがマクロ定義されている場合,上記の測定を * 行わずに,TASK_LOOPに定義された値を空ループの回数とする. * * ターゲットによっては,空ループの実行時間の1回目の測定で,本来よ * りも長めになるものがある.このようなターゲットでは,MEASURE_TWICE * をマクロ定義することで,1回目の測定結果を捨てて,2回目の測定結果 * を使う. * * タスク例外処理ルーチン内での空ループの回数(tex_loop)は, * task_loopの4分の1の値(空ループの実行時間が0.1秒になるループ回 * 数)に設定する. */ #ifdef TASK_LOOP task_loop = TASK_LOOP; #else /* TASK_LOOP */ #ifdef MEASURE_TWICE task_loop = LOOP_REF; SVC_PERROR(get_tim(&stime1)); for (i = 0; i < task_loop; i++); SVC_PERROR(get_tim(&stime2)); #endif /* MEASURE_TWICE */ task_loop = LOOP_REF; SVC_PERROR(get_tim(&stime1)); for (i = 0; i < task_loop; i++); SVC_PERROR(get_tim(&stime2)); task_loop = LOOP_REF * 400UL / (stime2 - stime1); #endif /* TASK_LOOP */ tex_loop = task_loop / 4; /* * タスクの起動 */ SVC_PERROR(act_tsk(TASK1)); SVC_PERROR(act_tsk(TASK2)); /* * メインループ */ do { SVC_PERROR(serial_rea_dat(TASK_PORTID, &c, 1)); switch (c) { case 'e': case 's': case 'S': case 'd': case 'y': case 'Y': case 'z': case 'Z': message[tskno-1] = c; break; case '1': tskno = 1; tskid = TASK1; break; case '2': tskno = 2; tskid = TASK2; break; case '3': tskno = 3; tskid = TASK3; break; case 'a': syslog(LOG_INFO, "#act_tsk(%d)", tskno); SVC_PERROR(act_tsk(tskid)); break; case 'A': syslog(LOG_INFO, "#can_act(%d)", tskno); SVC_PERROR(ercd = can_act(tskid)); if (ercd >= 0) { syslog(LOG_NOTICE, "can_act(%d) returns %d", tskno, ercd); } break; case 't': syslog(LOG_INFO, "#ter_tsk(%d)", tskno); SVC_PERROR(ter_tsk(tskid)); break; case '>': syslog(LOG_INFO, "#chg_pri(%d, HIGH_PRIORITY)", tskno); SVC_PERROR(chg_pri(tskid, HIGH_PRIORITY)); break; case '=': syslog(LOG_INFO, "#chg_pri(%d, MID_PRIORITY)", tskno); SVC_PERROR(chg_pri(tskid, MID_PRIORITY)); break; case '<': syslog(LOG_INFO, "#chg_pri(%d, LOW_PRIORITY)", tskno); SVC_PERROR(chg_pri(tskid, LOW_PRIORITY)); break; case 'G': syslog(LOG_INFO, "#get_pri(%d, &tskpri)", tskno); SVC_PERROR(ercd = get_pri(tskid, &tskpri)); if (ercd >= 0) { syslog(LOG_NOTICE, "priority of task %d is %d", tskno, tskpri); } break; case 'w': syslog(LOG_INFO, "#wup_tsk(%d)", tskno); SVC_PERROR(wup_tsk(tskid)); break; case 'W': syslog(LOG_INFO, "#can_wup(%d)", tskno); SVC_PERROR(ercd = can_wup(tskid)); if (ercd >= 0) { syslog(LOG_NOTICE, "can_wup(%d) returns %d", tskno, ercd); } break; case 'l': syslog(LOG_INFO, "#rel_wai(%d)", tskno); SVC_PERROR(rel_wai(tskid)); break; case 'u': syslog(LOG_INFO, "#sus_tsk(%d)", tskno); SVC_PERROR(sus_tsk(tskid)); break; case 'm': syslog(LOG_INFO, "#rsm_tsk(%d)", tskno); SVC_PERROR(rsm_tsk(tskid)); break; case 'x': syslog(LOG_INFO, "#ras_tex(%d, 0x0001U)", tskno); SVC_PERROR(ras_tex(tskid, 0x0001U)); break; case 'X': syslog(LOG_INFO, "#ras_tex(%d, 0x0002U)", tskno); SVC_PERROR(ras_tex(tskid, 0x0002U)); break; case 'r': syslog(LOG_INFO, "#rot_rdq(three priorities)"); SVC_PERROR(rot_rdq(HIGH_PRIORITY)); SVC_PERROR(rot_rdq(MID_PRIORITY)); SVC_PERROR(rot_rdq(LOW_PRIORITY)); break; case 'c': syslog(LOG_INFO, "#sta_cyc(1)"); SVC_PERROR(sta_cyc(CYCHDR1)); break; case 'C': syslog(LOG_INFO, "#stp_cyc(1)"); SVC_PERROR(stp_cyc(CYCHDR1)); break; case 'b': syslog(LOG_INFO, "#sta_alm(1, 5000)"); SVC_PERROR(sta_alm(ALMHDR1, 5000)); break; case 'B': syslog(LOG_INFO, "#stp_alm(1)"); SVC_PERROR(stp_alm(ALMHDR1)); break; case '@': ctsk.tskatr = TA_NULL; ctsk.exinf = 3; ctsk.task = task; ctsk.itskpri = MID_PRIORITY; ctsk.stksz = STACK_SIZE; ctsk.stk = NULL; SVC_PERROR(TASK3 = acre_tsk(&ctsk)); dtex.texatr = TA_NULL; dtex.texrtn = tex_routine; SVC_PERROR(def_tex(TASK3, &dtex)); syslog(LOG_NOTICE, "task3 is created with tskid = %d.", (int_t) TASK3); break; case '!': syslog(LOG_INFO, "#del_tsk(%d)", tskno); SVC_PERROR(del_tsk(tskid)); break; case 'V': #ifdef TOPPERS_SUPPORT_GET_UTM SVC_PERROR(get_utm(&utime1)); SVC_PERROR(get_utm(&utime2)); syslog(LOG_NOTICE, "utime1 = %ld, utime2 = %ld", (ulong_t) utime1, (ulong_t) utime2); #else /* TOPPERS_SUPPORT_GET_UTM */ syslog(LOG_NOTICE, "get_utm is not supported."); #endif /* TOPPERS_SUPPORT_GET_UTM */ break; case 'v': SVC_PERROR(syslog_msk_log(LOG_UPTO(LOG_INFO), LOG_UPTO(LOG_EMERG))); break; case 'q': SVC_PERROR(syslog_msk_log(LOG_UPTO(LOG_NOTICE), LOG_UPTO(LOG_EMERG))); break; #ifdef BIT_KERNEL case ' ': SVC_PERROR(loc_cpu()); { extern ER bit_kernel(void); SVC_PERROR(ercd = bit_kernel()); if (ercd >= 0) { syslog(LOG_NOTICE, "bit_kernel passed."); } } SVC_PERROR(unl_cpu()); break; #endif /* BIT_KERNEL */ case '$': syslog(LOG_INFO, "#%d#twai_sem(10000)", tskno); SVC_PERROR(twai_sem(TEST_SEM, 10000)); break; default: break; } } while (c != '\003' && c != 'Q'); syslog(LOG_NOTICE, "Sample program ends."); SVC_PERROR(ext_ker()); assert(0); }
/* * メインタスク */ void main_task(VP_INT exinf) { char c; ID tskid = TASK1; volatile UW i; INT tskno = 1; ER_UINT ercd; PRI tskpri; SYSTIM stime1, stime2; #ifndef OMIT_VGET_TIM SYSUTIM utime1, utime2; #endif /* OMIT_VGET_TIM */ vmsk_log(LOG_UPTO(LOG_INFO), LOG_UPTO(LOG_EMERG)); syslog(LOG_NOTICE, "Sample program starts (exinf = %d).", (int)exinf); syscall(serial_ctl_por(TASK_PORTID, (IOCTL_CRLF | IOCTL_FCSND | IOCTL_FCRCV))); /* * ループ回数の設定 */ task_loop = LOOP_REF; get_tim(&stime1); for (i = 0; i < task_loop; i++); get_tim(&stime2); task_loop = LOOP_REF * 400 / (stime2 - stime1); tex_loop = task_loop / 5; /* * タスクの起動 */ act_tsk(TASK1); act_tsk(TASK2); act_tsk(TASK3); /* * メインループ */ do { syscall(serial_rea_dat(TASK_PORTID, &c, 1)); switch (c) { case 'e': case 's': case 'S': case 'd': case 'y': case 'Y': case 'z': case 'Z': message[tskno-1] = c; break; case '1': tskno = 1; tskid = TASK1; break; case '2': tskno = 2; tskid = TASK2; break; case '3': tskno = 3; tskid = TASK3; break; case 'a': syslog(LOG_INFO, "#act_tsk(%d)", tskno); syscall(act_tsk(tskid)); break; case 'A': syslog(LOG_INFO, "#can_act(%d)", tskno); syscall(ercd = can_act(tskid)); if (ercd >= 0) { syslog(LOG_NOTICE, "can_act(%d) returns %d", tskno, ercd); } break; case 't': syslog(LOG_INFO, "#ter_tsk(%d)", tskno); syscall(ter_tsk(tskid)); break; case '>': syslog(LOG_INFO, "#chg_pri(%d, HIGH_PRIORITY)", tskno); chg_pri(tskid, HIGH_PRIORITY); break; case '=': syslog(LOG_INFO, "#chg_pri(%d, MID_PRIORITY)", tskno); chg_pri(tskid, MID_PRIORITY); break; case '<': syslog(LOG_INFO, "#chg_pri(%d, LOW_PRIORITY)", tskno); chg_pri(tskid, LOW_PRIORITY); break; case 'G': syslog(LOG_INFO, "#get_pri(%d, &tskpri)", tskno); syscall(ercd = get_pri(tskid, &tskpri)); if (ercd >= 0) { syslog(LOG_NOTICE, "priority of task %d is %d", tskno, tskpri); } break; case 'w': syslog(LOG_INFO, "#wup_tsk(%d)", tskno); syscall(wup_tsk(tskid)); break; case 'W': syslog(LOG_INFO, "#can_wup(%d)", tskno); syscall(ercd = can_wup(tskid)); if (ercd >= 0) { syslog(LOG_NOTICE, "can_wup(%d) returns %d", tskno, ercd); } break; case 'l': syslog(LOG_INFO, "#rel_wai(%d)", tskno); syscall(rel_wai(tskid)); break; case 'u': syslog(LOG_INFO, "#sus_tsk(%d)", tskno); syscall(sus_tsk(tskid)); break; case 'm': syslog(LOG_INFO, "#rsm_tsk(%d)", tskno); syscall(rsm_tsk(tskid)); break; case 'M': syslog(LOG_INFO, "#frsm_tsk(%d)", tskno); syscall(frsm_tsk(tskid)); break; case 'x': syslog(LOG_INFO, "#ras_tex(%d, 0x0001)", tskno); syscall(ras_tex(tskid, 0x0001)); break; case 'X': syslog(LOG_INFO, "#ras_tex(%d, 0x0002)", tskno); syscall(ras_tex(tskid, 0x0002)); break; case 'r': syslog(LOG_INFO, "#rot_rdq(three priorities)"); rot_rdq(HIGH_PRIORITY); rot_rdq(MID_PRIORITY); rot_rdq(LOW_PRIORITY); break; case 'c': sta_cyc(CYCHDR1); break; case 'C': stp_cyc(CYCHDR1); break; #ifndef OMIT_VGET_TIM case 'V': syscall(vxget_tim(&utime1)); syscall(vxget_tim(&utime2)); syslog(LOG_NOTICE, "utime1 = %d, utime2 = %d", (UINT) utime1, (UINT) utime2); break; #endif /* OMIT_VGET_TIM */ case 'v': vmsk_log(LOG_UPTO(LOG_INFO), LOG_UPTO(LOG_EMERG)); break; case 'q': vmsk_log(LOG_UPTO(LOG_NOTICE), LOG_UPTO(LOG_EMERG)); break; default: break; } } while (c != '\003' && c != 'Q'); syslog(LOG_NOTICE, "Sample program ends."); kernel_exit(); }
/* * メインタスク */ void main_task(intptr_t exinf) { char_t c; ID tskid = TASK1; int_t tskno = 1; ER_UINT ercd; PRI tskpri; #ifndef TASK_LOOP volatile ulong_t i; SYSTIM stime1, stime2; #endif /* TASK_LOOP */ #ifdef TOPPERS_SUPPORT_GET_UTM SYSUTM utime1, utime2; #endif /* TOPPERS_SUPPORT_GET_UTM */ SVC_PERROR(syslog_msk_log(LOG_UPTO(LOG_INFO), LOG_UPTO(LOG_EMERG))); syslog(LOG_NOTICE, "Sample program starts (exinf = %d).", (int_t) exinf); /* * シリアルポートの初期化 * * システムログタスクと同じシリアルポートを使う場合など,シリアル * ポートがオープン済みの場合にはここでE_OBJエラーになるが,支障は * ない. */ ercd = serial_opn_por(TASK_PORTID); if (ercd < 0 && MERCD(ercd) != E_OBJ) { syslog(LOG_ERROR, "%s (%d) reported by `serial_opn_por'.", itron_strerror(ercd), SERCD(ercd)); } SVC_PERROR(serial_ctl_por(TASK_PORTID, (IOCTL_CRLF | IOCTL_FCSND | IOCTL_FCRCV))); /* * ループ回数の設定 * * TASK_LOOPがマクロ定義されている場合,測定せずに,TASK_LOOPに定 * 義された値を,タスク内でのループ回数とする. * * MEASURE_TWICEがマクロ定義されている場合,1回目の測定結果を捨て * て,2回目の測定結果を使う.1回目の測定は長めの時間が出るため. */ #ifdef TASK_LOOP task_loop = TASK_LOOP; #else /* TASK_LOOP */ #ifdef MEASURE_TWICE task_loop = LOOP_REF; SVC_PERROR(get_tim(&stime1)); for (i = 0; i < task_loop; i++); SVC_PERROR(get_tim(&stime2)); #endif /* MEASURE_TWICE */ task_loop = LOOP_REF; SVC_PERROR(get_tim(&stime1)); for (i = 0; i < task_loop; i++); SVC_PERROR(get_tim(&stime2)); task_loop = LOOP_REF * 400UL / (stime2 - stime1); #endif /* TASK_LOOP */ tex_loop = task_loop / 5; /* * タスクの起動 */ SVC_PERROR(act_tsk(TASK1)); SVC_PERROR(act_tsk(TASK2)); SVC_PERROR(act_tsk(TASK3)); /* * メインループ */ do { SVC_PERROR(serial_rea_dat(TASK_PORTID, &c, 1)); switch (c) { case 'e': case 's': case 'S': case 'd': case 'y': case 'Y': case 'z': case 'Z': message[tskno-1] = c; break; case '1': tskno = 1; tskid = TASK1; break; case '2': tskno = 2; tskid = TASK2; break; case '3': tskno = 3; tskid = TASK3; break; case 'a': syslog(LOG_INFO, "#act_tsk(%d)", tskno); SVC_PERROR(act_tsk(tskid)); break; case 'A': syslog(LOG_INFO, "#can_act(%d)", tskno); SVC_PERROR(ercd = can_act(tskid)); if (ercd >= 0) { syslog(LOG_NOTICE, "can_act(%d) returns %d", tskno, ercd); } break; case 't': syslog(LOG_INFO, "#ter_tsk(%d)", tskno); SVC_PERROR(ter_tsk(tskid)); break; case '>': syslog(LOG_INFO, "#chg_pri(%d, HIGH_PRIORITY)", tskno); SVC_PERROR(chg_pri(tskid, HIGH_PRIORITY)); break; case '=': syslog(LOG_INFO, "#chg_pri(%d, MID_PRIORITY)", tskno); SVC_PERROR(chg_pri(tskid, MID_PRIORITY)); break; case '<': syslog(LOG_INFO, "#chg_pri(%d, LOW_PRIORITY)", tskno); SVC_PERROR(chg_pri(tskid, LOW_PRIORITY)); break; case 'G': syslog(LOG_INFO, "#get_pri(%d, &tskpri)", tskno); SVC_PERROR(ercd = get_pri(tskid, &tskpri)); if (ercd >= 0) { syslog(LOG_NOTICE, "priority of task %d is %d", tskno, tskpri); } break; case 'w': syslog(LOG_INFO, "#wup_tsk(%d)", tskno); SVC_PERROR(wup_tsk(tskid)); break; case 'W': syslog(LOG_INFO, "#can_wup(%d)", tskno); SVC_PERROR(ercd = can_wup(tskid)); if (ercd >= 0) { syslog(LOG_NOTICE, "can_wup(%d) returns %d", tskno, ercd); } break; case 'l': syslog(LOG_INFO, "#rel_wai(%d)", tskno); SVC_PERROR(rel_wai(tskid)); break; case 'u': syslog(LOG_INFO, "#sus_tsk(%d)", tskno); SVC_PERROR(sus_tsk(tskid)); break; case 'm': syslog(LOG_INFO, "#rsm_tsk(%d)", tskno); SVC_PERROR(rsm_tsk(tskid)); break; case 'x': syslog(LOG_INFO, "#ras_tex(%d, 0x0001U)", tskno); SVC_PERROR(ras_tex(tskid, 0x0001U)); break; case 'X': syslog(LOG_INFO, "#ras_tex(%d, 0x0002U)", tskno); SVC_PERROR(ras_tex(tskid, 0x0002U)); break; case 'r': syslog(LOG_INFO, "#rot_rdq(three priorities)"); SVC_PERROR(rot_rdq(HIGH_PRIORITY)); SVC_PERROR(rot_rdq(MID_PRIORITY)); SVC_PERROR(rot_rdq(LOW_PRIORITY)); break; case 'c': syslog(LOG_INFO, "#sta_cyc(1)"); SVC_PERROR(sta_cyc(CYCHDR1)); break; case 'C': syslog(LOG_INFO, "#stp_cyc(1)"); SVC_PERROR(stp_cyc(CYCHDR1)); break; case 'b': syslog(LOG_INFO, "#sta_alm(1, 5000)"); SVC_PERROR(sta_alm(ALMHDR1, 5000)); break; case 'B': syslog(LOG_INFO, "#stp_alm(1)"); SVC_PERROR(stp_alm(ALMHDR1)); break; case 'V': #ifdef TOPPERS_SUPPORT_GET_UTM SVC_PERROR(get_utm(&utime1)); SVC_PERROR(get_utm(&utime2)); syslog(LOG_NOTICE, "utime1 = %ld, utime2 = %ld", (ulong_t) utime1, (ulong_t) utime2); #else /* TOPPERS_SUPPORT_GET_UTM */ syslog(LOG_NOTICE, "get_utm is not supported."); #endif /* TOPPERS_SUPPORT_GET_UTM */ break; case 'v': SVC_PERROR(syslog_msk_log(LOG_UPTO(LOG_INFO), LOG_UPTO(LOG_EMERG))); break; case 'q': SVC_PERROR(syslog_msk_log(LOG_UPTO(LOG_NOTICE), LOG_UPTO(LOG_EMERG))); break; #ifdef BIT_KERNEL case ' ': SVC_PERROR(loc_cpu()); { extern ER bit_kernel(void); SVC_PERROR(ercd = bit_kernel()); if (ercd >= 0) { syslog(LOG_NOTICE, "bit_kernel passed."); } } SVC_PERROR(unl_cpu()); break; #endif /* BIT_KERNEL */ default: break; } } while (c != '\003' && c != 'Q'); syslog(LOG_NOTICE, "Sample program ends."); SVC_PERROR(ext_ker()); assert(0); }