SayoriOS 0.3.3

timer.c
См. документацию.
1
9 #include "sys/timer.h"
10 #include "sys/isr.h"
11 /* #include "sys/scheduler.h" */
12 #include "drv/fpu.h"
13 #include "io/ports.h"
14 #include "sys/scheduler.h"
15
16 extern bool scheduler_working;
17
18 size_t tick = 0; /* Количество тиков */
19 size_t frequency = CLOCK_FREQ; /* Частота */
20
26 size_t getTicks(){
27 return tick;
28 }
29
30 double getUptime() {
31 if(getFrequency() == 0) {
32 return 0.0;
33 }else{
34 return (double)tick / (double)frequency;
35 }
36 }
37
43 size_t getFrequency(){
44 return frequency;
45 }
46
52 void sleep_ticks(uint32_t delay){
53 size_t current_ticks = getTicks();
54 while (1){
55 if (current_ticks + delay < getTicks()){
56 break;
57 } else {
58 __asm__ volatile("hlt");
59 }
60 }
61 }
62
68 void sleep_ms(uint32_t milliseconds) {
69 uint32_t needticks = milliseconds * frequency;
70 sleep_ticks(needticks / 1000);
71
72 /* (milliseconds * frequency + 500) / 1000 */
73 }
74
80 void timer_callback(__attribute__((unused)) registers_t regs){
81 tick++;
82
83 if (is_multitask() && scheduler_working) {
84 task_switch_v2_wrapper(regs);
85 }
86 }
87
93 void init_timer(uint32_t f){
94 frequency = f;
95
96 uint32_t divisor;
97 uint8_t low;
98 uint8_t high;
99
100 divisor = BASE_FREQ / f;
101
102 outb(0x43, 0x36);
103
104 low = (uint8_t) (divisor & 0xFF);
105 high = (uint8_t) ((divisor >> 8) & 0xFF);
106
107 outb(0x40, low);
108 outb(0x40, high);
109
110 register_interrupt_handler(IRQ0, &timer_callback);
111 }
__attribute__
struct registers __attribute__((packed))
Структура данных пакета от мыши
Definition: psf.h:19
is_multitask
bool is_multitask(void)
Получение состояния о мультипотоке
Definition: scheduler.c:261
registers
Definition: common.h:59
getFrequency
size_t getFrequency()
Получить частоту таймера
Definition: timer.c:43
getTicks
size_t getTicks()
Получить количество тиков
Definition: timer.c:26
timer_callback
void timer_callback(__attribute__((unused)) registers_t regs)
Таймер Callback.
Definition: timer.c:80
init_timer
void init_timer(uint32_t f)
Инициализация модуля системного таймера
Definition: timer.c:93
sleep_ms
void sleep_ms(uint32_t milliseconds)
Ожидание по миллисекундам
Definition: timer.c:68
sleep_ticks
void sleep_ticks(uint32_t delay)
Ожидание по тикам
Definition: timer.c:52