Mein Compiler beschwert sich in deiner sc2kc.c darüber, dass du " statt ' bei den Buchstaben verwendest. Das solltest du korrigieren.
Außerdem funktionieren deine kprintf-Funktionen nicht richtig. Wenn eine Funktion, die "..." in der Parameterliste hat, muss diese die Parameter als va_list weitergeben. Die Signatur deiner kprintfstrcol-Funktion sollte so aussehen: int kprintfstrcol(atrbyt font, const char* fmt, va_list ap);. Das Makro CALL_VA_FUNC sollte so aussehen
#define CALL_VA_FUNC(func,param,param1) \
va_start(ap,param1);\
func(param,param1,ap);\
va_end(ap);
Da hab ich einmal die doppelte Deklaration der Variable ap entfernt und den Parameter ap in die Parameterliste vom Aufruf von func hinzugefügt.
Ich würde übrigens empfehlen gar kein Makro dafür zu verwenden. Da musst du ja ziemliche Verrenkungen mit der globalen Variable machen, um an den Rückgabewert zu kommen. Schreib den Code lieber in der Funktion aus, und speichere den Rückgabewert in einer temporären Variable während du va_end aufrufst. Anschließend gibst du die temporäre Variable zurück.
Zum Problem: Ich habs jetzt noch nicht fehlerfrei zum Laufen bekommen, aber ein paar Fehler, die ich gefunden habe und die du irgendwie beheben/umgehen solltest:
- Dein timer_handler sollte einen cpu_state* zurückgeben. Einfach nur new_cpu = schedule(new_cpu); funktioniert nicht.
- irq.c sollte timer_handler entsprechend aufrufen
- In init_task hast du immer noch das Problem, dass du Zeiger auf lokale Variablen zurückgibst. Du könntest die Rückgabe des Tasks irgendwie so versuchen:
tasks[num_tasks].state = state;
tasks[num_tasks].pid = num_tasks + 1;
task *new_task = &tasks[num_tasks];
num_tasks++;
return new_task;
(Der Rückgabewert wird ja derzeit nicht verwendet, deswegen sollte das erstmal keinen Effekt haben.)
- schedule() sollte nur dann zurückkehren, wenn num_tasks == 0:
if (current_task >= 0) {
tasks[current_task].state = cpu;
}
if (num_tasks == 0) {
return cpu;
}
Diese Änderung sorgt dafür, dass das Taskswitchung wieder aktiviert wird.
Wie gesagt, bei mir funktioniert das derzeit auch noch nicht, deswegen keine Garantie, dass die Fehler tatsächlich durch die vorgeschlagenen Lösungen behoben werden.