• No results found

Tentamen i EIT070 Datorteknik

N/A
N/A
Protected

Academic year: 2022

Share "Tentamen i EIT070 Datorteknik"

Copied!
8
0
0

Loading.... (view fulltext now)

Full text

(1)

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).

(2)

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).

(3)

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: lw 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

sw 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!

(4)

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

(5)

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

(6)

Uppgift 3

3.a

• 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.

3.b

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:

addi t0, t0, 1 # inkrementera x-räknare bge t0, t2, done # traverserat i x-led?

addi t1, zero, -1 # initiera y-räknare yloop:

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!

(7)

lw a2, -3196(t4) # p[x-1][y+1]

lw a3, -4(t4) # p[x][y-1]

subu sp, sp, 56 # aktiveringsblock

lw t5, 0(t4) # p[x][y]

sw t5, 16(sp) #

lw t5, 4(t4) # p[x][y+1]

sw t5, 12(sp) #

lw t5, 3196(t4) # p[x+1][y-1]

sw t5, 8(sp) #

lw t5, 3200(t4) # p[x+1][y]

sw t5, 4(sp) #

lw t5, 3204(t4) # p[x+1][y+1]

sw t5, 0(sp) #

sw t0, 20(sp) # spara på stacken enl. konv. ...

sw t1, 24(sp) # ... (behövs ej om vi använt s0-s7 ...

sw t2, 28(sp) # ... istället för t0-t7 ovan)

sw t3, 32(sp)

sw t4, 36(sp)

sw t5, 40(sp)

sw t6, 44(sp)

sw t7, 48(sp)

jal dimpixel # subrutinanrop

lw t0, 20(sp) # Återställ t0-t7 från stacken

lw t1, 24(sp)

lw t2, 28(sp)

lw t3, 32(sp)

lw t4, 36(sp)

lw t5, 40(sp)

lw t6, 44(sp)

lw t7, 48(sp)

addu sp, sp, 56 # Återställ stackpekaren subu t4, t4, t6 #adressoffset från matrisens början add t4, t4, t7 # här ska resultatet sparas

sw v0, 0(t4) # spara resultatet b yloop

done:

.end 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

(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)

lw t0, ins(zero) add t0, t0, 0x10000 sw t0, ins(zero) en annan:

lw t0, ins(zero) ror t0, t0, 16

addi t0, t0, 1 rol t0, t0, 16

sw to, ins(zero)

References

Related documents

I så kallade kylpåsar och värmepåsar används kemiska reaktioner för att ändra temperaturen hos vattnet i små plastpåsar (typiskt 1 deciliter), avsedda att kyla en överhettad

Resultatet av studien visade att det är av stor vikt att ambulanssjuksköterskor besitter kunskap i hur de kan identifiera missförhållanden av barn, samt att det råder en

Svar: I ett cacheminne med direktmappning kan en byte bara hamna i en specifik cacherad. Det underlättar implementation och man slipper ha så kallade ersättningsalgoritmer. Men,

- Och sen ​när jag kommer tillbaka från Lettland då har jag fortfarande en vecka kvar innan jag börjar jobba igen ​ och då vill jag bara ta det lugnt och ​njuta​ av

Resultatet kring denna studie visade att oavsett arbetslivserfarenhet så var handledning och medarbetarstöd något som socialsekreterarna beskrev som väsentligt och

För att ett företag ska överleva krävs det naturligtvis kunder och då några få av dessa står för majoriteten av köpen ökar deras makt över företaget (Johnson et

Alla myndigheter upplever att det finns möjlighet att bevara handlingar som inte är allmänna om de anser att de är av vikt för att leva upp till syftena i 3§ Arkivlagen.. Två av

Syftet med studien är att ta reda på barns erfarenheter av och tankar om olika tekniska system som ingår i vårt samhälles infrastruktur. För att samla in data genomfördes två