Example #1
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);
}
Example #2
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));
	}
}
Example #3
0
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);
}
Example #4
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);
}
Example #5
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);
    }
}
Example #6
0
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);
    }
}