nikdy jsem uplne nepochopil, jak se resi soubeh preruseni. Treba prijde preruseni od COM portu - budu muset precist nebo zapsat znak do bufferu, to chapu. Ale co kdyz mezitim prijde treba ten casovac. Ma vyssi prioritu, takze je vyvolanej, nebo se ceka az na IRET?
A co kdyz prijde druhej casovac a ja jeste neukoncil rutinu? Ten obvod 8259 prece nema zadnou "frontu", kde by si vstupy preruseni pamatoval. Nebo jo? (zase to by stejne preteklo, pokud nestiham)
Přerušení (interní, externí nebo software) nastaví "I" flag, který blokuje další externí přerušení do doby, než se původní zpracuje. "I" flag se resetuje při instrukci "IRET", která obnoví původní FLAGS, případně explicitně instrukcí "STI" . Interní přerušení (způsobená chybou kódu, ochranou atd) a software přerušení blokována nejsou.
no jasně, ale jde mi o něco jiného - jsem v přerušovací rutině, dejme tomu od toho časovače. A do toho mi přijde přerušení třeba od sériového portu, že MUSÍM přečíst přijatý bajt, jinak mi přeteče interní buffer toho portu. Otázka je, jestli si to 8259 zapamatuje a potom přerušení vyvolá (až po tom STI atd.). IMHO to tak dělá, ale má i "frontu", aby si jich pamatoval víc? Nebo prostě jediná pitomě napsaná přerušovací rutina znamená v podstatě pád systému nebo ztrátu dat?
Zapamatuje a vyvolá, jinak by ten systém byl nepoužitelný. Interrupt se zapamatuje pouze jednou a pustí interrupt handler pouze jednou, jakmile se "I" flag odblokuje. Takže kód pak musí zkusit třeba číst opakovaně vstup z klávesnice, dokud není fronta prázdná.
U novějších systémů to může vypadat jinak, ale spíš bych čekal, že ne - implementovat datové struktury v hardware by bylo dost náročné ;-)
V kávesnici žádná fronta není. Jakmile klávesnice zjistí, že se nějaký čudlík zmáčknul nebo pustil, rovou sype scan kód do PC a procesor je přerušen, aby si došlý scan kód zpracoval. Do fronty v systémové oblasti biosu, ze které potom kódy kláves odebírají programy, to skládá procesor.
Fronta, ze které se dá číst víc bajtů je až v řadiči UART 16550 (zcela nečekaně na křemíku implementovaná) šestnáctibajtová. Ale to bylo vynalezeno kvůli tomu, že přerušovat procesor v chráněném módu trvá vinou změny kontextu hrozně dlouho a je vopruz dělat to s každým přijatým znakem a přerušuje se u čtrnáctého znaku (akorát si nepamatuju, kdo to zdramatizoval "Přijde první znak, druhý,...,čtrnáctý, (o kvintu vejš) dělej, přeruš, vytáhni to ze mě, už budu --- plná. (suše až vyprahle) Slyšeli jste popis funkce fronty obvodu 16550 i s ukázkou frekvenční modulace.")
Na vstupu 8259 je víc IRQ linek, každá má svoji prioritu a svůj "request pending" stav. CPU má jen jeden INTR vstup. PIC dá na sběrnici 8bit číslo, podle kterého CPU pozná, kterou IRQ linku právě obsluhuje a spustí její handler. Ostatní linky mezitím čekají.
IRQ linku může sdílet víc zařízení, společný handler musí rozpoznat, které zařízení se domáhá pozornosti a v jakém pořadí je obslouží.
Sériový port má 14 byte frontu, nic se neztratí, IRQ je aktivní už na první byte ve frontě a handler přečte všechno, co se mezitím nasbíralo.