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.")
Klávesnice nemá HW frontu. Na XT to nevadilo, měla jednobajtové scan kódy.
Problém dělají multibyte kódy, když se prefix E0 nestihne vyzvednout, je přepsán druhým bajtem a interpretován jinak.
Na DOSu v protected modu, kde byl dispatch přerušení pomalý, pak při hýbání kurzorem šipkama Borland IDE náhodně psalo čísla.
USB klávesnice má buffer v sobě, posílá až na výzvu řadičem.
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.
Pokud si dobře pamatuji je několik úrovní přerušení přičemž nižší úroveň může přerušit tu vyšší. SW přerušení mohou být přerušeny HW a pod.
Proto:
- každé přerušení nižší úrovně které chces programovat musí odložit registry a po skončení je vrátit zpět
- je vhodné psát přerušovací rutiny tak aby zdržovali co nejméně, tedy odebrat byte někde ho zapsat a frcet pryc
23. 11. 2024, 14:52 editováno autorem komentáře
Na Pentiu 1 jsem zkoušel nastavit nejkratší interval přerušení od časovače, kdy se přerušení ještě neztrácela, a podařilo se max 100kHz.
S dělitelem pod 12 už to nebylo spolehlivé.
jako ze casovac nestihal "tikat" nebo proste ta obsluha nestihala potvrzovat dokonceni rutiny?
ona je tam jeste jedna past - delaji se 3 operace (opetovne povoleni preruseni, oznameni 8259 o ukonceni a IRET). Ty taky nejsou atomicke, takze (IMHO!!!) to nebude vzdycky fungovat na 100%
Časovač stíhá i s dělitelem 1, ale když přijde nové přerušení v době, kdy předchozí ještě nedoběhlo, obě přerušení se slijí v jedno.
V obsluze jsem jen inkrementoval čítač v RAM + OUT 0x20, 0x20 a i tak to moc nestíhalo. S vysokou frekvencí přerušení už hlavní program běžel velice pomalu.
STI hned před IRET není nutné, IRET = POPF + RETF, IF se obnoví ze stacku.
hmm zajimavy, protoze 100 kHz neni zadna velka frekvence pro P1. Ja tim prehraval samply 22kHz a mozna i 44kHz. Fakt je, ze ten pocitac nic moc dalsiho nedelal (mozna nejakej scrolling text).
Já tím řídil krokové motorky přes LPT. Většinu tiků se nic nedělo, jen občas se na port poslal směr + krok (3x OUT). Hlavní program byl interpolátor souřadnic a plnil frontu událostí, na který tik pohnout jakým motorem a kterým směrem.
Super článek, díky!
Prošel jsem pár odkazů a u https://stanislavs.org jsem se zarazil.
Ten web šíří odpornou russkou propagandu. Neuvěřitelný.
Třeba tohle je šílený https://stanislavs.org/ukrainian-children-zombified-brainwashed-and-trained-by-terrorists/
22. 11. 2024, 23:49 editováno autorem komentáře
Díky!
No ten web je, jak se teď dívám, docela drsnej. To je zajímavý, protože ty odkazy na DOS, řadič CRT atd. (celá podsekce https://stanislavs.org/helppc/) jsou úplně normální, žádné reklamy, žádná dezinfo nic.
Tak to se zpětně omlouvám, některé věci není dobré ani linkovat.
Čistě ze zvědavosti jsem se podíval na ten odkaz... Jestli jsem to pochopil správně, tak autor prezentuje ukázky z jakýchsi ukrajinských knížek pro děti a ve formě nadpisu vyjadřuje svůj názor. V čem přesně podle vás spočívá ta "odporná russká propaganda"? Vyjádření názoru, jakkoli s ním můžete nesouhlasit, přece není propaganda. Autor též poukazuje na účelově upravenou fotografii, tedy fake, jak se dnes říká, zneužitou k vytvoření dezinformace. On, na rozdíl od vás, demonstruje, na základě čeho má názor, jaký má. Odkazovaný článek má tedy pro mě mnohem větší informační hodnotu než váš komentář. Produktivnější by bylo, kdybyste uvedl, v čem přesně vidíte závadnost informací v článku uvedených, než připlácnutí nálepky. Pokud to opravdu je propaganda, tak se totiž aktivně podílíte na jejím šíření, protože informace tam uvedené na mě působí věrohodně a pouhou nálepkou "propaganda" v kriticky myslícím člověku nemůžete tento dojem změnit.
Hned zacatek je hodne vyzivny.
I have known for some time that the Ukrainian “education” system took a sharp turn to the worse in the 2000-s, when the school books were written on the grants from Soros and the like, but I was not aware how much worse it became after the USNATO-backed Nazi coup d’etat of 2014, though I should have guessed.
Jestli ti tohle prijde normalni pak. A jo aha zase tady diskutuji s nekym co se stydi za sve jmeno.
Co je na tom vámi uvedeném úryvku nenormální? Autor vyjadřuje svůj názor. A, narozdíl od vás, uvádí některé důvody, jež ho k jeho utvoření vedly.
Mám dojem, že většina lidí tu vystupuje pod přezdívkou, ať už je každého důvod jakýkoli. Mýlím se? Ostatně - i otcové-zakladatelé Spojených Států publikovali své stati pod přezdívkami. Inu, komu chybějí argumenty, ten se často uchyluje k argumentačním faulům. Je tristní, jak po třiceti letech svobody slova, plurality názorů a údajného upřednostňování diskuse nad papouškováním velká část společnosti netoleruje odlišný názor a naprosto není schopna korektní diskuse.