2G1502 Datorteknik allmän kurs 16 apr -17 2G1502 Datorteknik allmän kurs Föreläsning 5 In- och utmatning, I/O Programstyrd pollning 16 April 2017 2G1502, föreläsning 5, ht2003
Föreläsning 5 Innehåll, rubriker I/O-enheter allmänt read och write, adressering Parallellport, funktion, pollning Serieport, funktion, pollning Timer, funktion, pollning Eko-program Kommunikations-program Paritetskontroll 16 April 2017 2G1502, föreläsning 5, ht2003
Litteraturhänvisningar Kursbokens avsnitt 1.4 Maskinvara 2.6 Bussar och enkel I/O-hantering 5.2 Koppling till omvärlden, sid 151-156 9.4 Kommunikation mellan processor ... 4.5 Subrutiner och stack 4.6 Praktisk assemblerprogrammering 16 April 2017 2G1502, föreläsning 5, ht2003
Viktiga delar i en dator CPU BUS I/O MEM 16 April 2017 2G1502, föreläsning 5, ht2003
Programexekvering i två steg EXECUTE FETCH (update PC) (decode) 16 April 2017 2G1502, föreläsning 5, ht2003
Bus Data Transfer Memory Read Master t.ex. CPU Slave t.ex. Memory Master levererar Adress Master levererar Rd-Request Slave levererar Data Slave levererar en Rd-Acknowledge 16 April 2017 2G1502, föreläsning 5, ht2003
Bus Data Transfer Memory Read Address Rd Data RdAck Vad händer om RdAck uteblir ? 16 April 2017 2G1502, föreläsning 5, ht2003
Bus Data Transfer Memory Write Master t.ex. CPU Slave t.ex. Memory Master levererar Adress Master levererar Data Master levererar Wr-Request Slave levererar en Wr-Acknowledge 16 April 2017 2G1502, föreläsning 5, ht2003
Bus Data Transfer Memory Write Address Wr Data WrAck Vad händer om WrAck uteblir ? 16 April 2017 2G1502, föreläsning 5, ht2003
Två minnen kan man ha ! På olika adresser ! CPU BUS MEM MEM Adress ditten Adress datten 16 April 2017 2G1502, föreläsning 5, ht2003
Två minnen kan man ha ! På olika adresser ! CPU BUS ? ? MEM MEM Adress ditten Adress datten Adress-avkodare 16 April 2017 2G1502, föreläsning 5, ht2003
Flera Slave kan man ha ! På olika adresser ! CPU BUS ? ? I/O MEM Adress ditten Adress datten Adress-avkodare 16 April 2017 2G1502, föreläsning 5, ht2003
Flera Master kan man ha ! På olika vadådå! BUS ? ? I/O MEM Adress ditten Adress datten Adress-avkodare 16 April 2017 2G1502, föreläsning 5, ht2003
Bus-ledningar Adress, för att kunna peka ut varje byte Data, lagom bred minst 8 bitar Kontroll Read och Write eller RD/WR och DS Ack för Rd och Write, kan vara gemensam Övrigt som jord, Vcc, Reset etc. 16 April 2017 2G1502, föreläsning 5, ht2003
Bus-ledningar (forts.) Långsam Slave kan bromsa Fördröj Acknowledge eller Inför speciell Hold-signal Inför tidövervakning, Time-Out Time-Out för Ack är Bus Error (el.dyl.) 16 April 2017 2G1502, föreläsning 5, ht2003
Bus-ledningar (forts.) Om det finns fler än en Master krävs Bus Arbiter (bus-fördelare) Varje Slave måste ha adressavkodare så att högst en enhet svarar på request Referens av oanvänd adress medför ??? 16 April 2017 2G1502, föreläsning 5, ht2003
Två typer av adressering Memory Mapped Memory och I/O har olika adresser Samma kontroll-signaler används till minne och I/O I/O Mapped Memory och I/O kan ha samma adresser Olika kontroll-signaler används till minne och I/O 16 April 2017 2G1502, föreläsning 5, ht2003
Parallell-port Parallellport brukar vara multipel av 8 signaler/pinnar Signalriktning kan vara programmerbar separat för varje signal/pinne Inport består normalt av grindar Utport består normalt av register Handskakningssignaler kan finnas 16 April 2017 2G1502, föreläsning 5, ht2003
IN-port & & & . . . IN-DATA IBF WR IBF WR RD INn Dn RD IN-PORT IBF IN1 Q Q’ set clear IBF WR RD INn & Dn RD IN-PORT . . . IBF IN1 & D1 Data IN0 & D0 Control CPU-BUSS Adress RD 16 April 2017 2G1502, föreläsning 5, ht2003
UT-port . . . OBE RD WR UT-DATA OBE RD Dn UTn WR UT-PORT D1 UT1 OBE Q Q’ set clear OBE RD WR UT-DATA OBE RD Dn Q Q’ D cl UTn . . . WR UT-PORT D1 Q Q’ D cl UT1 OBE Data Control CPU-BUSS D0 Q Q’ D cl UT0 Adress WR 16 April 2017 2G1502, föreläsning 5, ht2003
Nios button_pio Memory Mapped Addresses Read only SW7 SW6 SW5 SW4 DIP 1..8 0x470 0x474 0x478 0x47C 31 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 Text som beskriver button_pio 0x470-0x47F 16 April 2017 2G1502, föreläsning 5, ht2003
släppt knapp ger värdet 1 Nios button_pio Memory Mapped Addresses SW4 SW5 SW6 SW7 1 2 3 4 5 6 7 8 SW7 SW6 SW5 SW4 SW3 SW2 0x470 Read only släppt knapp ger värdet 1 DIP 1..8 0x470 0x474 0x478 0x47C 31 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 Adresser: button_pio 0x470-0x47F (ej komplett information) 16 April 2017 2G1502, föreläsning 5, ht2003
Nios seven_seg_pio Memory Mapped Addresses 1 2 3 4 5 6 7 5 3 4 2 1 6 . 7 5 3 4 2 1 6 . 7 Write only0 tänder ett segment 0x420 0x424 0x428 0x42C 31 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 Adresser: seven_seg_pio 0x420-0x42F (ej komplett information) 16 April 2017 2G1502, föreläsning 5, ht2003
Parallell-port (forts.) Handskakningssignaler IBF - Input Buffer Full OBE - Output Buffer Empty IBF och OBE är tillgängliga för program IBF och OBE är tillgängliga för hårdvara 16 April 2017 2G1502, föreläsning 5, ht2003
Parallell-port (forts.) Handskakningssignaler IBF - Input Buffer Full OBE - Output Buffer Empty Aktiv signal IBF (full inport) är en begäran om åtgärd av CPU/program Aktiv signal OBE (tom utport) är en begäran om åtgärd av CPU/program 16 April 2017 2G1502, föreläsning 5, ht2003
Parallell-port (forts.) Handskakningssignaler IBF ettställs normalt då omgivningen levererar nya data till inporten IBF nollställs/kvitteras av program, t.ex. vid läsning av inport 16 April 2017 2G1502, föreläsning 5, ht2003
Parallell-port (forts.) Handskakningssignaler OBE ettställs normalt då omgivningen har tagit hand om utdata OBE nollställs/kvitteras av program, t.ex. vid skrivning av utport 16 April 2017 2G1502, föreläsning 5, ht2003
Handskakning med IBF/OBE Flödes-schema, invänta ready (blockerande I/O) PÅHOPP AVHOPP IBF=1? Nollställ IBF LÄS INDATA LÄS IBF JA NEJ INHOPP UTHOPP OBE=1? Nollställ OBE SKRIV UTDATA LÄS OBE JA NEJ 16 April 2017 2G1502, föreläsning 5, ht2003
Handskakning med IBF/OBE Flödes-schema, direkt retur (icke blockerande I/O) PÅHOPP AVHOPP IBF=1? Nollställ IBF PAR:= INDATA LÄS IBF JA NEJ PAR:= -1 PÅHOPP AVHOPP OBE=1? Nollställ OBE och PAR SKRIV UTDATA LÄS OBE JA NEJ PAR:= -1 16 April 2017 2G1502, föreläsning 5, ht2003
getdata från Inport rutin med pollning av statusbit (blockerande I/O) ; getdata(reg) define indata 0x... define status 0x... define ibfmask 0x... getdata: load reg1 <-- status and reg1 <-- ibfmask beq getdata load reg <-- indata return 16 April 2017 2G1502, föreläsning 5, ht2003
putdata till Utport rutin med pollning av statusbit (blockerande I/O) ; putdata(data) define utdata 0x... define status 0x... define obemask 0x... putdata:load reg1 <-- status and reg1 <-- obemask beq putdata store utdata <-- data return 16 April 2017 2G1502, föreläsning 5, ht2003
Serie-port Används för seriell kommunikation Vanligt är asynkron kommunikation, ett tecken kan komma när som helst Synkron kommunikation finns även, det kommer alltid en ström av bitar 16 April 2017 2G1502, föreläsning 5, ht2003
Serieport Sändare Mottagare Parallella data in skiftregister Seriell kabel skiftregister Parallella data ut 16 April 2017 2G1502, föreläsning 5, ht2003
Serie-port Asynkron kommunikation Varje tecken (bokstav) sänds för sig Ett tecken kodas ofta med 7 bitars ASCII Dessutom tillkommer 1 startbit 1 paritetsbit (opt) udda eller jämn paritet 1 eller 2 stoppbitar 16 April 2017 2G1502, föreläsning 5, ht2003
Avkänningstidpunkter Synkroniseringsflank Serie-port Asynkron kommunikation Avkänningstidpunkter x x x x x x x P 1 1 1 1 7-bitars ASCII 1 startbit (0) 1 Paritetsbit (P) Stoppbit(ar) (1) Synkroniseringsflank 16 April 2017 2G1502, föreläsning 5, ht2003
Serie-port Asynkron kommunikation Bithastighet (kallas felaktigt för baudrate) Teckenlängd (5, 6, 7, 8, …) Paritet On/Off, Even/Odd Antal Stoppbitar (1, 1½, 2) (antal perioder mellan sända tecken) 16 April 2017 2G1502, föreläsning 5, ht2003
getchar från serieport rutin med pollning av statusbit ; int getchar(void) define data ... define status ... define ibfmask ... getchar: load* tmpreg <-- status andi* tmpreg <-- ibfmask beq* getchar load* outreg <-- data return* ;* betyder macro 16 April 2017 2G1502, föreläsning 5, ht2003
putchar till serieport rutin med pollning av statusbit ; putchar(data in inreg) define data ... define status ... define obemask ... putchar:load* tmpreg <-- status andi* tmpreg <-- obemask beq* putchar store* data <-- inreg return* 16 April 2017 2G1502, föreläsning 5, ht2003
Nios uart_0 Memory Mapped Addresses TxDATA (WR) RxDATA (RD) uart_0 31 16 15 8 7 6 0 0x4000x404 0x408 STATUS TxRdy (OBE) RxRdy (IBF) uart_1_debug 0x4C0-4DF uart_serialport 0x4E0-4EF 16 April 2017 2G1502, föreläsning 5, ht2003
getchar från serieport syntetisk Nios-kod ; getchar(data) .equ indata, 0x400 ;0x4C0 .equ outdata, 0x404 ;0x4C4 .equ status, 0x408 ;0x4C8 .equ ibfmask, 0x80 ;0x80 getchar: SAVE %sp, 0 LOAD* %L0, status ANDIP* %L0, ibfmask BEQ* getchar LOAD* %i0, indata RET RESTORE 16 April 2017 2G1502, föreläsning 5, ht2003
putchar till serieport syntetisk Nios-kod ; putchar(data) .equ indata, 0x400 ;0x4C0 .equ outdata, 0x404 ;0x4C4 .equ status, 0x408 ;0x4C8 .equ obemask, 0x40 ;0x40 putchar: SAVE %sp, 0 LOAD* %L0, status ANDIP* %L0, obemask BEQ* putchar STORE* outdata, %i0 RET RESTORE 16 April 2017 2G1502, föreläsning 5, ht2003
Föreläsning 5 Sammanfattning Pollning av Parallell-port Pollning av Serieport Eko-program Kommunikation 16 April 2017 2G1502, föreläsning 5, ht2003
Laboration 2 EKO-program Skriv ett progam som ekar tecken från tangentbord till terminalfönster start: bsr initserie main: bsr getchar bsr putchar bra main ; och en del NOP:ar 16 April 2017 2G1502, föreläsning 5, ht2003
Flödesschema för EKO-program START init getchar putchar 16 April 2017 2G1502, föreläsning 5, ht2003
Flödesschema för korsvis kommunikation START getcharx ? JA senchar NEJ reccharx ? JA putchar NEJ 16 April 2017 2G1502, föreläsning 5, ht2003
EKO-program fast korsvis kommunikation start: bsr initserie ;initera serieportar gettst: bsr getcharx ;tecken från tangentbord ? ifnrz %o0 ;i så fall br send ;hopp till send rectst: bsr reccharx ;tecken mottaget ? ifrz %o0 ;om inte br gettst ;hopp till gettst put: bsr putchar ;annars skrivut motaget tecken br gettst ;loopa send: bsr sendchar ;sänd ett tecken br rectst ;och tillbaka in i loopen ; nop är utelämnade,ska skrivas till ... 16 April 2017 2G1502, föreläsning 5, ht2003
Flödesschema för korsvis kommunikation med paritetskontroll START getcharx ? JA parmake errmake senchar NEJ reccharx ? JA partest putchar NEJ 16 April 2017 2G1502, föreläsning 5, ht2003
Korsvis kommunikation med paritetskontroll start: bsr initserie ;initera ev. serieportar gettst: bsr getcharx ;tecken från tangentbord ? ifnrz %o0 ;i så fall br send ;hopp till send rectst: bsr reccharx ;tecken mottaget ? ifrz %o0 ;om inte br gettst ;hopp till gettst put: bsr partest ;kolla paritet bsr putchar ;skriv ut motaget tecken br gettst ;loopa send: bsr parmake ;inför paritet bsr errmake ;inför error bsr sendchar ;sänd ett tecken br rectst ;och tillbaka in i loopen ; nop är utelämnade,ska skrivas till ... 16 April 2017 2G1502, föreläsning 5, ht2003
Timer Används för exaktare tidmätning alt1: Counter räknar upp från 0 till value alt2: Counter räknar ner från value till 0 Counter framme kallas Time-Out Vid Time-Out ettställs en vippa vars värde finns tillgängligt för program och elektriskt Vippan kan nollställas (hur?) 16 April 2017 2G1502, föreläsning 5, ht2003
Counter som räknar upp Flödesschema för väntan arrive Read TimeOut TimeOut=1? NO YES Clear TimeOut return 16 April 2017 2G1502, föreläsning 5, ht2003
Flödesschema DELAY med PROGRAM-LOOP IN-hopp K := msek inparameter Program-loop 1 millisekund N := start IN-hopp K = 0 ? N = 0 ? Byt ut program-loop mot timer-loop JA JA NEJ NEJ K := K - 1 N := N - 1 Laboration 1 UT-hopp UT-hopp 16 April 2017 2G1502, föreläsning 5, ht2003
Flödesschema DELAY med TIMER arrive return TimeOut=1? Clear TimeOut Read TimeOut YES NO K := msek inparameter Timer-loop 1 millisekund IN-hopp K = 0 ? JA NEJ K := K - 1 Laboration 2 UT-hopp 16 April 2017 2G1502, föreläsning 5, ht2003
Timer med Counter som räknar ner Counter laddas med period Counter minskas med ett vid clockflank Counter=0 medför ettställ Time-Out Counter laddas om vid Time-Out period kan väljas med program 16 April 2017 2G1502, föreläsning 5, ht2003
Timer Statusvippa Time-Out Statusvippa som kallas Time-Out ettställs vid Time-Out kan pollas av program ska nollställas av program tillgänglig som elektrisk signal 16 April 2017 2G1502, föreläsning 5, ht2003
Timer Statusvippa Run Statusvippa som kallas Run ettställs av program nollställs av program kan pollas av program tillgänglig som elektrisk signal ? 16 April 2017 2G1502, föreläsning 5, ht2003
Nios Timer Hårdvaru-figur write from program load period start load zero counter Q Q’ D cl run set -1 load clock Q Q’ D cl time-out snap-shot stop clear read from program 16 April 2017 2G1502, föreläsning 5, ht2003
Nios Timer Memory Mapped Addresses 31 16 15 0 0x440 0x444 0x448 0x44C 0x450 0x454 0x458 0x45C 31 16 15 0 16 April 2017 2G1502, föreläsning 5, ht2003
Nios Timer Status / Control etc Run TI Time-Out 0x440 status 0x444 control 0x448 periodl 0x44C periodh 0x450 snapl 0x454 snaph ITO cont start stop 15 0 16 April 2017 2G1502, föreläsning 5, ht2003
Nios Timer Hokus Pokus TI - Time Out, bit 0 på adress 0x440 Run, bit 1 på adress 0x440 Clear Time Out, Write anything to 0x440 Continous Counting, ”set” bit 1 at 0x444 Start Run,”set” bit 2 at 0x444 Stop Counting, ”set” bit 3 at 0x444 WR to snapshot, copy Counter to SnapShot (ej komplett information) 16 April 2017 2G1502, föreläsning 5, ht2003
Serieport Sändare Mottagare Parallella data in skiftregister Seriell kabel skiftregister Parallella data ut 16 April 2017 2G1502, föreläsning 5, ht2003
Paritet i ett n-bitars ord jämn eller udda paritet Jämn paritet = jämnt antal ettor i ordet Udda paritet = udda antal ettor i ordet Feldetektering Detekterar alla ”udda-bits-fel” dvs om ett udda antal bitar har växlat värde Felkorrigering, hur då ??? Omsändning !!! 16 April 2017 2G1502, föreläsning 5, ht2003
Paritetskontroll vid kommunikation Sändaren kompletterar med en extra bit vars värde sätts så att man får rätt paritet i det ord som sänds Mottagaren kontrollerar att det är rätt paritet i det mottagna ordet 16 April 2017 2G1502, föreläsning 5, ht2003
Kartbild av minnet Adress MEM / IO 0 - 3FF boot_monitor_rom 400-41F uart_0 (”main”) 420-42F seven_seg_pio 440-45F timer_0 460-46F led-pio 470-47F button_pio 480-48F lcd-pio 4A0-4BF dma 16 April 2017 2G1502, föreläsning 5, ht2003
Kartbild av minnet 4C0-4DF uart_1_debug (debug) 4E0-4FF uart_serialport (komm) 500-5FF memory_mapped_io ?-? ext_ram_bus 40000-7FFFF ext_ram, 256 kByte 7FF00-7FFFF ”int. vector_table” 100000-1FFFFF ext_flash, 1 Mbyte 16 April 2017 2G1502, föreläsning 5, ht2003
4.5 Subrutiner och stack Gränssnitt mot funktion/subrutin placering av parametrar till rutinen placering av lokala variabler placering av returvärden 16 April 2017 2G1502, föreläsning 5, ht2003
Variabler i minnet (register) Viktiga aspekter att ta med Allokering av minne vid kompilering at compile-time Allokering av minne vid exekvering at run-time global / lokal variabel code-area, data-area, heap-area, stack-area push och pop för stacken malloc och free för heapen 16 April 2017 2G1502, föreläsning 5, ht2003
Allokering av minne at compile time Vid kompilering allokeras minne för Programkoden - code eller text Globala data initialized (.data) uninitialized (.bss) Heaparea Stackarea 16 April 2017 2G1502, föreläsning 5, ht2003
Allokering av minne at execution/run time Vid exekvering allokeras minne från stacken och används för Parametrar vid funktionsanrop Returadress vid funktionsanrop Lokala variabler i anropad funktion Skydd av register vid registerbrist 16 April 2017 2G1502, föreläsning 5, ht2003
Allokering av minne at execution/run time Vid exekvering allokeras minne från heapen och används för Static variables i instanser av objects Dynamiska data-strukturer 16 April 2017 2G1502, föreläsning 5, ht2003
Kartbild av minnet code data heap stack 7 0 adress 0 adressrymd 7 0 adress 0 PC +2 code (fetch-execute) data (load-store) heap (malloc-free) adressrymd SP +2 -2 stack adress 2n -1 (push-pop) 16 April 2017 2G1502, föreläsning 5, ht2003
STACK operationer PUSH och POP PUSH op: SP <- sp - n mem(sp) <- op POP dst: dst <- mem(sp) SP <- sp + n n = antal bytes - Stack Pointer SP + före funktionsanrop 16 April 2017 2G1502, föreläsning 5, ht2003
Funktionsanrop Parametrar på stacken PUSH paramk … PUSH param2 PUSH param1 CALL funk ADDI #n*k, SP - param1 param2 ... paramk Stack Pointer SP + efter lagring av parametrar 16 April 2017 2G1502, föreläsning 5, ht2003
Funktionsanrop Returadress på stacken … ret return param1 param2 ... paramk - Stack Pointer SP + efter funktionsanrop 16 April 2017 2G1502, föreläsning 5, ht2003
Funktionsanrop frame pointer funk: save %sp,0 … ret restore Stack Pointer return param1 param2 ... paramk - SP Frame Pointer FP + efter funktionsanrop och save %sp,0 16 April 2017 2G1502, föreläsning 5, ht2003
Funktionsanrop Lokala variabler på stacken locvar2 locvar1 return param1 param2 ... paramn funk: save %SP,-2 … ret restore Stack Pointer - SP Frame Pointer FP + efter save %sp,-2 16 April 2017 2G1502, föreläsning 5, ht2003
Funktionsanrop Lokala variabler på stacken locvar2 locvar1 return param1 param2 ... paramn funk: save %SP,-2 … ret restore Stack Pointer - SP + efter ret/restore 16 April 2017 2G1502, föreläsning 5, ht2003
Adressering adress relativt frame pointer locvar2 locvar1 return param1 param2 … paramn param1 = 1n(fp) param2 = 2n(fp) paramk = kn(fp) ... locvar1 = -1n(fp) locvar2 = -2n(fp) Stack Pointer - SP Frame Pointer FP + 16 April 2017 2G1502, föreläsning 5, ht2003
Editering Exempel på C-kod /* typexempel på program skrivet i c-kod */ #include ”nios.h” #define plussa = sum /* macrodefinition */ int TIME = 0x5959; /* globala initierade variabler, placeras i .data */ int a, b, c; /* globala oinitierade variabler, placeras i .bss */ int sum (int par1, par2) /* functions definition */ int tmp; /* lokal variabel, placeras på stack */ { tmp = par1 + par 2; return (tmp) } /* returadress på stack */ main () int talA talB, talC; /* lokala variabler i main, placeras på stack */ { /* själva programkoden i huvudprogrammmet /* ... talC = plussa (talA, talB) /* anrop av function, parametrar på stack */ printf(…) } 16 April 2017 2G1502, föreläsning 5, ht2003