[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");
});
+1
View File
@@ -18,6 +18,7 @@ static task_t* g_task_list = NULL; // circular linked list head
static void (*g_task_entries[TASK_MAX])(void);
extern "C" void task_entry_trampoline() {
ASM("sti");
task_t* cur = scheduler_current();
if (cur && g_task_entries[cur->id]) {
g_task_entries[cur->id]();