embox
55 строк · 1.2 Кб
1/**
2* @file
3* @brief
4*
5* @author Anton Kozlov
6* @date 30.10.2014
7*/
8
9#include <stdint.h>10#include <sys/types.h>11
12#include <hal/clock.h>13#include <hal/cpu_idle.h>14#include <kernel/time/clock_source.h>15#include <kernel/time/time.h>16#include <kernel/time/timer.h>17
18void arch_cpu_idle(void) {19extern const struct clock_source *cs_jiffies;20
21struct clock_source *cs;22uint64_t next_event_cycles;23clock_t next_event_ticks;24clock_t sleep_ticks;25
26if (!cs_jiffies) {27return;28}29
30cs = (struct clock_source *)cs_jiffies;31
32if (timer_strat_get_next_event(&next_event_ticks) != 0) {33/* Sleep as long as possible */34next_event_ticks = UINT32_MAX;35}36else {37next_event_ticks = next_event_ticks - clock_sys_ticks();38}39
40next_event_cycles = clock_source_ticks2cycles(cs, next_event_ticks);41if (next_event_cycles > cs->counter_device->mask) {42next_event_cycles = cs->counter_device->mask;43}44
45clock_source_set_oneshot(cs);46clock_source_set_next_event(cs, next_event_cycles);47
48__asm__ __volatile__("WFI");49
50sleep_ticks = clock_source_cycles2ticks(cs, clock_source_get_cycles(cs));51
52jiffies_update(sleep_ticks);53
54clock_source_set_periodic(cs, cs->event_device->event_hz);55}
56