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 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 task4(intptr_t exinf) { ER ercd; ercd = ras_tex(TASK3, 0x0002); check_ercd(ercd, E_OK); ercd = ext_tsk(); check_point(0); }
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 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 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 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 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); }
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 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); }
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 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; } }
/* * 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; 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 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 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 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 SysPrc_SendSignal(SYSPRC_HANDLE hPrc) { ras_tex((ID)hPrc, 1); }