embox

Форк
0
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

18
void arch_cpu_idle(void) {
19
	extern const struct clock_source *cs_jiffies;
20

21
	struct clock_source *cs;
22
	uint64_t next_event_cycles;
23
	clock_t next_event_ticks;
24
	clock_t sleep_ticks;
25

26
	if (!cs_jiffies) {
27
		return;
28
	}
29

30
	cs = (struct clock_source *)cs_jiffies;
31

32
	if (timer_strat_get_next_event(&next_event_ticks) != 0) {
33
		/* Sleep as long as possible */
34
		next_event_ticks = UINT32_MAX;
35
	}
36
	else {
37
		next_event_ticks = next_event_ticks - clock_sys_ticks();
38
	}
39

40
	next_event_cycles = clock_source_ticks2cycles(cs, next_event_ticks);
41
	if (next_event_cycles > cs->counter_device->mask) {
42
		next_event_cycles = cs->counter_device->mask;
43
	}
44

45
	clock_source_set_oneshot(cs);
46
	clock_source_set_next_event(cs, next_event_cycles);
47

48
	__asm__ __volatile__("WFI");
49

50
	sleep_ticks = clock_source_cycles2ticks(cs, clock_source_get_cycles(cs));
51

52
	jiffies_update(sleep_ticks);
53

54
	clock_source_set_periodic(cs, cs->event_device->event_hz);
55
}
56

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.