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 
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 }
struct registers __attribute__((packed))
Структура данных пакета от мыши
Definition: psf.h:19
bool is_multitask(void)
Получение состояния о мультипотоке
Definition: scheduler.c:261
size_t getFrequency()
Получить частоту таймера
Definition: timer.c:43
size_t getTicks()
Получить количество тиков
Definition: timer.c:26
void timer_callback(__attribute__((unused)) registers_t regs)
Таймер Callback.
Definition: timer.c:80
void init_timer(uint32_t f)
Инициализация модуля системного таймера
Definition: timer.c:93
void sleep_ms(uint32_t milliseconds)
Ожидание по миллисекундам
Definition: timer.c:68
void sleep_ticks(uint32_t delay)
Ожидание по тикам
Definition: timer.c:52