Lektion 4 - SMD006/SMD117 Fredrik Bengtsson LTU bson@sm.luth.se February 24, 2002 Fredrik Bengtsson 1
Lektion 4 - översikt C och C-kärnan Drivrutiner - allmänt Kommunikation med hårdvara Drivrutiner - aktiva, passiva Exempel på drivrutiner Labmiljön - Kompilator, etc. Labben - Den fruktade pendeln Fredrik Bengtsson 2
C - headerfiler En headerfil (eller h-fil) är en fil som deklarerar de funktioner (bl.a.) som exporteras av en c-fil. Deklarationer i en h-fil kan (svagt) liknas vid gränssnitt (interfaces) i java. H-filen deklarerar de funktioner som vi vill (och får) använda från vårt program Ett program består vanligtvis av flera c-filer. H-filerna är gränssnitten mellan dessa. Fredrik Bengtsson 3
Exempel - headerfil /* myfile.h */ int myfunction(void); /* myfile.c */ int myfunction(void) { return 3; } /* main.c */ #include "myfile.h" int main(void) { printf("%i", myfunction()); } Fredrik Bengtsson 4
C - bitvisa operatorer Bitvis AND: & Bitvis OR: Bitvis NOT: ~ Bitvis XOR: ^ Bitvis vänsterskift: << Bitvis högerskift (aritmetisk): >> Fredrik Bengtsson 5
Exempel - skift och bitmaskning Vänsterskift (obs. aritmetisk) 0110 >> 1 == 0011 1110 >> 1 == 1111 Högerskift 0110 << 1 == 1100 Maskning 0111 & 1101 == 0101 Fredrik Bengtsson 6
Kodexempel - skift och bitmaskning int main(void) { int a = 0x7; /* a = 0111 */ int b = a & (1 << 2); /* maska ut bit nr. 2 (tredje biten); b = 0100 */ return 0; } Fredrik Bengtsson 7
C-kärnan Stöd för sendwait() och signal(). Inga semaforer eller andra primitiv. Stöd för timer (Periodic, NoTimer) Flera processer (som javakärnan) init-mode och normal-mode (som javakärnan) Avbrottshantering (createinterrupthandler) Tillgång till kärnan genom: #include "k.h" #include "kio.h" kprintf() ersätter printf() Fredrik Bengtsson 8
Utskrifter och hexadecimala tal Hexadecimala tal börjar med 0x (ex. 0xF3). Skriva ut heltal (int) (ex. skriver ut talet tal) kprintf("talet är %i", tal) Skriva ut flyttal (float) (ex. skriver ut talet tal) kprintf("talet är %f", tal) Fredrik Bengtsson 9
sendwait() och signal() i C-kärnan Java: svar = tillprocess.sendwait(händelse, meddelande) C: sendwait(tillprocess, händelse, meddelande, svar) Java: tillprocess.signal(händelse) C: signal(tillprocess, händelse) Fredrik Bengtsson 10
receive() och reply() i C-kärnan Java: msg = receive() sändare = msg.getprocess() meddelande = msg.getmessage() C: sändare = receive(meddelande) Java: sändare.reply(meddelande) C: reply(sändare, meddelande) Fredrik Bengtsson 11
Skapa processer i C-kärnan Skapa processer med createstdprocess() (init mode) Process processreferens = createstdprocess( namn, funktion, TimerMode) namn är processens symboliska namn. funktion motsvarar run() i java (kan väljas godtyckligt) TimerMode: NoTimer eller Periodic Processerna startar automagiskt när main() exekverat klart. Fredrik Bengtsson 12
Timern i C-kärnan NoTimer Ingen timer (allt funkar som vanligt) Periodic Kärnan skickar händelsen TimeEvent med med visst intervall till processen. settimebase(ms) specificerar intervallet mellan händelser. settimebase(0) stänger av timern. Timern är avstängd från början. Händelserna skickas även om vi inte tar emot dem (köas). Fredrik Bengtsson 13
Drivrutiner - översikt En drivrutin är ett program som interagerar (kommunicerar) med hårdvaran och tillhandahåller ett abstrakt gränssnitt mot densamma. Programvara (klient) använder drivrutinens gränssnitt för att kommunicera med hårdvaran. Det finns aktiva och passiva drivrutiner. En aktiv drivrutin tar själv initiativ till komunikation med klienten (programmet som använder drivaren). Typiskt används callback för detta. En passiv drivrutin tar aldrig eget initiativ till komunikation. Drivrutinen tillhandahåller vanliga funktioner. Fredrik Bengtsson 14
Drivrutiner och hårdvara Aktiv hårdvara Tar själv initiativ till kommunikation med drivrutinen. Använder vanligtvis avbrott för detta. Passiv hårdvara Tar aldrig initiativ till kommunikation (drivrutinen initierar alltid). Kan använda avbrott, men avbrotten sker då som en direkt konsekvens av ett anrop från drivrutinen. Man kan ha godtycklig kombination av aktiv/passiv drivrutin och aktiv/passiv hårdvara. Fredrik Bengtsson 15
Avbrott Ett avbrott är en händelse i hårdvara som tillkallar mjukvarans (drivrutinens) uppmärksamhet. Typiskt börjar man exekvera ett förutbestämt avsnitt kod (avbrottshanteraren) som vidtar åtgärd. Avbrottshanteraren är en vanlig funktion. Drivrutinen avgör vilken funktion som är avbrottshanterare. Avbrottshanteraren exekverar inte i någon vanlig process, utan kärnan exekverar avbrottshanteraren när ett avbrott inträffat. Avbrottshanteraren uppmärksammar drivrutinen på vad som hänt. Avbrottshanterare skall hållas mycket korta. Fredrik Bengtsson 16
Callback Callback är när en drivrutin anropar en funktion som klienten bestämt (klienten implementerar callbackfunktionen). Callbackfunktionen är en vanlig funktion. Callbackfunktionen exekverar i drivrutinens process. Callback påkallar klientens uppmärksamhet (drivrutinen initierar komunikation). Callbackfunktioner skall hållas mycket korta. Fredrik Bengtsson 17
Callback och avbrott Avbrott komunicerar... Från hårdvara till drivrutin. Callback komunicerar... Från drivrutin till klient. Jämför med vanliga funktionsanrop från klient till drivrutin och I/O-anrop från drivrutin till hårdvara. Avbrott och callback blir liksom åt andra hållet. Hårdvara är inte aktiv bara för att den använder avbrott Avbrottet kan vara ett omedelbart resultat av drivrutinens handling. Fredrik Bengtsson 18
Avbrott i C-kärnan Installeras avbrottshanterare: createinterrupthandler(intvec, funktion, process). funktion är den funktion som vi vill använda som avbrottshanterare. intvec är avbrottsvektorn vi vill associera funktionen med (inte lika med IRQ-nummer). IRQ 0-7 motsv. av avbrottsvektor 8-15. Avbrottshanteraren returnerar (med return) en mängd av händelser (ev0-ev15) som kärnan skickar till processen process. process är typiskt drivrutinens process. Fredrik Bengtsson 19
Kommunikation med hårdvara I/O-portar En I/O-port kan betraktas som en informationskanal till/från hårdvaran. Man kan antingen läsa eller skriva till/från en I/O-port. Ett system har i allmänhet många I/O-portar. En del portar är read-only. En del portar är write-only. Hårdvaran kan se om vi läser eller skriver en port. En port kan ha olika funktioner vid läsning resp. skrivning (bestäms av hårdvaran). Fredrik Bengtsson 20
I/O-portar i C Man skriver till en I/O-port med outportb(port, värde) Man läser från en I/O-port med värde=inportb(port). port är I/O-portens nummer (0-65535). värde är värdet att läsa från/skriva till porten (0-255). Fredrik Bengtsson 21
Exempel - drivrutiner Passiv hårdvara: Ett steglöst reglage som vi vill veta läget på (typ volymkontroll). Två register: reg0 (I/O-port 7): skriv=initiera hårdvaran, läs=stäng ner hårdvaran reg1 (I/O-port 8): läs=läget på reglaget (0-255). Aktiv hårdvara: Samma som den passiva, men avbrott (IRQ) 7 inträffar när läget ändras. Fredrik Bengtsson 22
Exempel - drivrutiner Skriv en passiv drivrutin för den passiva hårdvaran. Skriv en passiv drivrutin för den aktiva hårdvaran. Skriv en aktiv drivrutin för den aktiva hårdvaran. Skriv en aktiv drivrutin för den passiva hårdvaran. Fredrik Bengtsson 23
Labmiljön Labben äger rum i A1505 och A1506. Kod till labbet är 5782. Kompilatorn är Borland C (en gammal). Komma igång: Exekvera G:\SMD006\ Installera allt. Kompilatorn finns på D:\SMD006\TC.BAT. Er hemkatalog finns på H:. 16 maskiner - 140 personer - dela upp er! Fredrik Bengtsson 24
Kompilatorn Skapa ett nytt projekt (open project). Addera dom c- och obj-filer som ska vara med (da.c, ad.c, control.c, menu.c, kio.obj, k.obj, regulat.obj). Glöm inte att spara filerna på ert konto (H:). Fredrik Bengtsson 25
Labben - Pendeln (lyftkransproblemet) En pendel på en tralla på en skena. Motor flyttar trallan (och pendeln). Pendeln börjar gunga. Vi vill stabilisera pendeln. Vi behöver en regulator. Färdig reglerfunktion (puh!). Fredrik Bengtsson 26
Labben - uppgift Två drivrutiner En för utgång (DA) En för ingång (AD) Regulator (färdig reglerfunktion) Användargränssnitt (meny). Man ska kunna flytta pendeln från menyn och pendeln ska då stabilisera sig fort (sluta gunga). Det finns en (1) pendel. Prova att låta pendeln stå vid en maskin och gå sedan till denna och testa. Fredrik Bengtsson 27