| Zeile 119: | Zeile 119: | ||
}</c> | }</c> | ||
| − | Jetzt müssen wir den Scheduler nur noch zum Einsatz bringen. Dieser Teil ist das, was das eigentliche Multitasking macht. Der passende Code dazu ist so kurz wie die Idee einfach ist: Anstatt bei einem Interrupt den gerade eben gesicherten Prozessorzustand wiederherzustellen, stellen wir einfach den Zustand eines anderen Tasks wieder her. Dazu wird handle_interrupt so geändert, dass es <i>cpu</i> wieder zurückgibt. Im Fall des Timerinterrupts | + | Jetzt müssen wir den Scheduler nur noch zum Einsatz bringen. Dieser Teil ist das, was das eigentliche Multitasking macht. Der passende Code dazu ist so kurz wie die Idee einfach ist: Anstatt bei einem Interrupt den gerade eben gesicherten Prozessorzustand wiederherzustellen, stellen wir einfach den Zustand eines anderen Tasks wieder her. Dazu wird handle_interrupt so geändert, dass es <i>cpu</i> wieder zurückgibt. Im Fall des Timerinterrupts geben wir allerdings den Zustand des neuen Tasks zurück: |
<c>struct cpu_state* handle_interrupt(struct cpu_state* cpu) | <c>struct cpu_state* handle_interrupt(struct cpu_state* cpu) | ||
{ | { | ||
| + | struct cpu_state* new_cpu = cpu; | ||
| + | |||
... | ... | ||
if (cpu->intr == 0x20) { | if (cpu->intr == 0x20) { | ||
| − | + | new_cpu = schedule(cpu); | |
} | } | ||
| − | + | ... | |
| − | return | + | return new_cpu; |
}</c> | }</c> | ||