Hier nimmst du einfach an, dass der focus_task wenn er einen Status von SLEEPING hat, eine Taste angefordert hat, muss er ja aber nicht zwingend.
unsigned int request_count = 0;
void get_key(void* ptr, unsigned short process_id) {
request_count++; //Wir wollen ja den naechsten Key, nicht den, den wir 1 Sekunde
//Zuvor gedrueckt haben.
start:
if(process_has_focus(process_id)) {
if(new_key == 1) {
*ptr = key;
new_key = 0;
request_count--;
} else {
add_to_request_list(process_id);
schd_dont_schedule(process_id);
goto start;
}
} else {
add_to_request_list(process_id);
schd_dont_schedule(process_id);
goto start;
}
}
void irq1() {
key = read_key();
if(request_count > 0) new_key = 1;
reschedule_all_in_requst_list();
}
Koennte das so klappen?
Edit: Nein. new_key = 0; macht Probleme da new_key nicht auf dem Stack liegen darf. Das ist kniffliger als ich dachte.
IRQ1 muesste ueberpruefen, ob jemand eine Taste angefordert hat, wenn nicht, darf es new_key nicht auf 1 setzen.
Edit2: Mit request_count muesste es aber gehen.
Ausserdem gefaellt mir die Idee dass Treiber dem Scheduler Befehle geben irgendwie nicht? Machen das Windows/Linux-Treiber auch so?
In Tyndur laeuft das alles anscheinend ueber Callbacks. Das ist wohl am einfachsten. Jeder Task der Tastendruecke empfangen will, erhaelt sie, ob er sie zu der Zeit braucht, muss der Task dann halt selber entscheiden. (Eg. der GUI-Prozess leitet sie dann selber weiter)
Edit3
Dann bleibt noch die Frage, wie ich die Callbacks aufrufen soll. Wenn ich sie einfach so aufrufe, geht das natuerlich nicht. (Wenn jemand ein while(1); im Callbackhandler hat, steht der Rechner still).
Laeuft das ueber den Scheduler? Wenn der Scheduler einen Task wechselt, schaut er ob Nachrichten fuer ihn da sind und schickt die ihm dann?