diff options
Diffstat (limited to 'src/scheduler.cc')
-rw-r--r-- | src/scheduler.cc | 25 |
1 files changed, 15 insertions, 10 deletions
diff --git a/src/scheduler.cc b/src/scheduler.cc index 1557e28..4de9fff 100644 --- a/src/scheduler.cc +++ b/src/scheduler.cc @@ -9,20 +9,24 @@ void task_b(void) { while (true) printk("B"); } +constexpr uint16_t max_tasks = 256; +static cpu_state_t* tasks[max_tasks]; + static uint8_t stack_a[4096] = {0}; static uint8_t stack_b[4096] = {0}; -constexpr uint16_t max_tasks = 2; -static cpu_state_t* tasks[max_tasks]; Scheduler::Scheduler(uint16_t cs) : InterruptHandler(0x00) { - add_task(stack_a, cs, &task_a); - add_task(stack_b, cs, task_b); + printk("add_task: ", add_task(stack_b, cs, task_b), '\n'); + printk("add_task: ", add_task(stack_a, cs, task_a), '\n'); + + printk("task0 eip: ", uhex{tasks[0]->eip}, '\n'); + printk("task1 eip: ", uhex{tasks[1]->eip}, '\n'); } -bool Scheduler::add_task(uint8_t* stack, uint16_t cs, void (*entry)()) { - if (last_task_id == uint16_t_max) return false; +uint16_t Scheduler::add_task(uint8_t* stack, uint16_t cs, void (*entry)()) { + if (last_task_id == (max_tasks - 1)) return 0; - uint16_t id = last_task_id++; + uint16_t id = ++last_task_id; ++num_tasks; cpu_state_t* cpu_state = reinterpret_cast<cpu_state_t*>(stack + 4096 - sizeof(cpu_state_t)); @@ -33,14 +37,15 @@ bool Scheduler::add_task(uint8_t* stack, uint16_t cs, void (*entry)()) { tasks[id] = cpu_state; printk("adding task: cs ", uhex{cpu_state->cs}, " stack ", uhex{reinterpret_cast<uint32_t>(tasks[id])}, " entry ", uhex{cpu_state->eip}, '\n'); - return true; + return id; } cpu_state_t* Scheduler::trigger(cpu_state_t* cpu) { tasks[current_task] = cpu; - if (++current_task >= num_tasks) current_task %= num_tasks; + current_task++; + if (current_task > num_tasks) current_task = 0; - // printk("swapped to task ", current_task, '\n'); + printk("\n\nswapped to task ", current_task, '\n'); return tasks[current_task]; } |