コード例 #1
0
ファイル: task_manage.c プロジェクト: Ashatta/tools
SYSCALL void
ext_tsk(void)
{
	LOG_EXT_TSK_ENTER();

#ifdef ACTIVATED_STACK_SIZE
	/*
	 *  create_context と activate_context で,使用中のスタック領
	 *  域を破壊しないように,スタック上にダミー領域を確保する.
	 */
	(void) alloca(ACTIVATED_STACK_SIZE);
#endif /* ACTIVATED_STACK_SIZE */

	if (sense_context()) {
		/*
		 *  非タスクコンテキストから ext_tsk が呼ばれた場合,
		 *  システムログにエラーを記録し,そのまま実行を続ける
		 *  が, 動作は保証されない.
		 */
		syslog_0(LOG_EMERG,
			"ext_tsk is called from non-task contexts.");
	}
	if (sense_lock()) {
		/*
		 *  CPUロック状態で ext_tsk が呼ばれた場合は,CPUロック
		 *  を解除してからタスクを終了する.実装上は,サービス
		 *  コール内でのCPUロックを省略すればよいだけ.
		 */
		syslog_0(LOG_WARNING,
			"ext_tsk is called from CPU locked state.");
	}
	else {
		if (sense_context()) {
			i_lock_cpu();
		}
		else  {
			t_lock_cpu();
		}
	}
	if (!(enadsp)) {
		/*
		 *  ディスパッチ禁止状態で ext_tsk が呼ばれた場合は,
		 *  ディスパッチ許可状態にしてからタスクを終了する.
		 */
		syslog_0(LOG_WARNING,
			"ext_tsk is called from dispatch disabled state.");
		enadsp = TRUE;
	}
	exit_task();
}
コード例 #2
0
unsigned int
sns_int( void )
{
	BOOL lock;
	int  result;

	if(sense_lock() == TRUE)
		return 0;

	enter_system_critical_section(&lock);
	result = isns_int(CurrentInterruptLevel);
	leave_system_critiacl_section(&lock);
	return result;
}
コード例 #3
0
ファイル: time_manage.c プロジェクト: koban/Uzume-Aqua548
SYSCALL ER
vxget_tim(SYSUTIM *p_sysutim)
{
	SYSUTIM	utime;
	SYSTIM	time;
#if TIC_DENO != 1
	INT	subtime;
#endif /* TIC_DENO != 1 */
	CLOCK	clock;
	BOOL	ireq;
	BOOL	locked;
	ER	ercd;

	LOG_VXGET_TIM_ENTER(p_sysutim);
	CHECK_TSKCTX();

	locked = sense_lock();
	if (!(locked)) {
		t_lock_cpu();
	}
	time = systim_offset + next_time;
#if TIC_DENO != 1
	subtime = (INT) next_subtime;
#endif /* TIC_DENO != 1 */
	clock = hw_timer_get_current();
	ireq = hw_timer_fetch_interrupt();
	if (!(locked)) {
		t_unlock_cpu();
	}

	utime = ((SYSUTIM) time) * 1000;
#if TIC_DENO != 1
	utime += subtime * 1000 / TIC_DENO;
#endif /* TIC_DENO != 1 */
	if (!(ireq && !(BEFORE_IREQ(clock)))) {
		utime -= TIC_NUME * 1000 / TIC_DENO;
	}
	utime += TO_USEC(clock);
	*p_sysutim = utime;
	ercd = E_OK;

    exit:
	LOG_VXGET_TIM_LEAVE(ercd, *p_sysutim);
	return(ercd);
}
コード例 #4
0
void
signal_time(void)
{
	TMEVTB	*p_tmevtb;
	bool_t	callflag;

	assert(sense_context());
	assert(!sense_lock());

	lock_cpu();
	in_signal_time = true;							/*[ASPD1033]*/

	do {
		/*
		 *  コールバック関数を呼び出さなければループを抜ける[ASPD1020].
		 */
		callflag = false;

		/*
		 *  現在のイベント時刻を求める[ASPD1022].
		 */
		update_current_evttim();

		/*
		 *  発生時刻がcurrent_evttim以前のタイムイベントがあれば,タイ
		 *  ムイベントヒープから削除し,コールバック関数を呼び出す
		 *  [ASPD1018][ASPD1019].
		 */
		while (p_last_tmevtn >= p_top_tmevtn
							&& EVTTIM_LE(top_evttim, current_evttim)) {
			p_tmevtb = tmevtb_delete_top();
			(*(p_tmevtb->callback))(p_tmevtb->arg);
			callflag = true;
		}
	} while (callflag);								/*[ASPD1020]*/

	/*
	 *  高分解能タイマ割込みの発生タイミングを設定する[ASPD1025].
	 */
	set_hrt_event();

	in_signal_time = false;							/*[ASPD1033]*/
	unlock_cpu();
}
コード例 #5
0
void
call_alarm(ALMCB *p_almcb)
{
    /*
     *  アラーム通知を停止状態にする.
     */
    p_almcb->almsta = false;

    /*
     *  通知ハンドラを,CPUロック解除状態で呼び出す.
     */
    unlock_cpu();

    LOG_ALM_ENTER(p_almcb);
    (*(p_almcb->p_alminib->nfyhdr))(p_almcb->p_alminib->exinf);
    LOG_ALM_LEAVE(p_almcb);

    if (!sense_lock()) {
        lock_cpu();
    }
}
コード例 #6
0
HANDLE
sch_int( void )
{
	BOOL   lock;
	HANDLE result;
	unsigned int level;

	if(sense_lock() == TRUE)
		return NULL;

	enter_system_critical_section(&lock);
	level = isns_int(CurrentInterruptLevel);
	if(level != 0)
	{
		result = InterruptLevel[level-1].ThreadHandle;
	}else
		result = NULL;
	leave_system_critiacl_section(&lock);

	return result;
}