/* * 並行実行されるタスク */ void task(VP_INT exinf) { _toppers_cxxrt_reset_specific(); volatile UW i; INT n = 0; INT tskno = (INT) exinf; char *graph[] = { "|", " +", " *" }; char c; ena_tex(); while (1) { syslog(LOG_NOTICE, "task%d is running (%03d). %s", tskno, ++n, graph[tskno-1]); for (i = 0; i < task_loop; i++); c = message[tskno-1]; message[tskno-1] = 0; switch (c) { case 'e': syslog(LOG_INFO, "#%d#ext_tsk()", tskno); ext_tsk(); case 's': syslog(LOG_INFO, "#%d#slp_tsk()", tskno); syscall(slp_tsk()); break; case 'S': syslog(LOG_INFO, "#%d#tslp_tsk(10000)", tskno); syscall(tslp_tsk(10000)); break; case 'd': syslog(LOG_INFO, "#%d#dly_tsk(10000)", tskno); syscall(dly_tsk(10000)); break; case 'y': syslog(LOG_INFO, "#%d#dis_tex()", tskno); syscall(dis_tex()); break; case 'Y': syslog(LOG_INFO, "#%d#ena_tex()", tskno); syscall(ena_tex()); break; #ifdef CPUEXC1 case 'z': syslog(LOG_NOTICE, "#%d#raise CPU exception", tskno); RAISE_CPU_EXCEPTION; break; case 'Z': loc_cpu(); syslog(LOG_NOTICE, "#%d#raise CPU exception", tskno); RAISE_CPU_EXCEPTION; unl_cpu(); break; #endif /* CPUEXC1 */ default: break; } } }
/* * 並行実行されるタスク */ void task(intptr_t exinf) { volatile ulong_t i; int_t n = 0; int_t tskno = (int_t) exinf; const char *graph[] = { "|", " +", " *" }; char c; SVC_PERROR(ena_tex()); while (true) { syslog(LOG_NOTICE, "task%d is running (%03d). %s", tskno, ++n, graph[tskno-1]); for (i = 0; i < task_loop; i++); c = message[tskno-1]; message[tskno-1] = 0; switch (c) { case 'e': syslog(LOG_INFO, "#%d#ext_tsk()", tskno); SVC_PERROR(ext_tsk()); assert(0); case 's': syslog(LOG_INFO, "#%d#slp_tsk()", tskno); SVC_PERROR(slp_tsk()); break; case 'S': syslog(LOG_INFO, "#%d#tslp_tsk(10000)", tskno); SVC_PERROR(tslp_tsk(10000)); break; case 'd': syslog(LOG_INFO, "#%d#dly_tsk(10000)", tskno); SVC_PERROR(dly_tsk(10000)); break; case 'y': syslog(LOG_INFO, "#%d#dis_tex()", tskno); SVC_PERROR(dis_tex()); break; case 'Y': syslog(LOG_INFO, "#%d#ena_tex()", tskno); SVC_PERROR(ena_tex()); break; #ifdef CPUEXC1 case 'z': syslog(LOG_NOTICE, "#%d#raise CPU exception", tskno); RAISE_CPU_EXCEPTION; break; case 'Z': SVC_PERROR(loc_cpu()); syslog(LOG_NOTICE, "#%d#raise CPU exception", tskno); RAISE_CPU_EXCEPTION; SVC_PERROR(unl_cpu()); break; #endif /* CPUEXC1 */ default: break; } } }
/* * 並行実行されるタスク */ void task(VP_INT exinf) { volatile UW i; INT n = 0; INT tskno = (INT) exinf; const char *graph[] = { "|", " +", " *" }; char c; ena_tex(); while (1) { syslog(LOG_NOTICE, "task%d is running (%03d). %s", tskno, ++n, graph[tskno-1]); for (i = 0; i < task_loop; i++); c = message[tskno-1]; message[tskno-1] = 0; switch (c) { case 'e': syslog(LOG_INFO, "#%d#ext_tsk()", tskno); ext_tsk(); case 's': syslog(LOG_INFO, "#%d#slp_tsk()", tskno); syscall(slp_tsk()); break; case 'S': syslog(LOG_INFO, "#%d#tslp_tsk(10000)", tskno); syscall(tslp_tsk(10000)); break; case 'd': syslog(LOG_INFO, "#%d#dly_tsk(10000)", tskno); syscall(dly_tsk(10000)); break; case 'y': syslog(LOG_INFO, "#%d#dis_tex()", tskno); syscall(dis_tex()); break; case 'Y': syslog(LOG_INFO, "#%d#ena_tex()", tskno); syscall(ena_tex()); break; #ifdef CPUEXC1 case 'z': syslog(LOG_NOTICE, "#%d#raise CPU exception", tskno); RAISE_CPU_EXCEPTION; break; #endif /* CPUEXC1 */ case 'Z': syslog(LOG_NOTICE, "Sample program ends with exception."); kernel_exit(); break; default: break; } } }
void task3(intptr_t exinf) { ER ercd; check_point(4); ercd = ena_tex(); check_ercd(ercd, E_OK); /* * テスト項目(C)のテスト */ tex_start_count = 0U; ercd = ras_tex(TASK3, 0x0001); check_ercd(ercd, E_OK); check_assert(tex_start_count == UTASK_TEX_COUNT); check_point(5); /* * テスト項目(D)のテスト */ tex_start_count = 0U; ercd = ras_tex(TASK3, 0x0002); check_ercd(ercd, E_OK); check_assert(tex_start_count == UTASK_TEX_COUNT); check_finish(6); }
void task1(intptr_t exinf) { ER ercd; switch (++task1_count) { case 1: check_point(1); check_state(false, false, TIPM_ENAALL, false, false, true); ercd = chg_ipm(TMAX_INTPRI); check_ercd(ercd, E_OK); ercd = ena_tex(); check_ercd(ercd, E_OK); check_point(2); check_state(false, false, TMAX_INTPRI, false, true, false); RAISE_CPU_EXCEPTION; check_point(0); break; case 2: check_point(8); check_state(false, false, TIPM_ENAALL, false, false, true); check_finish(9); break; default: check_point(0); break; } }
void task3(intptr_t exinf) { ER ercd; /* * check init state */ check_point(24); check_state(false, false, TIPM_ENAALL, false, false, true); /* * enable task exception */ check_point(25); ercd = ena_tex(); check_ercd(ercd, E_OBJ); check_state(false, false, TIPM_ENAALL, false, false, true); /* * disable task exception */ check_point(26); ercd = dis_tex(); check_ercd(ercd, E_OBJ); check_state(false, false, TIPM_ENAALL, false, false, true); /* * task exits */ ercd = ext_tsk(); check_point(0); }
void tex_task1(TEXPTN texptn, intptr_t exinf) { ER ercd; switch (texptn) { case 0x0001: check_point(12); check_state(false, false, TIPM_ENAALL, true, true, true); /* * ディスパッチ許可,割込み優先度マスク変更,タスク例外処理許可 */ check_point(13); ercd = ena_dsp(); check_ercd(ercd, E_OK); ercd = chg_ipm(TMIN_INTPRI); check_ercd(ercd, E_OK); ercd = ena_tex(); check_ercd(ercd, E_OK); check_state(false, false, TMIN_INTPRI, false, true, false); break; default: check_point(0); break; } }
void task1(intptr_t exinf) { ER ercd; SIL_PRE_LOC; check_point(1); check_state(false, false, TIPM_ENAALL, false, false, true); ercd = dis_dsp(); check_ercd(ercd, E_OK); ercd = ena_tex(); check_ercd(ercd, E_OK); check_point(2); check_state(false, false, TIPM_ENAALL, true, true, false); SIL_LOC_INT(); RAISE_CPU_EXCEPTION; check_point(5); SIL_UNL_INT(); check_point(6); check_state(false, false, TIPM_ENAALL, true, true, false); check_finish(7); }
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 task1(intptr_t exinf) { ER ercd; test_start(__FILE__); check_point(1); check_state(false, false, TIPM_ENAALL, false, false, true); ercd = dis_dsp(); check_ercd(ercd, E_OK); ercd = ena_tex(); check_ercd(ercd, E_OK); ercd = loc_cpu(); check_ercd(ercd, E_OK); check_point(2); check_state(false, true, TIPM_ENAALL, true, true, false); RAISE_CPU_EXCEPTION; check_point(5); check_state(false, true, TIPM_ENAALL, true, true, false); check_finish(6); }
void task1(intptr_t exinf) { ER ercd; switch (++task1_count) { case 1: test_start(__FILE__); check_point(1); check_state(false, false, TIPM_ENAALL, false, false, true); ercd = dis_dsp(); check_ercd(ercd, E_OK); ercd = ena_tex(); check_ercd(ercd, E_OK); check_point(2); check_state(false, false, TIPM_ENAALL, true, true, false); RAISE_CPU_EXCEPTION; check_point(0); break; case 2: check_point(8); check_state(false, false, TIPM_ENAALL, false, false, true); check_finish(9); break; default: check_point(0); break; } }
void task3(intptr_t exinf) { ER ercd; /* * 初期状態のチェック */ check_point(23); check_state(false, false, TIPM_ENAALL, false, false, true); /* * タスク例外処理の許可 */ check_point(24); ercd = ena_tex(); check_ercd(ercd, E_OBJ); check_state(false, false, TIPM_ENAALL, false, false, true); /* * タスク例外処理の禁止 */ check_point(25); ercd = dis_tex(); check_ercd(ercd, E_OBJ); check_state(false, false, TIPM_ENAALL, false, false, true); /* * タスク終了 */ ercd = ext_tsk(); check_point(0); }
void task3(intptr_t exinf) { ER_UINT ercd; check_point(24); check_state(false, false, TIPM_ENAALL, false, false, true); check_point(25); ercd = ena_tex(); check_ercd(ercd, E_OBJ); check_state(false, false, TIPM_ENAALL, false, false, true); check_point(26); ercd = dis_tex(); check_ercd(ercd, E_OBJ); check_state(false, false, TIPM_ENAALL, false, false, true); ercd = ext_tsk(); check_ercd(ercd, E_OK); check_point(0); }
void task1(intptr_t exinf) { ER ercd; test_start(__FILE__); check_point(1); check_state(false, false, TIPM_ENAALL, false, false, true); ercd = dis_dsp(); check_ercd(ercd, E_OK); ercd = ena_tex(); check_ercd(ercd, E_OK); check_point(2); check_state(false, false, TIPM_ENAALL, true, true, false); ercd = sta_alm(ALM1, 1U); check_ercd(ercd, E_OK); while (!(alm1_flag)); check_point(7); check_state(false, false, TIPM_ENAALL, true, true, false); check_finish(8); }
void task1(intptr_t exinf) { ER ercd; if (TMAX_INTPRI == TMIN_INTPRI) { syslog_0(LOG_NOTICE, "This test program is not necessary."); ext_ker(); } check_point(1); check_state(false, false, TIPM_ENAALL, false, false, true); ercd = chg_ipm(TMAX_INTPRI); check_ercd(ercd, E_OK); ercd = ena_tex(); check_ercd(ercd, E_OK); check_point(2); check_state(false, false, TMAX_INTPRI, false, true, false); RAISE_CPU_EXCEPTION; check_point(5); check_state(false, false, TMAX_INTPRI, false, true, false); check_finish(6); }
void tex_task3(TEXPTN texptn, intptr_t exinf) { ER ercd; /* * システムスタック領域に余裕があることを,拡張サービスコールを使っ * て確認する. * * ユーザタスクにおいて,システムスタック領域が減ることはないはず * だが,カーネルのバグにより増減する可能性はあるため,念のため確 * 認している.ただし,システムスタック領域が増えてしまうバグは, * これでは検出できない(不可解な動作をする). */ ercd = cal_svc(TFN_EXTSVC, 0, 0, 0, 0, 0); check_ercd(ercd, E_OK); #ifdef DEBUG_LOG if (tex_start_count % 50 == 0) { syslog_2(LOG_NOTICE, "%d: sp = %x", tex_start_count, &ercd); } #endif /* DEBUG_LOG */ tex_start_count += 1; if (tex_start_count < UTASK_TEX_COUNT) { switch (texptn) { case 0x0001: ercd = ras_tex(TASK3, 0x0001); check_ercd(ercd, E_OK); break; case 0x0002: ercd = dis_dsp(); check_ercd(ercd, E_OK); ercd = ena_tex(); check_ercd(ercd, E_OK); ercd = act_tsk(TASK4); check_ercd(ercd, E_OK); break; } } }
void task1(intptr_t exinf) { ER ercd; test_start(__FILE__); check_point(1); ercd = ena_tex(); check_ercd(ercd, E_OK); /* * テスト項目(A)のテスト */ tex_start_count = 0U; ercd = ras_tex(TASK1, 0x0001); check_ercd(ercd, E_OK); check_assert(tex_start_count == STASK_TEX_COUNT); check_point(2); /* * テスト項目(B)のテスト */ tex_start_count = 0U; ercd = ras_tex(TASK1, 0x0002); check_ercd(ercd, E_OK); check_assert(tex_start_count == STASK_TEX_COUNT); check_point(3); /* * この後のテストはTASK3で実施 */ ercd = act_tsk(TASK3); check_ercd(ercd, E_OK); ercd = ext_tsk(); check_point(0); }
void task1(intptr_t exinf) { ER ercd; check_point(1); check_state(false, false, TIPM_ENAALL, false, false, true); ercd = chg_ipm(TMIN_INTPRI); check_ercd(ercd, E_OK); ercd = ena_tex(); check_ercd(ercd, E_OK); check_point(2); check_state(false, false, TMIN_INTPRI, false, true, false); RAISE_CPU_EXCEPTION; check_point(5); check_state(false, false, TMIN_INTPRI, false, true, false); check_finish(6); }
void tex_task1(TEXPTN texptn, intptr_t exinf) { ER ercd; /* * スタック領域に余裕があることを,拡張サービスコールを使って確認 * する. */ ercd = cal_svc(TFN_EXTSVC, 0, 0, 0, 0, 0); check_ercd(ercd, E_OK); #ifdef DEBUG_LOG if (tex_start_count % 50 == 0) { syslog_2(LOG_NOTICE, "%d: sp = %x", tex_start_count, &ercd); } #endif /* DEBUG_LOG */ tex_start_count += 1; if (tex_start_count < STASK_TEX_COUNT) { switch (texptn) { case 0x0001: ercd = ras_tex(TASK1, 0x0001); check_ercd(ercd, E_OK); break; case 0x0002: ercd = dis_dsp(); check_ercd(ercd, E_OK); ercd = ena_tex(); check_ercd(ercd, E_OK); ercd = act_tsk(TASK2); check_ercd(ercd, E_OK); break; } } }
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 task1(intptr_t exinf) { ER ercd; switch (++task1_count) { case 1: if (TMAX_INTPRI == TMIN_INTPRI) { syslog_0(LOG_NOTICE, "This test program is not necessary."); ext_ker(); } check_point(1); check_state(false, false, TIPM_ENAALL, false, false, true); ercd = chg_ipm(TMAX_INTPRI); check_ercd(ercd, E_OK); ercd = ena_tex(); check_ercd(ercd, E_OK); check_point(2); check_state(false, false, TMAX_INTPRI, false, true, false); RAISE_CPU_EXCEPTION; check_point(0); break; case 2: check_point(8); check_state(false, false, TIPM_ENAALL, false, false, true); check_finish(9); break; default: check_point(0); break; } }
void task1(intptr_t exinf) { ER ercd; test_start(__FILE__); /* * 初期状態のチェック */ check_point(1); check_state(false, false, TIPM_ENAALL, false, false, true); /* * CPUロック状態のチェック */ check_point(2); ercd = loc_cpu(); check_ercd(ercd, E_OK); check_state(false, true, TIPM_ENAALL, false, true, true); /* * 割込み優先度マスク変更のチェック */ ercd = chg_ipm(TMAX_INTPRI); check_ercd(ercd, E_CTX); check_state(false, true, TIPM_ENAALL, false, true, true); /* * CPUロック解除のチェック */ check_point(3); ercd = unl_cpu(); check_ercd(ercd, E_OK); check_state(false, false, TIPM_ENAALL, false, false, true); /* * 割込み優先度マスク変更のチェック */ check_point(4); ercd = chg_ipm(TMAX_INTPRI); check_ercd(ercd, E_OK); check_state(false, false, TMAX_INTPRI, false, true, true); /* * ディスパッチ禁止のチェック */ check_point(5); ercd = dis_dsp(); check_ercd(ercd, E_OK); check_state(false, false, TMAX_INTPRI, true, true, true); /* * タスク例外処理許可のチェック */ check_point(6); ercd = ena_tex(); check_ercd(ercd, E_OK); check_state(false, false, TMAX_INTPRI, true, true, false); /* * 割込み優先度マスク全解除のチェック */ check_point(7); ercd = chg_ipm(TIPM_ENAALL); check_ercd(ercd, E_OK); check_state(false, false, TIPM_ENAALL, true, true, false); /* * ディスパッチ許可のチェック */ check_point(8); ercd = ena_dsp(); check_ercd(ercd, E_OK); check_state(false, false, TIPM_ENAALL, false, false, false); /* * タスク例外処理禁止のチェック */ check_point(9); ercd = dis_tex(); check_ercd(ercd, E_OK); check_state(false, false, TIPM_ENAALL, false, false, true); /* * ディスパッチ禁止,タスク例外処理許可 */ check_point(10); ercd = dis_dsp(); check_ercd(ercd, E_OK); ercd = ena_tex(); check_ercd(ercd, E_OK); check_state(false, false, TIPM_ENAALL, true, true, false); /* * タスク例外処理を要求 */ check_point(11); ercd = ras_tex(TSK_SELF, 0x0001); /* ここでタスク例外処理ルーチンが動作する */ check_ercd(ercd, E_OK); /* * タスク例外処理からのリターンにより元の状態に戻っていることを * チェック */ check_point(14); check_state(false, false, TIPM_ENAALL, true, true, false); /* * CPUロック状態に */ check_point(15); ercd = loc_cpu(); check_ercd(ercd, E_OK); /* * そのままタスク終了 */ check_point(16); }
void tex_task1(TEXPTN texptn, intptr_t exinf) { ER ercd; switch (texptn) { case 0x0001: check_point(4); check_state(false, false, TIPM_ENAALL, false, false, true); /* * ディスパッチ禁止,割込み優先度マスク変更,タスク例外処理許可 */ check_point(5); ercd = dis_dsp(); check_ercd(ercd, E_OK); ercd = chg_ipm(TMAX_INTPRI); check_ercd(ercd, E_OK); ercd = ena_tex(); check_ercd(ercd, E_OK); ercd = loc_cpu(); check_ercd(ercd, E_OK); check_state(false, true, TMAX_INTPRI, true, true, false); break; case 0x0002: check_point(10); check_state(false, false, TMIN_INTPRI, true, true, true); /* * タスク例外処理を要求 */ check_point(11); ercd = ras_tex(TSK_SELF, 0x0001); check_ercd(ercd, E_OK); ercd = ras_tex(TSK_SELF, 0x0002); check_ercd(ercd, E_OK); /* * ディスパッチ許可,割込み優先度マスク変更,CPUロック */ check_point(12); ercd = ena_dsp(); check_ercd(ercd, E_OK); ercd = chg_ipm(TMAX_INTPRI); check_ercd(ercd, E_OK); ercd = loc_cpu(); check_ercd(ercd, E_OK); check_state(false, true, TMAX_INTPRI, false, true, true); break; case 0x0003: check_point(13); check_state(false, false, TMIN_INTPRI, true, true, true); /* * ディスパッチ許可,割込み優先度マスク変更,タスク例外許可 */ check_point(14); ercd = ena_dsp(); check_ercd(ercd, E_OK); ercd = chg_ipm(TMAX_INTPRI); check_ercd(ercd, E_OK); ercd = ena_tex(); check_ercd(ercd, E_OK); check_state(false, false, TMAX_INTPRI, false, true, false); /* * タスク例外処理を要求 */ check_point(15); ercd = ras_tex(TSK_SELF, 0x0004); /* ここでタスク例外処理ルーチンが動作する */ check_ercd(ercd, E_OK); /* * タスク例外処理からのリターンにより元の状態に戻っていること * をチェック */ check_point(18); check_state(false, false, TMAX_INTPRI, false, true, false); break; case 0x0004: check_point(16); check_state(false, false, TMAX_INTPRI, false, true, true); /* * ディスパッチ禁止,割込み優先度マスク変更,CPUロック */ check_point(17); ercd = dis_dsp(); check_ercd(ercd, E_OK); ercd = chg_ipm(TIPM_ENAALL); check_ercd(ercd, E_OK); ercd = loc_cpu(); check_ercd(ercd, E_OK); check_state(false, true, TIPM_ENAALL, true, true, true); break; default: check_point(0); break; } }
void tex_task1(TEXPTN texptn, intptr_t exinf) { ER_UINT ercd; switch (++tex_task1_count) { case 1: check_point(4); check_assert(texptn == 0x0001); check_state(false, false, TIPM_ENAALL, false, false, true); check_point(5); ercd = dis_dsp(); check_ercd(ercd, E_OK); ercd = chg_ipm(TMAX_INTPRI); check_ercd(ercd, E_OK); ercd = ena_tex(); check_ercd(ercd, E_OK); ercd = loc_cpu(); check_ercd(ercd, E_OK); check_state(false, true, TMAX_INTPRI, true, true, false); return; check_point(0); case 2: check_point(10); check_assert(texptn == 0x0002); check_state(false, false, TIPM_ENAALL, true, true, true); check_point(11); ercd = ras_tex(TASK1, 0x0001); check_ercd(ercd, E_OK); ercd = ras_tex(TASK1, 0x0002); check_ercd(ercd, E_OK); check_point(12); ercd = ena_dsp(); check_ercd(ercd, E_OK); ercd = chg_ipm(TMAX_INTPRI); check_ercd(ercd, E_OK); ercd = loc_cpu(); check_ercd(ercd, E_OK); check_state(false, true, TMAX_INTPRI, false, true, true); return; check_point(0); case 3: check_point(13); check_assert(texptn == 0x0003); check_state(false, false, TIPM_ENAALL, true, true, true); check_point(14); ercd = ena_dsp(); check_ercd(ercd, E_OK); ercd = chg_ipm(TMAX_INTPRI); check_ercd(ercd, E_OK); ercd = ena_tex(); check_ercd(ercd, E_OK); check_state(false, false, TMAX_INTPRI, false, true, false); ercd = chg_ipm(TIPM_ENAALL); check_ercd(ercd, E_OK); ercd = chg_ipm(TMAX_INTPRI); check_ercd(ercd, E_OK); check_point(15); ercd = ras_tex(TSK_SELF, 0x0004); check_ercd(ercd, E_OK); ercd = chg_ipm(TMAX_INTPRI); check_ercd(ercd, E_OK); ercd = dis_tex(); check_ercd(ercd, E_OK); ercd = chg_ipm(TIPM_ENAALL); check_ercd(ercd, E_OK); ercd = chg_ipm(TMAX_INTPRI); check_ercd(ercd, E_OK); ercd = ena_tex(); check_ercd(ercd, E_OK); check_point(16); ercd = chg_ipm(TIPM_ENAALL); check_ercd(ercd, E_OK); check_point(19); check_state(false, false, TIPM_ENAALL, false, false, false); return; check_point(0); case 4: check_point(17); check_assert(texptn == 0x0004); check_state(false, false, TIPM_ENAALL, false, false, true); check_point(18); ercd = dis_dsp(); check_ercd(ercd, E_OK); ercd = chg_ipm(TMAX_INTPRI); check_ercd(ercd, E_OK); ercd = loc_cpu(); check_ercd(ercd, E_OK); check_state(false, true, TMAX_INTPRI, true, true, true); return; check_point(0); default: check_point(0); } 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 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 tex_task1(TEXPTN texptn, intptr_t exinf) { ER ercd; switch (texptn) { case 0x0001: check_point(4); check_state(false, false, TIPM_ENAALL, false, false, true); /* * dispatch disabled, ipm changed, task exception enabled */ check_point(5); ercd = dis_dsp(); check_ercd(ercd, E_OK); ercd = chg_ipm(TMAX_INTPRI); check_ercd(ercd, E_OK); ercd = ena_tex(); check_ercd(ercd, E_OK); ercd = loc_cpu(); check_ercd(ercd, E_OK); check_state(false, true, TMAX_INTPRI, true, true, false); break; case 0x0002: check_point(10); check_state(false, false, TIPM_ENAALL, true, true, true); /* * raise task exception request */ check_point(11); ercd = ras_tex(TSK_SELF, 0x0001); check_ercd(ercd, E_OK); ercd = ras_tex(TSK_SELF, 0x0002); check_ercd(ercd, E_OK); /* * dispatch enabled, ipm changed, cpu locked */ check_point(12); ercd = ena_dsp(); check_ercd(ercd, E_OK); ercd = chg_ipm(TMAX_INTPRI); check_ercd(ercd, E_OK); ercd = loc_cpu(); check_ercd(ercd, E_OK); check_state(false, true, TMAX_INTPRI, false, true, true); break; case 0x0003: check_point(13); check_state(false, false, TIPM_ENAALL, true, true, true); /* * dispatch enabled, ipm changed, task exception enabled */ check_point(14); ercd = ena_dsp(); check_ercd(ercd, E_OK); ercd = chg_ipm(TMAX_INTPRI); check_ercd(ercd, E_OK); ercd = ena_tex(); check_ercd(ercd, E_OK); check_state(false, false, TMAX_INTPRI, false, true, false); ercd = chg_ipm(TIPM_ENAALL); check_ercd(ercd, E_OK); ercd = chg_ipm(TMAX_INTPRI); check_ercd(ercd, E_OK); /* * raise task exception request */ check_point(15); ercd = ras_tex(TSK_SELF, 0x0004); ercd = dis_tex(); check_ercd(ercd, E_OK); ercd = chg_ipm(TIPM_ENAALL); check_ercd(ercd, E_OK); ercd = chg_ipm(TMAX_INTPRI); check_ercd(ercd, E_OK); ercd = ena_tex(); check_ercd(ercd, E_OK); check_point(16); ercd = chg_ipm(TIPM_ENAALL); /* task exception routine runs here */ check_ercd(ercd, E_OK); /* * check the state when task exception routine returns */ check_point(19); check_state(false, false, TIPM_ENAALL, false, false, false); break; case 0x0004: check_point(17); check_state(false, false, TIPM_ENAALL, false, false, true); /* * dispatch disabled, ipm changed, cpu locked */ check_point(18); ercd = dis_dsp(); check_ercd(ercd, E_OK); ercd = chg_ipm(TMAX_INTPRI); check_ercd(ercd, E_OK); ercd = loc_cpu(); check_ercd(ercd, E_OK); check_state(false, true, TMAX_INTPRI, true, true, true); break; default: check_point(0); break; } }
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); }
/** * Application task wrapper * \param exinf Pointer of actual T_CTSK */ static void app_tsk_wrapper(intptr_t exinf) { const T_CTSK *pk_ctsk = (const T_CTSK *)exinf; SVC_PERROR(ena_tex()); pk_ctsk->task(pk_ctsk->exinf); }