예제 #1
0
파일: wait.c 프로젝트: ev3rt-git/ev3rt-hrp3
void
wait_tmout_ok(TCB *p_tcb)
{
	p_tcb->p_winfo->wercd = E_OK;
	make_non_wait(p_tcb);
	if (p_runtsk != p_schedtsk) {
		request_dispatch_retint();
	}

	/*
	 *  ここで優先度の高い割込みを受け付ける.
	 */
	unlock_cpu();
	delay_for_interrupt();
	lock_cpu();
}
예제 #2
0
void
wait_tmout(TCB *p_tcb)
{
	wait_dequeue_wobj(p_tcb);
	p_tcb->p_winfo->wercd = E_TMOUT;
	make_non_wait(p_tcb);
	if (p_runtsk != p_schedtsk) {
		request_dispatch();
	}

	/*
	 *  ここで優先度の高い割込みを受け付ける.
	 */
	unlock_cpu();
	delay_for_interrupt();
	lock_cpu();
}
예제 #3
0
/*
 *  シミュレーション時刻を進める(テストプログラム用)
 */
void
simtim_advance(uint_t time)
{
	bool_t	locked;

	locked = sns_loc();
	if (!locked) {
		loc_cpu();
	}

	while (*p_event_flag && *p_event_simtim <= current_simtim + time) {
		/*
		 *  時刻をtime進めると,高分解能タイマ割込みの発生時刻を過ぎ
		 *  る場合
		 */
		if (current_simtim < *p_event_simtim) {
			time -= (*p_event_simtim - current_simtim);
			current_simtim = *p_event_simtim;
		}
		*p_event_flag = false;
		(*p_raise_event)();
		select_event();

		/*
		 *  ここで割込みを受け付ける.
		 */
		if (!locked) {
			unl_cpu();
			delay_for_interrupt();
			loc_cpu();
		}
	}	 
	current_simtim += time;

	if (!locked) {
		unl_cpu();
	}
}