Tentamen i EIT070 Datorteknik
Tentamen i EIT070 Datorteknik
Tentamen i EIT070 Datorteknik
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
<strong>Tentamen</strong> i <strong>EIT070</strong> <strong>Datorteknik</strong><br />
Institutionen för Elektro- och informationsteknik, LTH<br />
Onsdagen den 11 mars 2009, klockan 14:00–19:00 i MA:10<br />
Tillåtna hjälpmedel: på tentan utdelad formelsamling, miniräknare.<br />
Skriv lösningar till varje uppgift på separata ark och använd endast ena sidan på varje ark. Ange namn, program<br />
och startår på varje ark.<br />
Motivera dina svar tydligt, kommentera all kod du skriver, samt redogör för alla antaganden du gör.<br />
Skriv tydligt och läsbart.<br />
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.<br />
Uppgift 1<br />
Företaget Blinkmojt AB ska implementera en styrenhet för att styra trafikljusen i en fyrvägskorsning på Norra Ringen i<br />
Lund. Följande designkrav gäller:<br />
Det finns fyra likadana ljusfyrar för huvudvägen och fyra för sidovägen.<br />
Varje väg har magnetiska sensorer i vägbanan, som talar om ifall en bil väntar.<br />
Varje ljusfyr har en fotocell som reagerar på en annalkande bils färdljus, (särskilt om man helljusblinkar).<br />
I viloläge skall alla riktningar ha rött ljus.<br />
Om en magnetsensor eller fotocell indikerar att en bil finns skall ljusfyrarna på motsvarande väg genomlöpa<br />
sekvensen rött => rött+gult => grönt => gult => rött, med lämpliga väntetider. Så länge det indikeras nya<br />
bilar skall sekvensen repeteras. Ljusfyrarna på korsande väg ska givetvis samtidigt visa rött.<br />
Om det indikeras bilar på båda vägarna, skall ovanstående sekvens köras först på ena vägen, sedan på den<br />
andra och så vidare.<br />
Systemet skall implementeras på en MIPS-processor i C och MIPS-assembler. Klockkrets finns på kortet.<br />
Signaler från samtliga magnetsensorer och fotoceller finns tillgängliga som input till systemet och kan<br />
kopplas till portar eller avbrott. Styrsignaler till ljusfyrarna kan skickas genom att man skriver bitar till portar.<br />
Rita ett flödesschema för styrning av ljusfyrarna. Du behöver inte använda någon särskild syntax för ditt schema, men<br />
det ska klart framgå vilka olika steg som finns, samt vilka in- och utsignaler som används, (5 p).<br />
Den enklaste lösningen är att ha två oberoende trådar. Den ena reagerar på klockavbrott och håller rätt på hur långt<br />
man kommit i körande sekvens, samt vilken typ av sekvens som ska startas när en gammal sekvens blivit klar. Den<br />
andra tråden reagerar på avbrott från sensorer och fotoceller, läser av portarna för dessa, och håller rätt på vilken typ<br />
av sekvens som ska köras härnäst.<br />
Vilka insignaler bör kopplas till avbrott och vilka bör kopplas till inportar som läses på initiativ av programmet? Lista<br />
samtliga insignaler och ange om de ska kopplas till avbrott eller inport, samt motivera noggrant varför, (5 p).<br />
Avbrott kommer från kortets klockkrets, samt från magnetsensorer och fotoceller.<br />
Ljusportarna skrivs för att ställa om hur fyrarna skall var tända.<br />
Inportar från magnetsensorer och fotoceller läses för att avgöra om det finns bil på endera eller båda vägarna.<br />
Sidan 1 av 4. Uppgifter finns på båda sidorna.
Uppgift 2<br />
Betrakta följande C-funktion:<br />
unsigned int strlen(char *s)<br />
{<br />
int i=0;<br />
}<br />
while (s[i] != 0) i=i+1;<br />
callstat(35);<br />
return i;<br />
Funktionen räknar antalet tecken i en teckensträng. Ett tecken är åtta bitar. En sträng avslutas genom att sista tecknet är<br />
noll. Inuti funktionen anropas en statistikrutin som räknar antalet anrop till funktionen. Argumentet 35 är ett heltal som<br />
betyder att anropet gjordes av strlen. Skriv en version av strlen i MIPS-assembler. Du ska skriva komplett<br />
assemblerkod, inklusive direktiv och kommentarer, och du måste följa samtliga MIPS programmeringskonventioner,<br />
(10 p).<br />
.text<br />
.globl strlen<br />
.ent strlen<br />
strlen: subu sp, sp, 16 # reserve stack space<br />
sw ra, 0(sp) # Save value of ra on stack<br />
sw a0, 4(sp) # Save value of a0 on stack<br />
add t0, zero, zero # initialize t0 to zero<br />
repeat: add t1, a0, t0 # compute address to next character<br />
lb t2, 0(t1) # load next character (byte) in string<br />
beq t2, zero, ready # check if null character, if so ready<br />
addi t0, t0, 1 # increment one byte<br />
b repeat # repeat for next character<br />
ready: sw t0, 8(sp) # store character count on stack<br />
add a0, 35, zero # set argument (a0) to 35<br />
jal callstat # call subroutine callstat<br />
lw v0, 8(sp) # fetch computed result from stack<br />
lw a0, 4(sp) # restore old value of a0<br />
lw ra, 0(sp) # restore old value of ra<br />
addu sp, sp, 16 # pop stack frame<br />
jr ra # result is returned in v0<br />
.end strlen<br />
Sidan 2 av 4. Uppgifter finns på båda sidorna.
Uppgift 3<br />
Studera följande C-kod:<br />
int matrix[256][256];<br />
void init()<br />
{<br />
int i, j;<br />
for (i=0; i < 256; i++) {<br />
for (j=0; j < 256; j++) {<br />
matrix[i][j]=0;<br />
}<br />
}<br />
}<br />
Förklara hur man representerar matrisen matrix i assembler och hur den ligger lagrad i minnet, (2 p).<br />
Det finns ingen särskild datastruktur för vektorer eller matriser i assembler. Matrisen ligger lagrad som 256*256<br />
heltal om vardera 4 byte efter varandra i minnet.<br />
Skriv kod i MIPS-assembler som motsvarar satsen matrix[i][j]=0; (8 p).<br />
la t0, matrix # load base address for matrix<br />
la t3, i # load address to variable i<br />
lw t1, 0(t3) # load value of variable i<br />
la t3, j # load address to variable j<br />
lw t2, 0(t3) # load value of variable j<br />
sll t1, t1, 8 # multiply i by 256<br />
add t1, t1, t2 # add value of j<br />
sll t1, t1, 2 # multiply by 4 to get “int” address<br />
add t2, t0, t1 # add base and offsets<br />
sw zero, 0(t2) # set zero int value in memory<br />
Det är ganska mycket som ska göras för att ladda in ett värde från en matris i minnet. Först laddas adressen till den<br />
första platsen i matrisen, (namnet matrix översätts till denna adress i assembler). Sedan hämtas värdena av i och j från<br />
minnet. För att räkna ut rätt index måste i multipliceras med 256 och adderas till j. Sedan måste detta värde<br />
multipliceras med fyra för att översätta till en address (det går fyra byte per int). Till sist läggs detta index ihop med<br />
basadressen och värdet hämtas.<br />
Uppgift 4<br />
Ett trettiotvå bitars heltal n skall skiftas 4 steg år höger. Antag att n är 1000 0000 0000 0000 0000 0000 0000 0000 2,<br />
(binärt). Man kan använda två olika skiftinstruktioner, nämligen srl (shift right logical) eller sra (shift right arithmetic).<br />
Förklara hur skiftet går till för båda instruktionerna och visa resultaten i form av ett bitmönster, (4 p).<br />
srl skiftar in nollor från vänster. Resultatet blir 0000 1000 0000 0000 0000 0000 0000 00002.<br />
sra skiftar in bitar av samma tecken som den mest signifikanta.<br />
Resultatet blir 1111 1000 0000 0000 0000 0000 0000 00002.<br />
Vilken skiftinstruktion skall användas om n är deklarerat som unsigned int respektive int, (2 p)?<br />
srl skiftar in nollar och passar därför ihop med unsigned int (positiva heltal), medan sra skiftar in teckenbitar och<br />
passar ihop med int (tvåkomplement).<br />
Vilken matematisk operation motsvarar det att man skiftar n 4 steg åt höger med sra, (2 p)?<br />
Heltalsdivision med 2 4 alltså 16.<br />
När ett avbrott i MIPS är betjänat av avbrottsrutinen, skall man hoppa tillbaks till exekveringen av det program som<br />
avbröts. Hur vet man vart man ska hoppa, (2 p)?<br />
Adressen till nästa instruktion när avbrottet skedde lagras i registret EPC. Man ska alltså avsluta en avbrottshantering<br />
med att göra jr ’EPC’.<br />
Sidan 3 av 4. Uppgifter finns på båda sidorna.
Uppgift 5<br />
Ett inbyggt datorsystem för en tvättmaskin är konstruerat med en enkel MIPS-processor och ett RAMminne<br />
på 256 MB. Alla program har rättighet att skriva var som helst i minnet. Den ökände Professor<br />
Larsson har skrivit följande program, och lägger in det i datorsystemet. Notera att om man är professor,<br />
behöver man inte skriva kommentarer i sina program.<br />
.text<br />
.globl start<br />
.ent start<br />
start: add t0, zero, zero<br />
again: sw zero, 0(t0)<br />
addiu t0, t0, 4<br />
b again<br />
.end start<br />
Vad gör programmet när det exekveras, (3 p)? När kommer det att sluta, (2 p)? Vad händer då, (3 p)? Blir<br />
det någon skillnad om man lägger till direktivet .set noreorder, (2 p)?<br />
Registret t0 används som en adress till minnet. Programmet börjar alltså nollställa minnet, från låga<br />
adresser till högre. Programmet kommer så småningom fram till sina egna instruktioner, och lägger in<br />
värdet noll i minnet. Detta värde motsvarar instruktionen nop. När programmet ersatt instruktionen sw<br />
zero, 0(t0) med nop slutar det nollställa minnet. Det fortsätter att räkna upp t0 tills värdet slår runt och blir<br />
noll igen.. Programmet slutar alltså inte exekvera utan går i en oändlig loop.<br />
Assemblern kommer att byta ordning på instruktionerna addiu t0, t0, 4 och b again. Om man anger .set<br />
noreorder görs inte denna omsortering. Ingen av instruktionerna skrivs dock över, så bytet gör ingen<br />
skillnad för programmets funktion.<br />
Lycka till!<br />
Sidan 4 av 4. Uppgifter finns på båda sidorna.