[fix] preemptive scheduler not interleaving tasks

This commit is contained in:
2026-05-31 19:15:31 +08:00
Unverified
parent daccb0a763
commit 2464bcc765
2 changed files with 9 additions and 4 deletions
+8 -4
View File
@@ -55,6 +55,10 @@ static void irq_handler(trap_frame* frame) {
UINT8 vector = (UINT8)frame->vector;
UINT8 irq = vector - PIC_IRQ_BASE;
// Send EOI BEFORE handling, so PIC can deliver new interrupts
// immediately after a context switch inside the handler.
pic_send_eoi(irq);
switch (irq) {
case 0: // PIT timer
pit_irq_handler();
@@ -62,9 +66,6 @@ static void irq_handler(trap_frame* frame) {
default:
break;
}
// Send EOI to PIC
pic_send_eoi(irq);
}
extern "C" void kernel_main() {
@@ -156,10 +157,11 @@ extern "C" void kernel_main() {
// Task A: prints messages — preemption handles time slicing
task_create("taskA", []() {
for (int i = 0; i < 3; i++) {
for (int i = 0; i < 10; i++) {
serial_write("[taskA] running iteration ");
serial_write_hex(i);
serial_write("\n");
for (volatile int j = 0; j < 50000000; j++) {}
}
serial_write("[taskA] done\n");
});
@@ -170,6 +172,7 @@ extern "C" void kernel_main() {
serial_write("[taskB] hello from taskB #");
serial_write_hex(i);
serial_write("\n");
for (volatile int j = 0; j < 50000000; j++) {}
}
serial_write("[taskB] done\n");
});
@@ -177,6 +180,7 @@ extern "C" void kernel_main() {
// Task C: short task
task_create("taskC", []() {
serial_write("[taskC] quick task\n");
for (volatile int j = 0; j < 50000000; j++) {}
serial_write("[taskC] finished\n");
});