Dr.Godfried-Willem RAES
Kursus Experimentele Muziek: Boekdeel 1: Algoritmische Kompositie
Hogeschool Gent - Departement Muziek en Drama
1190:
Het gebeurt eigenlijk betrekkelijk zelden dat komputers gebruikt worden als op zichzelf staande eenheden. Nagenoeg elk praktisch komputergebruik, gaat gepaard met allerhande aansluitingen van de komputer aan randapparatuur (periferie-apparatuur). De meeste van deze randapparaten zijn eigenlijk op zichzelf ook komputersystemen, maar dan wel zgn. 'dedicated systems'.Zij worden immers gebouwd voor het optimaal uitvoeren van een bepaalde taak. Voorbeelden zijn printers , plotters , midi-synthesizers , terminals , modems, robots, schakelsystemen ...
Het probleem dat zich hierbij voordoet is dat in de meeste gevallen, deze periferie apparatuur de informatiestroom die zij ontvangen vanuit de komputer niet aan hetzelfde tempo kunnen verwerken. Nemen we het voorbeeld van een printer : het zal duidelijk zijn dat de bvb. 240 tekens per sekonde waartoe een snelle printer in staat is, bijzonder traag zijn in vergelijking met de bvb. 600.000 tekens per sekonde die de komputer kan verzenden. Bovendien is de tijd die de printer nodig heeft voor het drukken van een teken ook helemaal niet konstant ! Moet er bvb. aan de kantlijn worden begonnen , dan vraagt deze beweging van de printerkop natuurlijk wat extra tijd. Ook voor het doorschuiven van een nieuw blad papier is heel wat meer tijd nodig. Zouden we dus de komputer zo programmeren dat hij slechts 240 tekens per sekonde naar de printer stuurt, zodat hij zich voor de resterende tijd met andere zaken kan bezighouden, dan nog zou het alras spaak lopen.Bekeken vanuit het standpunt van de processor, dient eigenlijk ook de komputer zelf te worden gezien als bestaande uit een processor en een interne-periferie. (Cfr. begin van deze kursus). Immers ook floppy-drives, harddisks, video-kaarten, de interne klok zijn vanuit processor oogpunt bekeken, periferie-apparatuur. Omdat deze komponenten zich echter in dezelfde kast bevinden als de processor, en de komputer zonder deze komponenten tot omzeggens niets in staat zou zijn, blijven we daar meestal niet bij stilstaan, en beschouwen we de processor samen met deze interne periferie als 'de komputer' tout-court. Dit overigens niet geheel ten onrechte, want alle problemen van onderlinge kommunikatie en timing daarvan horen in een goed ontworpen komputer opgelost te zijn door enerzijds de interne hardware en anderzijds de BIOS, een stukje in ROM opgeslagen software voor deze I/O operaties.
Het is precies om de problemen in de kommunikatie tussen processors en randapparatuur op te lossen dat men de interrupt-techniek heeft bedacht.
1.NON-MASKABLE en MASKABLE INTERRUPTS
Definitie :
Een interrupt is een digitaal signaal dat door een op een processor aangesloten periferie-apparaat wordt opgewekt, en waarmee dit laatste de aandacht van de processor kan vragen. Wanneer de processor een interrupt ontvangt, dan stopt hij onmiddelijk met de opdracht waarmee hij bezig was - slaat het adres van die opdracht op in het geheugen opdat hij die later verder zou kunnen afwerken - en springt naar een software-routine die een reeks instrukties omvat waarmee passend op het interruptsignaal kan worden gereageerd.
Een hardware interrupt-signaal is slechts 1 bit groot, en kan dan ook slechts waar of vals zijn.
Zo genereert een printer bvb. een interrupt signaal, telkens hij klaar is om nieuwe data van de komputer te ontvangen.
Aangezien , rekening houdend met de interne-periferie van de komputer, we steeds verschillende periferie-apparaten aangesloten hebben, zullen er ook verschillende interruptsignalen naar de processor worden gestuurd. Hierbij is het best mogelijk, dat interrupts vanuit verschillende oorsprong de processor tegelijkertijd bereiken. Aangezien de processor slechts 1 ding tegelijkertijd kan doen, zou dit problemen opleveren. Daarom bestaat er in elk komputersysteem een hierarchie van interrupt-signalen. In een 80286 systeem, worden de mogelijke interrupts genummerd van 1 tot 10 , en krijgt het laagste volgnummer de hoogste prioriteit , d.w.z. dat die ook het eerst door de processor zal worden afgehandeld. Sommige interrupts kunnen via programmering worden uitgeschakeld , andere niet. Niet uitschakelbaar zijn op de meeste komputers bvb. de interrupts die intern wordt opgewekt wanneer er een geheugenchip verstek laat gaan. In vakjargon heet dit dan een 'non- maskable interrupt'.
Niet uitschakelbare interrupts zijn volledig bepaald door de hardware van het systeem. De processor heeft enkele speciale pennen waarop dit soort interrupt-signalen worden aangesloten.
Ook 'maskable-interrupt' zijn in de hardware vastgelegd, maar kunnen via programmering worden opgeheven.
Het grote voordeel van beide soorten hardware-interrupts is dat we bij het schijven van een programma waarin van periferieapparatuur gebruik wordt gemaakt , helemaal geen rekening hoeven te houden met de aandacht die de processor dient te hebben voor de gang van zaken in zijn periferie. Dit uiteraard vooropgesteld, dat we ofwel zelf voorzagen in een machinetaalsubroutine waarin de hardware-interrupt wordt afgehandeld, ofwel gebruik maken van een van de vele ingebouwde interrupt-handlers van het besturingssysteem. Wanneer we een hogere programmeertaal gebruiken ( zoals bvb. Basic) dan zijn vele van deze interrupt-handlers automatisch geimplementeerd in de instrukties van de taal zelf. De LPRINT instruktie omvat bvb. de interruptroutines voor de printerbesturing zodat we er zelf helemaal geen rekening mee hoeven te houden.
Omdat er een hierarchie bestaat van interrupts, noemt men het interruptsignaal naar de komputer vaak een 'interrupt-request', immers , of de komputer onmiddelijk op de interrupt reageert of niet hangt volledig af van van welke andere interrupts hem nog werden aangeboden. Voor alle hardware interrupts geldt echter dat de processor steeds het ontvangen van een interrupt signaal akteert, ook wanneer de vraag tot interrupt niet onmiddelijk kan gehonoreerd worden. Alle interrupt-requests worden uiteindelijk in hun hierarchische volgorde afgehandeld.
Op komputers volgens de IBM-PC architektuur zijn krachtens de hardware slechts een beperkt aantal hardware interrupts mogelijk (IRQ0 tot IRQ15):
Zij zijn georganiseerd alsvolgt:
Eerste reeks, (%=gebruik makend van en beschikbaar via de voorziene kontakten op een ISA 8-bit slot:
I/O-adres (mask-register)
IRQ0 Timer Interrupt [win386.exe] &H21 - bit 0
IRQ1 Keyboard Interrupt &H21 - bit 1
IRQ2 % omgeleid van IRQ9 [VGA-kaart] &H21 - bit 2
IRQ3 % COM-poort 2/4 &H 21 - bit3
IRQ4 % COM-poort 1/3 &H21 -bit 4
IRQ5 % LPT2 - vaak beschikbaar voor Midi-gebruik &H21 - bit 5
aanbevolen voor modems op Com3
IRQ6 % Floppy Disk-drive &H21 - bit 6
IRQ7 % LPT1 &H21 - bit 7
Tweede reeks, alleen beschikbaar via de kontakten voorzien op een ISA 16-bit slot
IRQ8 Real Time Clock
IRQ9 Afgeleid naar IRQ2
IRQ10 % Netwerk-kaarten (Ethernet)
IRQ11 % goed alternatief voor Midi-gebruik
IRQ12 %
IRQ13 Math Coprocessor
IRQ14 % Harddisk IDE controller [PCI slot]
IRQ15 % evt. 2e harddisk IDE controller
Wanneer een dergelijk 1-bit signaal aan de interrupt controller (een chip) wordt aangeboden dan -mits het overeenkomstige bit is geset op het kontrole I/O adres- springt de IP (instruktie pointer) van de processor naar een adres in het geheugen waar de uit te voeren instrukties terug te vinden zijn.
2.SOFTWARE-INTERRUPTS
Een geheel andere kategorie van interrupts is die van de Soft-Interrupts. Dit zijn volledig in software geimplementeerde interruptstrukturen. De meeste horen toe aan het operating system (DOS). Wanneer we gedurende het gehele verloop van een programma de eis stellen dat vanzodra een bepaalde variabele een waarde x bereikt , het programma steeds ongeacht zijn huidige taak, naar een bepaalde subroutine of naar een bepaalde geheugenplek waar een reeks specifieke opdrachten opgeslagen is, dient te springen, dan hebben we een software-interrupt geimplementeerd. Dit wordt ook vaak een 'user- interrupt' genoemd. In het algemeen dient hierbij te worden gewezen op het feit dat dit soort interrupts circa 100 keer trager worden afgehandeld dan in hardware geimplementeerde interruptstrukturen. Immers het programma dient regelmatig na te geen of aan de bepaalde soft-interrupt voorwaarde voldaan is. Het is dus niet de interruptkonditie zelf die het initiatief neemt. Het werken met hardware interrupts vergt echter een grondige kennis van de hardware van de machine en van de machinetaal van de processor.
In geavanceerde Basic-dialekten bestaan voor software- of user-interrupts enkele speciale instrukties :
ON BREAK gfa
schakelt het onderbreken van het programma aan wanneer Ctrl-Alt-Del wordt ingedrukt.
ON BREAK GOSUB ... gfa
verwijst naar een bepaalde subroutine wanneer Ctrl-Alt-Del wordt ingedrukt
ON BREAK CONT gfa
hiermee wordt het reageren op voormelde toetskombinatie uitgeschakeld.
ON ERROR gfa
schakelt foutmeldingen aan
ON ERROR GOSUB ... gfa
verwijst bij het optreden van een fout naar een specifieke subroutine
RESUME gfa
instruktie waarmee een on error subroutine verlaten kan worden. De machine springt terug naar de foutveroorzakende routine. De subroutine dient uiteraard de oorzaak van de fout te hebben weggenomen.
RESUME NEXT gfa
hiermee wordt naar de instruktie gesprongen die volgt op diegene die de fout veroorzaakte
EVERY ... GOSUB gfa
Hiermee kan om de ... kloktikken ( 200 per sekonde in gfa) naar een subroutine gesprongen worden. De minimale waarde is echter 4 , zodat de minimum tijd op 1/50 sekonde uitkomt.
EVERY STOP gfa
Deze instruktie schakelt vorige soft-interrupt weer uit.
EVERY CONT gfa
Hiermee wordt ze opnieuw aangezet.
AFTER ...GOSUB gfa
Hiermee wordt na het verlopen van x kloktikken eenmaal naar een bepaalde subroutine gesprongen
AFTER STOP gfa
Schakelt de after... interrupt weer uit
AFTER CONT gfa
Schakelt de after... interrupt opnieuw aan.
Opgelet echter: in tegenstelling met wat men op grond van de analogie in de vorm en syntax zou vermoeden , is de instruktie ON ... GOSUB geen software interrupt! Het is een instruktie die meervoudige vertakkingen in het oproepen van subroutines mogelijk maakt. Deze instruktie wordt slechts eenmaal uitgevoerd, nml. op de plek in het programma waar ze voorkomt.
3.POLLING
Een heel andere aanpak van het kommunikatieprobleem tussen komputer en periferie, bestaat erin een programma te schrijven dat aan 'POLLING' doet. In het nederlands zouden we dit nog het best kunnen omschrijven als 'pols- techniek'. Hierbij gaat de komputer immers , op momenten wanneer het hem volgens het programma goed uitkomt, polsen bij het periferieapparaat om te weten of er iets te doen valt. Deze techniek kan alleen worden gebruikt wanneer het periferie-apparaat is uitgerust met buffers die het toelaten met de informatieuitwisseling te wachten tot de komputer erom verzoekt , en dit zonder daarbij informatie verloren te laten gaan. Een goed voorbeeld van de polling techniek vinden we in het inlezen door de komputer van midi- informatie afkomstig van een midi-keyboard.
Een uitgewerkt voorbeeld hiervan kwamen we eigenlijk reeds tegen bij onze bespreking van real-time routines, waarbij midi-bytes afkomstig van een keyboard dienden te worden gelezen. Het programma was immers in zijn geheel vervat in een lus:
LEES: ' Atari-code
WHILE INP(-3)
BYTE = INP(3) + 256
...
WEND
WHILE NOT INP(-3)
T=TIMER#
WEND
GOTO LEES
De while-loop 'polst' steeds maar de midi-ingang naar het al dan beschikbaar zijn van een inleesbaar byte.
Het binnen een lus polsen van een mogelijke input vormt eigenlijk zowat de eerste aanzet voor elke denkbare multitasker in software. Hierbij bestaat het hoofdprogramma (de main-module) steeds uit een lus, waarin b innen bepaalbare periodiciteiten, taken worden uitgevoerd.
bvb.:
DO
Midi -1 ' midi-input polling
....
....
i&=(i&+1) AND &H3FFF ' loop-counter
K$=INKEY$: IF k$=CHR$(27) THEN EXIT DO 'keyboard polling
LOOP
Voor een uitgewerkt voorbeeld van een multitasker met polling verwijzen we naar de kode voor de kompositie <A Book of Moves> (files: BOM.BAS) of naar de kode in het multitasking pakket <GMT>.
4. INTERRUPT HANDLERS
Het zelf programmeren van interrupt-handlers vergt het gebruik van machinetaal (assembler) en vereist een grondige kennis van de hardware van de machine en de instruktieset van de erin gebruikte processor. Het zelf schrijven van dergelijke kode valt buiten het bestek van deze kursus.
Wie op eigen houtje -uitgaande van een grondige kennis van Basic- iets op dit gebied wil wagen, raad ik aan de assembler extenties van QBX V7.1 grondig te besturen. Hierdoor wordt het immers mogelijk om zelfs binnen een basic programma machine interrupt te setten en te resetten, processor register uit te lezen e.d.m. Ook daarvoor is kennis van assembler echter een vereiste.
Tenzij men zelf heel snelle hardware ontwerpt en bouwt, kan ik me overigens niet voorstellen het ooit echt nodig te hebben. Voor alle gangbare periferieapparatuur (muizen, joysticks, modems, netwerkkaarten...) zijn libraries beschikbaar waarbinnen de eventueel noodzakelijke interruptafhandeling vervat is.
Filedate:940501
<Naar inhoudstafel kursus>
Naar homepage Dr.Godfried-Willem RAES