static int fast_forward(void) { /* * No task has event pending, and thus the next time we have an * event to process must be either of: * 1. Interrupt generator triggers an interrupt * 2. The next wake alarm is reached * So we should check whether an interrupt may happen, and fast * forward to the nearest among: * 1. When interrupt generator wakes up * 2. When the next task wakes up */ int task_id = task_get_next_wake(); if (!has_interrupt_generator) { if (task_id == TASK_ID_INVALID) { return TASK_ID_IDLE; } else { force_time(tasks[task_id].wake_time); return task_id; } } if (!generator_sleeping) return TASK_ID_IDLE; if (task_id != TASK_ID_INVALID && tasks[task_id].thread != (pthread_t)NULL && tasks[task_id].wake_time.val < generator_sleep_deadline.val) { force_time(tasks[task_id].wake_time); return task_id; } else { force_time(generator_sleep_deadline); return TASK_ID_IDLE; } }
void system_pre_init(void) { timestamp_t t; if (load_time(&t)) force_time(t); ramdata_get_persistent(); __running_copy = get_image_copy(); if (__running_copy == SYSTEM_IMAGE_UNKNOWN) { __running_copy = SYSTEM_IMAGE_RO; system_set_reset_flags(load_reset_flags()); } *(uintptr_t *)(__host_flash + CONFIG_RO_MEM_OFF + 4) = (uintptr_t)__ro_jump_resetvec; *(uintptr_t *)(__host_flash + CONFIG_RW_MEM_OFF + 4) = (uintptr_t)__rw_jump_resetvec; }
/* Idle task. Executed when no tasks are ready to be scheduled. */ void __idle(void) { timestamp_t t0, t1; int next_delay; uint32_t rtc_t0, rtc_t1; while (1) { asm volatile("cpsid i"); t0 = get_time(); next_delay = __hw_clock_event_get() - t0.le.lo; if (DEEP_SLEEP_ALLOWED && (next_delay > STOP_MODE_LATENCY)) { /* deep-sleep in STOP mode */ enable_serial_wakeup(1); /* set deep sleep bit */ CPU_SCB_SYSCTRL |= 0x4; rtc_t0 = set_rtc_alarm(0, next_delay - STOP_MODE_LATENCY); asm("wfi"); CPU_SCB_SYSCTRL &= ~0x4; enable_serial_wakeup(0); /* re-lock the PLL */ config_hispeed_clock(); /* fast forward timer according to RTC counter */ rtc_t1 = reset_rtc_alarm(); t1.val = t0.val + (rtc_t1 - rtc_t0) * US_PER_RTC_TICK; force_time(t1); } else { /* normal idle : only CPU clock stopped */ asm("wfi"); } asm volatile("cpsie i"); } }