gokernel
(usa Linux Mint)
Enviado em 24/05/2019 - 19:54h
Olá pessoal !
Projeto atualizado e mais legível, parte do código do kernel ( /src/kernel.c ):
CLOCKS_PER_SEC é definido como := 1000
EDITADO ... EDITADO ... EDITADO ...
void PIT_timer_handler (int i) {
PIT_timer_ticks++;
}
void kernel_main_loop (void) {
video_puts (SHELL_PROMPT);
quit = 0;
while (!quit) {
// HERE: execute each 1 second:
//
if (PIT_timer_ticks % CLOCKS_PER_SEC == 0) {
video_display_time ();
}
//
// ... ! wait the next interrupts ...
//
kernel_wait ();
}
}
void kernel_main (struct multiboot_info *mbi) {
kernel_init (mbi);
intr_Init (); // interrupt init
intr_SetMask (IRQ_KEYBOARD, TRUE); // enable keyboard interrupt
intr_SetHandler (IRQ_VECTOR(IRQ_KEYBOARD), keyboard_handle); // set keyboard function handler
intr_timer_InitPIT (PIT_HZ / CLOCKS_PER_SEC); // 1000
intr_SetMask (IRQ_TIMER, TRUE); // enable timer interrupt
intr_SetHandler (IRQ_VECTOR(IRQ_TIMER), PIT_timer_handler); // set timer function handler
//-------------------------------------------
// HERE EXECUTE:
//
// 01: PIT (Programmable Interval Timer) := PIT_timer_handler ()
//
// 02: The KeyBoard Interrupt Handler := keyboard_handle ()
//
// 03: AND FINALLY | The Main Loop
//
//-------------------------------------------
//
kernel_main_loop ();
intr_Disable ();
kernel_finalize ();
if (is_reboot)
reboot ();
}
OBS: A data falta implementar o "time_zone" ... por isso não se assuste se a hora for diferente do seu horário local ...
Para sair digitar ( quit ) e teclar ENTER.
Apenas para teste performance !