SYSCALL void ext_tsk(void) { LOG_EXT_TSK_ENTER(); #ifdef ACTIVATED_STACK_SIZE /* * create_context と activate_context で,使用中のスタック領 * 域を破壊しないように,スタック上にダミー領域を確保する. */ (void) alloca(ACTIVATED_STACK_SIZE); #endif /* ACTIVATED_STACK_SIZE */ if (sense_context()) { /* * 非タスクコンテキストから ext_tsk が呼ばれた場合, * システムログにエラーを記録し,そのまま実行を続ける * が, 動作は保証されない. */ syslog_0(LOG_EMERG, "ext_tsk is called from non-task contexts."); } if (sense_lock()) { /* * CPUロック状態で ext_tsk が呼ばれた場合は,CPUロック * を解除してからタスクを終了する.実装上は,サービス * コール内でのCPUロックを省略すればよいだけ. */ syslog_0(LOG_WARNING, "ext_tsk is called from CPU locked state."); } else { if (sense_context()) { i_lock_cpu(); } else { t_lock_cpu(); } } if (!(enadsp)) { /* * ディスパッチ禁止状態で ext_tsk が呼ばれた場合は, * ディスパッチ許可状態にしてからタスクを終了する. */ syslog_0(LOG_WARNING, "ext_tsk is called from dispatch disabled state."); enadsp = TRUE; } exit_task(); }
/* * メインタスク(中優先度) */ void main_task(intptr_t exinf) { uint_t i; syslog_0(LOG_NOTICE, "Performance evaluation program (4)"); init_hist(1, MAX_TIME, histarea1); init_hist(2, MAX_TIME, histarea2); init_hist(3, MAX_TIME, histarea3); logtask_flush(0U); sus_tsk(LOGTASK); /* システムログタスクの動作を止める */ /* * タスク切換えを起こさないact_tskの処理時間の測定 */ for (i = 0; i < NO_MEASURE; i++) { begin_measure(1); act_tsk(TASK3); end_measure(1); slp_tsk(); } /* * タスク切換えを起こすact_tskの処理時間の測定 */ for (i = 0; i < NO_MEASURE; i++) { begin_measure(2); act_tsk(TASK1); } /* * タスク切換えを起こすiact_tskの処理時間の測定(測定回数は10分の1) */ task2_count = 0; sta_cyc(CYC1); while (task2_count < NO_MEASURE / 10) ; stp_cyc(CYC1); rsm_tsk(LOGTASK); /* システムログタスクの動作を再開する */ syslog_0(LOG_NOTICE, "Execution times of act_tsk without task switch"); print_hist(1); syslog_0(LOG_NOTICE, "Execution times of act_tsk with task switch"); print_hist(2); syslog_0(LOG_NOTICE, "Execution times of iact_tsk with task switch"); print_hist(3); ext_ker(); }
/* * システムログタスクの本体(受け口関数) */ void eLogTaskBody_main(void) { SYSLOG syslog; uint_t lost; ER_UINT rercd; cSerialPort_open(); syslog_0(LOG_NOTICE, "System logging task is started."); for (;;) { lost = 0U; while ((rercd = cSysLog_read(&syslog)) >= 0) { lost += (uint_t) rercd; if (lost > 0U) { syslog_lostmsg(lost, logtask_putc); lost = 0U; } syslog_print(&syslog, logtask_putc); logtask_putc('\n'); } if (lost > 0U) { syslog_lostmsg(lost, logtask_putc); } dly_tsk(ATTR_interval); } }
/* * 完了チェックポイント */ void check_finish(uint_t count) { check_point(count); syslog_0(LOG_NOTICE, "All check points passed."); test_finish(); }
/* * 計測タスク2(高優先度) */ void task2(intptr_t exinf) { end_measure(3); syslog_0(LOG_NOTICE, "end_measure(3)"); task2_count++; ext_tsk(); }
/* * メインタスク(低優先度) */ void main_task(intptr_t exinf) { syslog_0(LOG_NOTICE, "Performance evaluation program (1)"); init_hist(1); init_hist(2); act_tsk(TASK1); act_tsk(TASK2); syslog_0(LOG_NOTICE, "Execution times of wup_tsk -> slp_tsk"); print_hist(1); syslog_0(LOG_NOTICE, "Execution times of slp_tsk -> wup_tsk"); print_hist(2); check_finish(0); }
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 logtask_main(intptr_t exinf) { SYSLOG syslog; uint_t lost; ER_UINT rercd; ID my_logtask_portid; my_logtask_portid = (ID) exinf; set_my_logtask_portid(my_logtask_portid); serial_opn_por(my_logtask_portid); syslog_msk_log(LOG_UPTO(LOG_NOTICE), LOG_UPTO(LOG_EMERG)); syslog_1(LOG_NOTICE, "System logging task is started on port %d.", my_logtask_portid); for (;;) { lost = 0U; while ((rercd = syslog_rea_log(&syslog)) >= 0) { lost += (uint_t) rercd; if (syslog.logtype >= LOG_TYPE_COMMENT) { if (lost > 0U) { syslog_lostmsg(lost, logtask_putc); lost = 0U; } syslog_print(&syslog, logtask_putc); logtask_putc('\n'); } } if (lost > 0U) { syslog_lostmsg(lost, logtask_putc); } if(E_OK != dly_tsk(LOGTASK_INTERVAL)){ syslog_0(LOG_NOTICE, "syslog : Error dly_tsk() !"); } } }
/* * main task (low priority) */ void main_task(intptr_t exinf) { syslog_0(LOG_NOTICE, "Performance evaluation program (1)"); init_hist(1, MAX_TIME, histarea1); init_hist(2, MAX_TIME, histarea2); syslog_flush(); act_tsk(TASK1); act_tsk(TASK2); syslog_0(LOG_NOTICE, "Execution times of wup_tsk -> slp_tsk"); print_hist(1); syslog_0(LOG_NOTICE, "Execution times of slp_tsk -> wup_tsk"); print_hist(2); test_finish(); }
/* * main task */ void main_task(intptr_t exinf) { uint_t i; syslog_0(LOG_NOTICE, "Performance evaluation program (0)"); init_hist(1, MAX_TIME, histarea1); syslog_flush(); for (i = 0; i < NO_MEASURE; i++) { begin_measure(1); end_measure(1); } syslog_0(LOG_NOTICE, "Measurement overhead"); print_hist(1); test_finish(); }
/* * メインタスク(低優先度) */ void main_task(intptr_t exinf) { syslog_0(LOG_NOTICE, "Performance evaluation program (1)"); init_hist(1, MAX_TIME, histarea1); init_hist(2, MAX_TIME, histarea2); logtask_flush(0U); sus_tsk(LOGTASK); /* システムログタスクの動作を止める */ act_tsk(TASK1); act_tsk(TASK2); rsm_tsk(LOGTASK); /* システムログタスクの動作を再開する */ syslog_0(LOG_NOTICE, "Execution times of wup_tsk -> slp_tsk"); print_hist(1); syslog_0(LOG_NOTICE, "Execution times of slp_tsk -> wup_tsk"); print_hist(2); ext_ker(); }
Inline ER check_chg_ipm(PRI intpri) { ER ercd; ercd = chg_ipm(intpri); if (ercd == E_PAR) { syslog_0(LOG_NOTICE, "This test program is not necessary."); ext_ker(); } return(ercd); }
/* * main task (high priority) */ void main_task(intptr_t exinf) { syslog_0(LOG_NOTICE, "Performance evaluation program (3)"); syslog_flush(); perf_eval(0); perf_eval(1); perf_eval(2); perf_eval(3); perf_eval(4); perf_eval(5); perf_eval(10); perf_eval(20); test_finish(); }
/* * メインタスク(高優先度) */ void main_task(intptr_t exinf) { syslog_0(LOG_NOTICE, "Performance evaluation program (3)"); logtask_flush(0U); perf_eval(0); perf_eval(1); perf_eval(2); perf_eval(3); perf_eval(4); perf_eval(5); perf_eval(10); perf_eval(20); ext_ker(); }
/* * メインタスク(低優先度) */ void main_task(intptr_t exinf) { syslog_0(LOG_NOTICE, "Performance evaluation program (2)"); perf_eval(0); perf_eval(10); perf_eval(20); perf_eval(30); perf_eval(40); perf_eval(50); perf_eval(100); perf_eval(200); perf_eval(300); check_finish(0); }
void cpuexc_handler(void *p_excinf) { ER ercd; check_point(3); check_state_i(true, false, false, true, false); if (xsns_xpn(p_excinf) == true) { syslog_0(LOG_WARNING, "xsns_xpn returns true."); } check_assert(xsns_dpn(p_excinf) == true); check_point(4); ercd = iras_tex(TASK1, 1U); check_ercd(ercd, E_OK); ercd = iloc_cpu(); check_ercd(ercd, E_OK); }
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 default_exc_handler(void){ syslog_0(LOG_EMERG, "Unregistered Exception occurs."); ext_ker(); }
/* * 周期ハンドラ */ void cyclic_handler(intptr_t exinf) { syslog_0(LOG_NOTICE, "begin_measure(3)"); begin_measure(3); iact_tsk(TASK2); }
/* * 未定義の割込みが入った場合の処理 */ void default_int_handler(void){ syslog_0(LOG_EMERG, "Unregistered Interrupt occurs."); target_exit(); }
/* * メインタスク */ void main_task(intptr_t exinf) { uint_t i, j; syslog_0(LOG_NOTICE, "Performance evaluation program (5)"); init_hist(1); init_hist(2); init_hist(3); init_hist(4); init_hist(5); init_hist(6); /* * 繰り返し計測 */ for (j = 0; j < NO_MEASURE / 10; j++) { /* * アラームハンドラ0短い時間で動作開始 * * 性能評価中に高分解能タイマが再設定されるのを避けるため. */ sta_alm(ALM0, ALM_RELTIM0); /* * 30個のアラームハンドラを長い時間で動作開始 */ begin_measure(1); for (i = 0; i < 30; i++) { sta_alm(alarm1_list[i], ALM_RELTIM1); } end_measure(1); /* * 30個のアラームハンドラを中間の時間で動作開始 */ begin_measure(2); for (i = 0; i < 30; i++) { sta_alm(alarm2_list[i], ALM_RELTIM2); } end_measure(2); /* * 30個のアラームハンドラを短い時間で動作開始 */ begin_measure(3); for (i = 0; i < 30; i++) { sta_alm(alarm3_list[i], ALM_RELTIM3); } end_measure(3); /* * 短い時間で動作開始した30個のアラームハンドラを動作停止 */ begin_measure(6); for (i = 0; i < 30; i++) { stp_alm(alarm3_list[i]); } end_measure(6); /* * 中間の時間で動作開始した30個のアラームハンドラを動作停止 */ begin_measure(5); for (i = 0; i < 30; i++) { stp_alm(alarm2_list[29 - i]); /* 逆順で動作停止 */ } end_measure(5); /* * 長い時間で動作開始した30個のアラームハンドラを動作停止 */ begin_measure(4); for (i = 0; i < 30; i++) { stp_alm(alarm1_list[29 - i]); /* 逆順で動作停止 */ } end_measure(4); } /* * 測定結果の出力 */ syslog_0(LOG_NOTICE, "Execution times of 30 short sta_alm"); print_hist(1); syslog_0(LOG_NOTICE, "Execution times of 30 medium sta_alm"); print_hist(2); syslog_0(LOG_NOTICE, "Execution times of 30 long sta_alm"); print_hist(3); syslog_0(LOG_NOTICE, "Execution times of 30 short stp_alm"); print_hist(4); syslog_0(LOG_NOTICE, "Execution times of 30 medium stp_alm"); print_hist(5); syslog_0(LOG_NOTICE, "Execution times of 30 long stp_alm"); print_hist(6); check_finish(0); }