23.08.2013 Views

Tentamen i EIT070 Datorteknik

Tentamen i EIT070 Datorteknik

Tentamen i EIT070 Datorteknik

SHOW MORE
SHOW LESS

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.

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!