Zadatak
Prilagoditi prekidni podsustav tako da se prekidi obrađuju prema prioritetu – svakom prekidnom broju pridijeliti prioritet identičan prekidnom broju. Ako se za vrijeme obrade jednog prekida dogodi novi zahtjev većeg prioriteta, on će se prihvatiti i obraditi odmah, odnosno, ako je manjeg prioriteta označiti ga za obradu i obraditi kasnije. Koristan dio obrade simuliranih prekida (koje simulirati ispisom i odgodama, npr. ukupnog trajanja 10 s) izvoditi s dozvoljenim prekidanjem.
Da neke obrade ne bi previše čekale zbog "navale" prioritetnijih zahtjeva, dodati slijedeću izmjenu. Svaki puta kad neki prekid bude obrađen, svima koji još nisu obrađeni (prekinuti su u obradi ili niti nisu krenuli s obradom) povećati prioritet za tri.
Koristiti sklopovske prekide da pored "svoje" operacije još simuliraju pojavu novih.
Moguća ideja
uart_read
pročitani znak staviti i u varijablu irq_prio
, pretpostaviti da je broj: irq_prio = up->inbuff[up->inl] - '0'
).
Na kraju obrade prekida prije povratka u prekinuto, pogledati je li u toj varijabli ima nešto. Ako ima onda iz toga generirati prioritet novog zahtjeva i obrisati tu varijablu.
Ideja prihvata prekida bi bila:
smanji_novima = 0 //umjesto povećanja prioriteta svim postojećim, smanji novima pri dodavanju dodaj_zahtjeve(irq_num) { za sve ihndlr registrirane za irq_num zahtjev = kmalloc... zahtjev.handler = ihndlr zahtjev.prio = (irq_num ≤ 48? irq_num + 100; irq_num - smanji_novima) zahtjev.u_obradi = laž ... dodaj 'zahtjev' u 'listu zahtjeva uređenu prema prioritetu (zahtjev.prio) } funkcija za prihvat prekida(irq_num) { dodaj_zahtjeve(irq_num) prvi = prvi zahtjev iz 'liste zahtjeva' dok je prvi != NULL i prvi.u_obradi == laž { prvi.u_obradi = istina dozvoli prekidanje obradi 'prvi' (pozovi prvi.handler.ihandler(...)) zabrani prekidanje makni 'prvi' iz liste smanji_novima += 3 //simulacija novih zahtjeva nakon obrade prekida serije ako je irq_prio > 0 { //postavlja se u obradi serije dodaj_zahtjeve(irq_prio + 49) //da budu 49-58 kad se stisne 0-9 irq_prio = 0 } prvi = prvi zahtjev iz liste zahtjeva } ako je prvi == NULL smanji_novima = 0 }Varijablu
irq_prio
se može deklarirati u interrupts.c
a prije njenog korištenja iz uart.c
u funkciji uart_read
samo ju označiti da postoji s extern int irq_prio;