| Zeile 140: | Zeile 140: | ||
<c> | <c> | ||
DWORD current_task_id=0; | DWORD current_task_id=0; | ||
| − | + | #define interrupt_return asm("leave; iret") | |
| − | void | + | void isr_pit() |
{ | { | ||
current_task_id++; | current_task_id++; | ||
| Zeile 156: | Zeile 156: | ||
"ltr $1234:$1234;" : | "ltr $1234:$1234;" : | ||
: "a" (8*(current_task_id + TSS_SEL_BASE)); | : "a" (8*(current_task_id + TSS_SEL_BASE)); | ||
| − | + | interrupt_return; | |
} | } | ||
</c> | </c> | ||
Dieser Code kann natürlich noch erweitert werden, zum Beispiel, wenn man jedem Task eine unterschiedliche Priorität zuweist. | Dieser Code kann natürlich noch erweitert werden, zum Beispiel, wenn man jedem Task eine unterschiedliche Priorität zuweist. | ||
| − | Eventuell ist hier die AT&T-Syntax falsch, da ich mit dieser nicht ganz vertraut bin. | + | ''Eventuell ist hier die AT&T-Syntax falsch, da ich mit dieser nicht ganz vertraut bin. Außerdem ist dieses als normale C-Prozedur getarnte Version einer ISR etwas unschön.'' |
=== Schritt 5: Multitasking initalisieren === | === Schritt 5: Multitasking initalisieren === | ||