Tentamen i EIT070 Datorteknik Institutionen för Informationsteknologi, LTH Lördagen den 11 mars 2006, klockan 08.00 13.00 i MA:10 Tillåtna hjälpmedel: på tentan utdelad formelsamling, miniräknare. Skriv lösningar till varje uppgift på separata ark och använd endast ena sidan på varje ark. Ange namn, program och startår på varje ark. Motivera dina svar tydligt, kommentera all kod du skriver, samt redogör för alla antaganden du gör. Skriv tydligt och läsbart. Betygsgränserna är normalt 20 p för betyg 3, 30 p för betyg 4, och 40 p för betyg 5, av totalt 50 möjliga poäng på tentamen. Uppgift 1 En gul mikrovågsugn för köksanvändning hemma innehåller följande komponenter: Tre kombinerade knappar och lysdioder för att välja effekt (låg, mellan, hög). När man trycker på en knapp tänds motsvarande lysdiod för att visa vilket val som gjorts. En LCD-display där tid i minuter visas med två siffror, samt tre knappar, varav en stegar tiden uppåt med en minut, en stegar nedåt med 1 minut, och en nollställer tiden. En startknapp kombinerad med en lysdiod som lyser så länge tillagningen pågår. En avkännare som ger signal om luckan är öppen. En mikrovågsgenerator med tillhörande relä. Så länge en insignal till reläet är +5 V körs generatorn. En fläkt som blåser luft genom ugnen, med tillhörande relä. En motor som vrider plattan inne i ugnen, med tillhörande relä. En ljudgenerator som kan avge en plingande ljud. En förenklad MIPS-processor med PROM-minne, åtta bitars in- och utportar, samt fem ben som kan anslutas till externa avbrott. En separat klockkrets som avger en klocksignal 100 gånger per sekund. Mikrovågsugnen skall fungera på vanligt sätt: Man väljer en av tre effektnivåer samt en tillagningstid, och startar ugnen med startknappen. När ugnen går skall mikrovågsgeneratorn, fläkten och plattvridningen köra. När tillagningen är färdig skall ugnen stanna och avge ett plingande ljud. Om luckan öppnas ska ugnen stanna, och starta igen om den stängs. Under öppettiden skall tidtagningen stoppas. Observera att dessa villkor betyder att ugnen skall fungera exakt som en vanlig mikrovågsugn. Beskriv med en tydlig och enkel skiss samtliga komponenter, och vilka insignaler och utsignaler som finns och mellan vilka komponenter de skall kopplas. Ange tydligt vilka signaler som bör gå till processorns avbrottsingångar respektive till in- och utportar, (5 p). Beskriv vilka olika processer som bör pågå samtidigt i ugnen och föreslå hur dessa skall implementeras. Du ska inte skriva någon kod utan bara enkelt och tydligt förklara hur mikrons hård- och mjukvara skall designas och fungera. Rita även ett flödesschema för varje separat process, samt förklara vilka processer som skall kunna avbryta varandra, (5 p). 1 (8)
Uppgift 2 Teknolog Nisse Hult, D86, har 7 som lyckotal och 3 som olyckstal. När han, 19 år för sent, läser datorteknik vill han skriva dessa två tal som 32-bitars bitmönster, nämligen som positiva heltal, i tvåkomplement, samt flyttal i IEEE-standard. Men han kan inte. Hjälp honom genom att ange de olika bitmönstren för talen -3, +7 och +19, (10 p). Uppgift 3 En datorgrafikbild består av 16000 * 800 punkter, där varje bildpunkt (pixel) i sin tur består av ett 32-bitars ord. Man vill exekvera en algoritm för att ge bilden ett dimmigare utseende. Det finns en subrutin dimpixel som avläser en kvadrat om nio intilliggande bildpunkter och räknar ut en ny bildpunkt (den mittersta). Denna algoritm skall appliceras på samtliga bildpunkter i hela bilden. Det är viktigt att exekveringen är så effektiv som möjligt. Subrutinen dimpixel är definierad på följande vis: int dimpixel (int p1, int p2, int p3, int p4, int p5, int p6, int p7, int p8, int p9) {... return newpixelvalue; Betrakta följande två metoder för att applicera dimpixel på bilden: Metod A int p[1000] [800];... for (x = 0; x < 1000; x++) { for (y = 0; y < 800; y++) { newpict [x] [y] = dimpixel (p[x 1] [y 1], p[x 1] [y], p[x 1] [y+1], p[x] [y 1], p[x] [y], p[x] [y+1], p[x+1] [y 1], p[x+1] [y], p[x+1] [y+1]); Metod B int p[800000];... for (n = 0; n < 800000; n++) { newpict [n] = dimpixel (p[n 801], p[n 800], p[n 799], p[n 1], p[n], p[n+1], p[n+7991], p[n+800], p[n+801]); Vilken lösning är bäst? Förklara och analysera noggrant och jämför de två lösningarna, (5 p). Skriv kod i MIPS-assembler som motsvarar C-koden inne i Metod A, (5 p). Du behöver inte ta hänsyn till kanteffekter i någon av deluppgifterna. 2 (8)
Uppgift 4 Förklara noggrant vad som händer vid ett externt avbrott, från att den yttre händelsen kommer som en signal till ett av processorns ben, tills att avbrottet är hanterat och det avbrutna programmet fortsätter sin exekvering. Förklara vad som händer i så väl hårdvara som mjukvara, (5 p). Vilka register måste sparas i en avbrottsrutin? Varför? Förklara under vilka omständigheter det inte är nödvändigt att spara vissa register, (5 p). Uppgift 5 En djupt assemblerintresserad teknolog har skrivit följande programsnutt i MIPS-assembler: ins: beq t0, t1, quickexit... start: t0, ins(zero) # ladda instruktionen srl t0, t0, 16 # skifta höger addi t0, t0, 1 # öka med 1 och rätta till registret sll t0, t0, 16 # skifta tillbaks t0, ins(zero) # instruktionen fixad Vad tror du teknologen ville åstadkomma med koden som börjar vid labeln start? Förklara så kort och klart som möjligt (max 15 ord) vad han ville göra, (4 p). Koden fungerar dock inte korrekt. Skriv om den så att det blir rätt, (6 p). Lycka till! 3 (8)
Lösning uppgift 1 A) Input: Knappar för tidsinställning (3st) Knappar för effektinställning (3st) Startknapp Avkännare för lucka Output: Dioder för vald effekt (3st) Diod för startknappen LCD-skärm Motor till plattan Mikrovågsgenerator Fläkt Ljudgenerator Avbrott: Klocka Avkännare för lucka 4 (8)
B) Systemet måste ha stöd för hårdvaruavbrott. Systemet bör lämpligen ha en huvudrutin som cykliskt läser av knapparna för effekt, tid och start. Om en annan effekt har valts ska effektinställningen ändras samt motsvarande diod tändas. Dessutom måste man släcka den diod som tidigare varit tänd. Om någon av knapparna för tidsinställning har tryckts in ska tidsinställningen samt LCD-skärmen uppdateras. Då startknappen trycks kontrollerar man att luckan är stängd samt att tiden är inställd (effekten antas alltid ha ett värde). Om allt är OK tänds startdioden. Därefter aktiveras avbrotten för klockan samt luckan. Huvudtråden fortsätter sedan med att starta mikrovågsgeneratorn, fläkten och motorn till plattan. När allt är startat loopar huvudtråden tills det att den kvarvarande tiden är 0. Vid varje iteration jämförs den kvarvarande tiden med tiden från förra iterationen. Har tiden ändrats ska LCD-skärmen uppdateras. När loopen väl bryts stänger man av avbrott, mikrovågsgeneratorn, fläkten och motorn till plattan. Därefter släcks startdioden. En signal skickas nu till ljudgeneratorn och därefter återgår huvudrutinen till start. För avbrottshanteringen gäller att den först måste kontrollera vilken typ av avbrott det är. Kommer avbrottet från klockan ska en räknare inkrementeras med 1. Därefter kontrollerar man om räknaren har nått värdet 6000. Om så är fallet ska den kvarvarande tiden minskas med 1 (minut). Kommer avbrottet från luckan, dvs. luckan har öppnats, så ska man hoppa till en annan rutin som stänger av avbrott, mikrovågsgeneratorn, fläkten, motorn till plattan samt startdioden. Den nya rutinen kontrollerar därefter cykliskt knapparna för tidsinställning och effekt samt luckan. Om en ny effekt har valts ska dioderna samt effektinställningen ändras. Om någon av tidsknapparna (+1 och -1) trycks in ska tidsinställningen samt LCD-skärmen uppdateras. Om reset-knappen trycks in ska tiden nollställas varpå man hoppar till start. Om luckan stängs kontrollerar man att tiden inte har nollställts. Är den kvarvarande tiden större än 0 aktiverar man åter avbrott samt startar mikrovågsgeneratorn, fläkten och motorn till plattan. Därefter tänder man startdioden och hoppar tillbaka till huvudrutinen. Skulle användaren ha minskat ner tiden till noll hoppar man instället till start. Uppgift 2 Positiva heltal 3 00000000000000000000000000000011-7 Går inte att skriva som ett positivt heltal 19 00000000000000000000000000010011 Tvåkomplement 3 00000000000000000000000000000011-7 11111111111111111111111111111001 19 00000000000000000000000000010011 Flyttal 3 0 10000000 10000000000000000000000-7 1 10000001 11000000000000000000000 19 0 10000011 00110000000000000000000 5 (8)
Uppgift 3 3.a 3.b A bäst, med motivering att den är enklare att läsa för människor ger max 2.5p. B bäst, omotiverat ger max 1p. B bäst, med motivering att den innehåller två for-loopar el. dyl. ger max 3.5p. B bäst, med bra motivering, som framhäver problemet med tyngre index-beräkningar i A ger max 5p. Innan man skriver någon kod, måste man fastslå hur matriser ska representeras i minnet. Ett förslag (som använts här) är att en 3x4 matris med word-element och början på adress 0 har sina element på adresser enl. tabellen nedan (talen i elementen motsvarar elementens adresser). 0 16 32 4 20 36 8 24 40 12 28 44.data pict:.space 3200000 #matriserna finns i minnet newpict:.space 3200000.text.globl metoda # Här har vi valt att skriva metoda....ent metoda #... som en subrutin.... metoda: #... Detta är dock inget krav....set reorder la t6, pict # adress till pict la t7, newpict # adress till newpict addi t0, zero, -1 # initiera x-räknare addi t2, zero, 1000 # xmax addi t3, zero, 800 # ymax xloop: yloop: addi t0, t0, 1 # inkrementera x-räknare bge t0, t2, done # traverserat i x-led? addi t1, zero, -1 # initiera y-räknare addi t1, t1, 1 # inkrementera y-räknare bge t1, t3, xloop # travrserat i y-led? mulo t4, t0, t3 # 800*x-räknare add t4, t4, t1 # offset från matrisens början sll t4, t4, 2 # 1 word == 4byte add t4, t4, t6 # adress till p[x][y] #observera att vi bortser från randeffekter! a0, -3204(t4) # p[x-1][y-1] ((-800)+(-1))*4 a1, -3200(t4) # p[x-1][y] 6 (8)
a2, -3196(t4) # p[x-1][y+1] a3, -4(t4) # p[x][y-1] subu sp, sp, 56 # aktiveringsblock t5, 0(t4) # p[x][y] t5, 16(sp) # t5, 4(t4) # p[x][y+1] t5, 12(sp) # t5, 3196(t4) # p[x+1][y-1] t5, 8(sp) # t5, 3200(t4) # p[x+1][y] t5, 4(sp) # t5, 3204(t4) # p[x+1][y+1] t5, 0(sp) # t0, 20(sp) # spara på stacken enl. konv.... t1, 24(sp) #... (behövs ej om vi använt s0-s7... t2, 28(sp) #... istället för t0-t7 ovan) t3, 32(sp) t4, 36(sp) t5, 40(sp) t6, 44(sp) t7, 48(sp) jal dimpixel # subrutinanrop t0, 20(sp) # Återställ t0-t7 från stacken t1, 24(sp) t2, 28(sp) t3, 32(sp) t4, 36(sp) t5, 40(sp) t6, 44(sp) t7, 48(sp) addu sp, sp, 56 # Återställ stackpekaren done:.end subu t4, t4, t6 #adressoffset från matrisens början add t4, t4, t7 # här ska resultatet sparas v0, 0(t4) # spara resultatet b yloop metoda Uppgift 4 a) MIPS-processorn har sex avbrottsingångar som är dedikerade för just avbrott ( int0,int1.. int5). Deras enda uppgift är att ligga och vänt på ett avbrott. När en spänning (~5V) kommer på något av dessa ben så vet processorn att ett avbrott har genererats. När detta sker stoppas all pågående exekvering. Det första som händer nu är att processorn tittar i STATUS-registret för att se om avbrott ens är tillåtet. Om dem är tillåtna kontrollerar den om just det avbrottet är tillåtet. Då avbrottet inte skulle vara tillåtet så läggs det i en avbrottskö som är sorterad i prioritetsordning för att bli omhändertaget senare. Nu stänger man av avbrott genom att sätta en bit i STATUS-registret och sätter processorn i ett så kallat privilegierat systemtillstånd. Efter detta så uppdateras CAUSE-registret med information om avbrottet. Nu sätts EPC-registret till värdet av PC, detta för att processorn ska kunna hoppa tillbaka till där den avbröts. Nu när PC är undansparat så sätts den till en fördefinierad adress (0x80000080) och börjar exekvera där. Här finns ofta endast ett hopp till den avbrottsrutin som motsvarar det avbrottet som finns beskrivet i CAUSE. När hoppet till korrekt 7 (8)
avbrottsrutin skett så sparas alla register (inklusive specialregister) undan. De enda som utelämnas är k0,k1 och zero. Nu kan rutinen göra det den ska och efter det återställa registerna. Avbrottet kvitteras och avbrottskön kontrolleras efter fler avbrott. När allt är färdigt så sätts PC till EPC och man hoppar tillbaka till rutinen där avbrottet inträffade och kan fortsätta exekvera. b) I en avbrottsrutin måste alla register (inklusive specialregister) sparas. Anledningen till att man måste spara alla register är att det är ytterst viktigt att registerna kan återställas till precis det dom var innan avbrottet. Programmet kan ju omöjligen veta när ett avbrott kommer och räknar därför med att samtliga register är oförändrade medan det körs. Dock gäller ju givetvis att om man inte använder ett register behöver det inte sparas. Så om man har skrivit en rutin eller ett avbrott själv så att man vet precis vilka register som används så räcker det ju att man sparar dem. De enda som inte behöver sparas är k0,k1 och zero. Detta eftersom k0, k1 är till för just avbrott och får ändras fritt där och zero är alltid noll. Lösningssvar 5a Teknologen vill modifiera instruktionen beq t0, t1, quickexit vid labeln ins så att den blir beq t0, t2, quickexit Lösningssvar 5b Vid shiftoperationen försvinner konstantfältet i instruktionen då de 16 minst signifikanta bitarna shiftas ut och nollor skiftas in från höger. Man kan tänka sig olika lösningar på det här problemet. Utgå från att syntetiska instruktioner är tillåtna. En enkel metod för att addera 1 till rt fältet. (snyggast enligt mig, använder dock syntetiska instruktioner) en annan: t0, ins(zero) add t0, t0, 0x10000 t0, ins(zero) t0, ins(zero) ror t0, t0, 16 addi t0, t0, 1 rol t0, t0, 16 to, ins(zero) 8 (8)