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); }
ER get_utm(SYSUTM *p_sysutm) { SYSUTM utime; SYSTIM time; #if TIC_DENO != 1 uint_t subtime; #endif /* TIC_DENO != 1 */ CLOCK clock1, clock2; bool_t ireq; SIL_PRE_LOC; LOG_GET_UTM_ENTER(p_sysutm); SIL_LOC_INT(); time = next_time; #if TIC_DENO != 1 subtime = next_subtime; #endif /* TIC_DENO != 1 */ clock1 = target_timer_get_current(); ireq = target_timer_probe_int(); clock2 = target_timer_get_current(); SIL_UNL_INT(); utime = ((SYSUTM) time) * 1000U; #if TIC_DENO != 1 utime += subtime * 1000U / TIC_DENO; #endif /* TIC_DENO != 1 */ if (!ireq || clock1 > clock2) { utime -= TIC_NUME * 1000U / TIC_DENO; } utime += TO_USEC(clock1); *p_sysutm = utime; LOG_GET_UTM_LEAVE(E_OK, *p_sysutm); return(E_OK); }