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(); }
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; }
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); }
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(); }
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(); } }
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; }