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); }
/** %jp{サンプルタスク} */ void Sample_Task(VP_INT exinf) { int num; num = (int)exinf; /* %jp{いわゆる哲学者の食事の問題} */ for ( ; ; ) { /* %jp{適当な時間考える} */ print_state(num, "thinking"); rand_wait(); /* %jp{左右のフォークを取るまでループ} */ for ( ; ; ) { /* %jp{左から順に取る} */ wai_sem(LEFT(num)); if ( pol_sem(RIGHT(num)) == E_OK ) { break; /* %jp{両方取れた} */ } sig_sem(LEFT(num)); /* %jp{取れなければ離す} */ /* %jp{適当な時間待つ} */ print_state(num, "hungry"); rand_wait(); /* %jp{右から順に取る} */ wai_sem(RIGHT(num)); if ( pol_sem(LEFT(num)) == E_OK ) { break; /* %jp{両方取れた} */ } sig_sem(RIGHT(num)); /* %jp{取れなければ離す} */ /* %jp{適当な時間待つ} */ print_state(num, "hungry"); rand_wait(); } /* %jp{適当な時間、食べる} */ print_state(num, "eating"); rand_wait(); /* %jp{フォークを置く} */ sig_sem(LEFT(num)); sig_sem(RIGHT(num)); } }
void task1(intptr_t exinf) { ER ercd; check_point(1); ercd = isig_sem(SEM1); check_ercd(ercd, E_CTX); check_point(2); ercd = loc_cpu(); check_ercd(ercd, E_OK); ercd = pol_sem(SEM1); check_ercd(ercd, E_CTX); ercd = twai_sem(SEM1, TMO_POL); check_ercd(ercd, E_CTX); ercd = unl_cpu(); check_ercd(ercd, E_OK); check_point(3); ercd = dis_dsp(); check_ercd(ercd, E_OK); ercd = pol_sem(SEM1); check_ercd(ercd, E_OK); ercd = twai_sem(SEM1, TMO_POL); check_ercd(ercd, E_CTX); ercd = ena_dsp(); check_ercd(ercd, E_OK); check_point(4); ercd = chg_ipm(TMAX_INTPRI); check_ercd(ercd, E_OK); ercd = pol_sem(SEM1); check_ercd(ercd, E_TMOUT); ercd = twai_sem(SEM1, TMO_POL); check_ercd(ercd, E_CTX); ercd = chg_ipm(TIPM_ENAALL); check_ercd(ercd, E_OK); check_point(5); ercd = twai_sem(SEM1, -2); check_ercd(ercd, E_PAR); ercd = twai_sem(SEM1, TMO_POL); check_ercd(ercd, E_TMOUT); check_point(6); ercd = sta_alm(ALM1, 10); check_ercd(ercd, E_OK); check_point(7); ercd = twai_sem(SEM1, TMO_FEVR); check_ercd(ercd, E_OK); check_point(11); ercd = act_tsk(TASK3); check_ercd(ercd, E_OK); check_point(12); ercd = wai_sem(SEM1); check_ercd(ercd, E_OK); check_point(15); ercd = wai_sem(SEM1); check_ercd(ercd, E_OK); check_point(19); ercd = wai_sem(SEM1); check_ercd(ercd, E_OK); check_point(23); ercd = act_tsk(TASK2); check_ercd(ercd, E_OK); check_point(25); ercd = wai_sem(SEM1); check_ercd(ercd, E_OK); check_point(30); ercd = sta_alm(ALM1, 10); check_ercd(ercd, E_OK); check_point(31); ercd = twai_sem(SEM1, 100); check_ercd(ercd, E_RLWAI); check_point(33); ercd = sta_alm(ALM1, 100); check_ercd(ercd, E_OK); check_point(34); ercd = twai_sem(SEM1, 10); check_ercd(ercd, E_TMOUT); check_point(35); ercd = stp_alm(ALM1); check_ercd(ercd, E_OK); check_finish(36); check_point(0); }
void alarm1_handler(intptr_t exinf) { ER ercd; switch (++alarm1_count) { case 1: check_point(8); ercd = pol_sem(SEM1); check_ercd(ercd, E_CTX); ercd = twai_sem(SEM1, TMO_POL); check_ercd(ercd, E_CTX); check_point(9); ercd = iloc_cpu(); check_ercd(ercd, E_OK); ercd = isig_sem(SEM1); check_ercd(ercd, E_CTX); ercd = iunl_cpu(); check_ercd(ercd, E_OK); check_point(10); ercd = isig_sem(SEM1); check_ercd(ercd, E_OK); return; check_point(0); case 2: check_point(14); ercd = isig_sem(SEM1); check_ercd(ercd, E_OK); signal_var(); return; check_point(0); case 3: check_point(17); ercd = isig_sem(SEM1); check_ercd(ercd, E_OK); signal_var(); return; check_point(0); case 4: check_point(21); ercd = isig_sem(SEM1); check_ercd(ercd, E_OK); signal_var(); return; check_point(0); case 5: check_point(28); ercd = isig_sem(SEM1); check_ercd(ercd, E_OK); signal_var(); return; check_point(0); case 6: check_point(32); ercd = irel_wai(TASK1); check_ercd(ercd, E_OK); return; check_point(0); } check_point(0); }
void tcp_echo_srv_snd_task(intptr_t exinf) { ID tskid, cepid; ER error; ER_UINT slen; SYSTIM now; uint16_t blen, last; char head, tail; get_tid(&tskid); syslog(LOG_NOTICE, "[TCP ECHO SRV SND:%d] started.", tskid); while (true) { if ((error = rcv_dtq(DTQ_TCP_ECHO_SRV_SND, (intptr_t*)&cepid)) != E_OK) { syslog(LOG_NOTICE, "[TES:%02d SND] sync error: %s", cepid, itron_strerror(error)); continue; } while (true) { /* バッファに文字が入るまで待つ。*/ syscall(wai_sem(SEM_TCP_ECHO_SRV_SND_READY)); /* 受信完了で、バッファに文字がなければ終了する。*/ if (!ena_rcv && chars == 0) break; /* 送信サイズを計算する。*/ syscall(wai_sem(SEM_TCP_ECHO_SRV_LOCK)); if (rptr > sptr) blen = rptr - sptr; else blen = sizeof(buffer) - (sptr - buffer); syscall(sig_sem(SEM_TCP_ECHO_SRV_LOCK)); if ((slen = tcp_snd_dat(cepid, sptr, blen, TMO_FEVR)) <= 0) { syslog(LOG_NOTICE, "[TES:%02d SND] send error = %s", cepid, itron_strerror(slen)); break; } head = *sptr; tail = *(sptr + slen - 1); #ifdef SHOW_RCV_RANGE syslog(LOG_NOTICE, "[TES:%02d SND] len: %4d, data %02x -> %02x", cepid, (uint16_t)slen, head, tail); #endif /* of #ifdef SHOW_RCV_RANGE */ snd_count ++; snd_total += slen; syscall(wai_sem(SEM_TCP_ECHO_SRV_LOCK)); /* 送信ポインタを進める。*/ if (sptr - buffer + slen >= sizeof(buffer)) sptr -= sizeof(buffer) - slen; else sptr += slen; /* バッファ内の文字数を減らす。*/ last = chars; chars -= (uint16_t)slen; /* 受信完了で、バッファに文字がなければ終了する。*/ if (!ena_rcv && chars == 0) { syscall(sig_sem(SEM_TCP_ECHO_SRV_LOCK)); break; } /* バッファ内に文字があれば、送信タスクを起床する。*/ if (chars > 0) sig_sem(SEM_TCP_ECHO_SRV_SND_READY); /* 受信可能で、バッファ内に空きができれば、受信タスクを起床する。*/ if (ena_rcv && last == sizeof(buffer) && sizeof(buffer) - chars > 0) sig_sem(SEM_TCP_ECHO_SRV_RCV_READY); syscall(sig_sem(SEM_TCP_ECHO_SRV_LOCK)); } /* 受信バッファに空ができるを待っている受信タスクを起床する。*/ if (chars == sizeof(buffer)) sig_sem(SEM_TCP_ECHO_SRV_SND_READY); #ifdef USE_TCP_SHT_CEP if ((error = tcp_sht_cep(cepid)) != E_OK) syslog(LOG_NOTICE, "[TES:%02d SND] shtudown error = %s", cepid, itron_strerror(error)); #endif /* of #ifdef USE_TCP_SHT_CEP */ if ((error = tcp_cls_cep(cepid, TMO_FEVR)) != E_OK) syslog(LOG_NOTICE, "[TES:%02d SND] close error = %s", cepid, itron_strerror(error)); get_tim(&now); syslog(LOG_NOTICE, "[TES:%02d SND] finished: %6ld, snd: %4d, rcv: %4d, len: %ld", cepid, now / SYSTIM_HZ, snd_count, rcv_count, snd_total); sig_sem(SEM_TCP_ECHO_SRV_CLS_READY); pol_sem(SEM_TCP_ECHO_SRV_SND_READY); pol_sem(SEM_TCP_ECHO_SRV_RCV_READY); } }
void tcp_echo_srv_snd_task(intptr_t exinf) { ER error; ID tskid, cepid; uint16_t blen; get_tid(&tskid); syslog(LOG_NOTICE, "[TCP ECHO SRV (NBLK) SND:%d] started.", tskid); while (true) { if ((error = rcv_dtq(DTQ_TCP_ECHO_SRV_SND, (intptr_t*)&cepid)) != E_OK) { syslog(LOG_NOTICE, "[TES:%02d SND] sync error: %s", cepid, itron_strerror(error)); continue; } while (true) { /* バッファに文字が入るまで待つ。*/ syscall(wai_sem(SEM_TCP_ECHO_SRV_SND_READY)); /* 待っている間にエラーになったら終了する。*/ if (snd_error <= 0) break; /* 受信完了で、バッファに文字がなければ終了する。*/ if (!ena_rcv && chars == 0) break; /* 送信サイズを計算する。*/ syscall(wai_sem(SEM_TCP_ECHO_SRV_LOCK)); if (rptr > sptr) blen = rptr - sptr; else blen = sizeof(buffer) - (sptr - buffer); syscall(sig_sem(SEM_TCP_ECHO_SRV_LOCK)); /* 送信する。*/ if ((error = tcp_snd_dat(cepid, sptr, blen, TMO_NBLK)) != E_WBLK) { syslog(LOG_NOTICE, "[TES:%02d SND] send error = %s", cepid, itron_strerror(error)); break; } } /* 受信バッファに空ができるを待っている受信タスクを起床する。*/ if (chars == sizeof(buffer)) sig_sem(SEM_TCP_ECHO_SRV_SND_READY); #ifdef USE_TCP_SHT_CEP if ((error = tcp_sht_cep(cepid)) != E_OK) syslog(LOG_NOTICE, "[TES:%02d SND] shutdown error = %s", cepid, itron_strerror(error)); #endif /* of #ifdef USE_TCP_SHT_CEP */ if ((error = tcp_cls_cep(cepid, TMO_NBLK)) != E_WBLK) { syslog(LOG_NOTICE, "[TES:%02d SND] close error = %s", cepid, itron_strerror(error)); } pol_sem(SEM_TCP_ECHO_SRV_SND_READY); pol_sem(SEM_TCP_ECHO_SRV_RCV_READY); } }