Intel 8259 är en familj av programmerbara avbrottskontroller (PIC) utvecklade av Intel för Intel 8080 , Intel 8085 och Intel 8086 mikroprocessorer . Familjen bestod ursprungligen av modellerna 8259, 8259A och 8259B, men många andra kompatibla modeller har skapats av andra tillverkare hittills. 8259 fungerar som en multiplexer , och kombinerar flera avbrottskällor till en enda avbrottskälla för att avbryta en annan enhet, för vilken det är lättare att hantera avbrottsprioritetsnivåer och deras eventuella kapsling.
Den ursprungliga versionen av styrenheten var endast avsedd för processorerna 8080 och 8085. På avbrottsbekräftelsesignalen utfärdade den tre byte på bussen, den första motsvarade opkoden "Call subroutine" (värde 0xCD i hexadecimal), sedan två byte av anropsadressen för denna subrutin, som behövde skrivas till styrenhetens interna register som motsvarar varje avbrottskälla. 8259A-chippet släpptes för x86-familjen av processorer eftersom kontrollöverföringsmekanismen har ändrats. Nu utfärdades två byte sekventiellt till bussen, den första var "ledig", mikroprocessorn ignorerade dess värde, den andra byten innehöll avbrottsvektornumret och adressen till vilken programexekveringen skulle överföras togs från avbrottsvektortabellen . För 8086-, 80186- och 8088-processorerna upptog den den lägsta kilobyten av minnesadressutrymmet. Med senare, från och med 80286, kunde avbrottsvektortabellen flyttas till vilken minnesplats som helst.
8259A ingick i den ursprungliga IBM PC : n 1980 och behölls i IBM PC/XT- arkitekturen som introducerades 1983 . Med introduktionen av IBM PC/AT kom det andra 8259A-chippet. 8259A-familjen fasades därefter ut till förmån för Intel APIC- arkitekturen , ursprungligen designad för multiprocessor-datorer.
Faktum är att sedan början av 1990-talet har 8259A inte använts som en separat enhet, utan har blivit en del av chipset-chippet, senare än sydbryggan . En av de mest kända chipsen som helt integrerade funktionaliteten hos alla programmerbara kontroller som fanns på IBM PC-AT-kortet var 82C206-chippet, som släpptes av Chips & Technologies 1988.
I Sovjetunionen producerades 8259 som KR580VN59 och 8259A, som ett programmerbart kontrollerchip för prioriterade avbrott KR1810VN59A [1]
De viktigaste slutsatserna som används i 8259 är:
Upp till 8 8259 slavar kan anslutas till 8259 master, vilket ger upp till 64 avbrott. Vid kaskadkoppling är slavens INT-utgång ansluten till en av IRQ-linjerna på 8259-mastern.
8259 har tre register:
Avbrottsavslutningsoperationer (EOI) kategoriseras som specificerade, ospecificerade och automatiska. Den EOI-specifika operationen specificerar vilken avbrottsnivå som ska kvitteras i ISR (faktiskt vilken bit som ska raderas i ISR). Ett ospecificerat EOI-kommando återställer IRQ-raden med högsta prioritet som bearbetas. Det automatiska EOI-läget rensas lite i ISR direkt efter att avbrottet har kvitterats.
Kant- och nivåavbrottslägen stöds.
Fasta och cykliska prioritetsskiftlägen stöds.
8259A kan konfigureras för att fungera med en 8088 eller 8086. Det vill säga en 8 eller 16 bitars databuss .
Programmering av 8259A under DOS och Microsoft Windows orsakade ett betydande antal pinsamma bakåtkompatibilitetsproblem som hade rötter som gick tillbaka till de första datorerna 1981.
Det första problemet är mer eller mindre källan till det andra. DOS-enhetsdrivrutiner måste skicka ett ospecificerat EOI-kommando när de har avslutat service på sin enhet. På grund av detta är det svårt att använda andra avbrottstermineringslägen (det är inte alltid möjligt att garantera att den önskade nivån inte återställs tidigare). Det gör det också omöjligt att skilja mellan avbrott som omdirigeras från 8259-mastern till slaven.
Det andra problemet uppstår när man använder IRQ2 och IRQ9, som dök upp när slaven 8259A introducerades i PC/AT. Slaven 8259:s INT-utgång är ansluten till masterns IRQ2-linje. IRQ2-linjen på ISA-bussen, som tidigare var ansluten till denna linje, har nu omdirigerats till slavens IRQ1-utgång. Så nu triggar bussavbrott IRQ2 IRQ9. För kompatibilitet med DOS-drivrutiner som fortfarande förväntar sig IRQ2, har en hanterare lagts till som omdirigerar IRQ9 till den ursprungliga IRQ2-hanteraren.
I PC BIOS (och därmed DOS) mappar traditionellt master 8259 avbrottsbegäranden (IRQ0-IRQ7) för att avbryta vektorerna INT08-INT0F respektive. Och 8259A slavbegäranden (i PC/AT och vidare) IRQ8-IRQ15 till INT70-INT77. Detta gjordes trots att de första 32 avbrottsvektorerna är reserverade för interna processoravbrott (av någon anledning ignorerade PC-arkitekturen detta faktum). Därför mappar de flesta andra operativsystem avbrott (åtminstone för 8259-mastern) till ett annat intervall av avbrottsvektorer.
De flesta andra operativsystem tillåter andra driftsätt för 8259A, såsom automatisk avbrottsavslutning. Detta är särskilt viktigt för moderna x86 -baserade system , där en betydande mängd tid kan slösas bort på I/O-utrymmeslatens på 8259-operationer. Det tillåter också att ytterligare timingoptimeringar som kritiska sektioner introduceras på multiprocessorsystemenheter 8259.
Eftersom ISA-bussen inte stöder nivåavbrott för PC/XT-, PC/AT- och MCA-system måste 8259A ställas in från kant till kant. På nyare EISA , PCI och senare finns det Edge/Level Control Register (ELCR) som låter dig ställa in driftsättet för varje IRQ-linje individuellt, vilket effektivt eliminerar behovet av att ställa in 8259-driftläget för sådana system med ISA-buss .
Dessa register finns på adresserna 0x4d0 och 0x4d1 i x86 I/O-adressutrymmet. Deras dimension är 8 bitar, varje bit motsvarar en av IRQ 8259A-linjerna. När biten är inställd triggas IRQ-linjen på nivån, annars på framsidan.
Under vissa förhållanden kan 8259A generera ett spontant avbrott, vanligtvis IRQ7 och, mycket mindre ofta, IRQ15.
I det första fallet återställs IRQ-linjen innan den kvitteras. Detta kan bero på brus på IRQ-linjerna. I kant-till-kant-läge måste bruset hålla linjen högt i 100 ns (minsta tid för att skriva till en IRR-flip-flop). När bruset är borta kommer pull-up-motståndet att dra ner IRQ-nivån, vilket genererar ett falskt avbrott. Vid nivådrift kan brus orsaka ett högt tillstånd på INTR-linjen. När systemet utfärdar en begäran om avbrottsbekräftelse kommer 8259 inte att ha data för att aktivera det och kommer att utfärda IRQ7 (standardvärdet). Så här kan falska IRQ7 visas.
Ett liknande fall kan inträffa när 8259A-avmaskningen och IRQ-linjeåterställningen inte är noggrant synkroniserade. I många system återställs IRQ-linjen av ett I/O-adressutrymmesskrivkommando, och processorn väntar inte på att instruktionen ska nå I/O-enheten. Om processorn fortsätter och avmaskerar lämplig 8259A-nivå innan IRQ-linjeåterställningen från enheten sker, kommer 8259A att utfärda en INTR-avbrottsbegäran igen. När processorn känner igen denna INTR-begäran och utfärdar en bekräftelse, kan IRQ-linjen återställas och 8259A kommer att returnera en spontan IRQ7.
Det andra fallet liknar det första, förutom att den angivna situationen gäller slavanordningen, dvs när master IRQ2-linjen är aktiv i det ögonblick då slav-8259 IRQ-linjerna är inaktiva av fallande flank av avbrottskvittering (INTA). I det här fallet kommer spontan IRQ15 att visas, men detta är ett extremt sällsynt fall.
Därför, när du arbetar med IRQ7, rekommenderas det att kontrollera i början av avbrottshanteraren för återinträde och kontrollera ISR 8259A-registret för att fastställa att detta inte är ett spontant avbrott, utan ett avbrott som faktiskt kom från IRQ7-linjen.
IBM PC/XT - arkitekturen hade bara en 8259A avbrottskontroller, och från och med IBM PC/AT fick systemen en andra, slav 8259A. IRQ0...IRQ7-linjerna är IR0..IR7-linjerna för master 8259A, och IRQ8...IRQ15-linjerna är IR0..IR7-linjerna för slaven 8259A. IRQ0...IRQ15 är ISA-busslinjerna till vilka 8259A historiskt har varit ansluten.
Ursprungligen var IRQ7 det vanliga valet för användning i ljudkort, men IRQ5 användes senare i denna roll för att undvika konflikt med LPT-skrivarporten. Seriella portar inaktiverades ofta för att frigöra IRQ-linjen för en annan enhet.