Ejemplo n.º 1
0
void
call_cychdr(CYCCB *p_cyccb)
{
	PRI		saved_ipm;

	/*
	 *  次回の起動のためのタイムイベントブロックを登録する.
	 *
	 *  同じタイムティックで周期ハンドラを再度起動すべき場合には,この
	 *  関数からsignal_timeに戻った後に,再度この関数が呼ばれることにな
	 *  る.
	 */
	tmevtb_enqueue_cyc(p_cyccb, p_cyccb->evttim + p_cyccb->p_cycinib->cyctim);

	/*
	 *  周期ハンドラを,CPUロック解除状態で呼び出す.
	 */
	saved_ipm = i_get_ipm();
	i_unlock_cpu();

	LOG_CYC_ENTER(p_cyccb);
	(*((CYCHDR)(p_cyccb->p_cycinib->cychdr)))(p_cyccb->p_cycinib->exinf);
	LOG_CYC_LEAVE(p_cyccb);

	if (!i_sense_lock()) {
		i_lock_cpu();
	}
	i_set_ipm(saved_ipm);
}
Ejemplo n.º 2
0
void
call_cychdr(uintptr_t cycidx)
{
	cyccb_evttim[cycidx] += cycinib_cyctim[cycidx];

	/* 次周期のタイムイベントを登録 */
	time_event_enqueue((ID)cycidx ,
		cyccb_evttim[cycidx] , call_cychdr , cycidx);
	
	i_unlock_cpu();
	
	/* 周期ハンドラを実行 */
	LOG_CYC_ENTER(cycidx);
	(*cycinib_cychdr[cycidx])(cycinib_exinf[cycidx]);
	LOG_CYC_LEAVE(cycidx);
	
	if (!i_sense_lock()) {
		i_lock_cpu();
	}
}
Ejemplo n.º 3
0
void
call_cychdr(CYCCB *cyccb)
{
	/*
	 *  次回の起動のためのタイムイベントブロックを登録する.
	 *
	 *  同じタイムティックで周期ハンドラを再度起動すべき場合には,
	 *  この関数から isig_tim に戻った後に,再度この関数が呼ばれる
	 *  ことになる.
	 */
	tmevtb_enqueue_cyc(cyccb, cyccb->evttim + cyccb->cycinib->cyctim);

	/*
	 *  周期ハンドラを,CPUロック解除状態で呼び出す.
	 */
	i_unlock_cpu();
	LOG_CYC_ENTER(cyccb);
	(*((CYCHDR)(cyccb->cycinib->cychdr)))(cyccb->cycinib->exinf);
	LOG_CYC_LEAVE(cyccb);
	i_lock_cpu();
}