Datorsystem Laboration 2: Minnesmappade bussar Senast uppdaterad: 14 oktober 2012 Version 1.2 Student: Lärare: Underskrift: Underskrift: Datum:
Datorsystem Laboration 2 1 Innehåll 1 Inledning 2 1.1 Introduktion.................................. 2 1.2 Labbens syfte................................. 2 1.3 Innan ni börjar arbeta med labben..................... 2 1.4 Innan ni kommer till labbpasset ska ni ha:................. 2 2 Förberedelseuppgifter 3 2.1 Förberedelseuppgifter online......................... 3 2.2 Programstruktur............................... 3 2.3 Makron för stacken.............................. 4 2.4 Subrutiner................................... 4 3 Labbuppgifter 5 3.1 Kommunikation över JTAG......................... 5 3.1.1 Saker att tänka på.......................... 5 3.2 Kommunikation över serieporten....................... 6 3.3 En mindre ändring av programmet..................... 6 3.4 När labben är klar.............................. 6
Datorsystem Laboration 2 2 1 Inledning 1.1 Introduktion I ett datorsystem behöver processorn kommunicera med primärminnet, systemets övriga I/O-enheter och andra datorsystem. I stort sett alla datorsystem använder bussar för kommunikation, där flera av datorns enheter är inkopplade till samma buss. När man programmerar ett Altera-kort kan man som programmerare komma åt dessa bussar genom att skriva till en minnesadress som är associerad med den buss man vill använda. I den här labben ska vi skriva ett litet program som kom låter två DE2-kort kommunicera över serieporten. Efter att ni har klarat av den här labben ska ni ha en större förståelse för hur kommunikation över minnesmappade bussar fungerar i ett datorsystem. 1.2 Labbens syfte 1. Du ska ha fått praktisk erfarenhet av att programmera mot minnesmappade bussar. 2. Du ska ha fått förståelse för hur bussar används i ett datorsystem. 1.3 Innan ni börjar arbeta med labben Läs följande delar i kursboken: Sektion 4.5 och stycket Memory-Mapped I/O på sidan 377. Läs även följande manualer från Altera: DE2 Media Computer, sektion 2.4 och 2.5 1 Nios II Processor Reference Handbook (använd vid behov) 2 1.4 Innan ni kommer till labbpasset ska ni ha: Läst igenom hela detta lab-pm Löst alla förberedelseuppgifter Läst igenom de rekommenderade delarna ur kursboken. Läst igenom de rekommenderade delarna ur DE2-manualen. 1 http://people.dsv.su.se/~ahn/da-vt12/de2_mediacomp_manual.pdf 2 http://people.dsv.su.se/~ahn/da-vt12/niosii_ref.pdf
Datorsystem Laboration 2 3 2 Förberedelseuppgifter 2.1 Förberedelseuppgifter online Innan labbpasset i datorsal påbörjas ska förberedelseuppgifterna som finns på kurshemsidan vara lösta med godkänt resultat. Som godkänt resultat räknas alla rätt. Det finns dock delar av laborationsuppgifterna som bör tänkas igenom i förväg,så till den här laborationen finns förberedelseuppgifter som inte ska lösas på kurshemsidan. 2.2 Programstruktur Koden nedan innehåller en struktur för den kod som ni ska skriva under laborationen. Två anrop finns redan i den givna strukturen; både READ JTAG och READ SERIAL anropas i huvudloopen. Observera att anropet på READ SERIAL är utkommenterat eftersom serieporten inte kommer användas förrän i del 3.2 av laborationsuppgifterna. Gå igenom kodstrukturen nedan och tänk igenom hur subrutinerna bör implementeras for att fungera enligt programbeskrivningarna som finns i sektion 3.. t e x t. g l o b a l s t a r t s t a r t : # Code to s e t up r e g i s t e r s with r e l e v a n t a d r e s s e s to the I /O u n i t s MAIN LOOP: c a l l READ JTAG #c a l l READ SERIAL br MAIN LOOP READ JTAG: # Read data from the JTAG port WRITE JTAG: # Write data to the JTAG port READ SERIAL : # Read data from the s e r i a l port WRITE SERIAL : # Write data to the s e r i a l port. end Listing 1: Programstruktur för laboration 2
Datorsystem Laboration 2 4 2.3 Makron för stacken När man ger bort kontrollen över exekveringen till en annan subrutin behöver man ofta skydda vissa register mot förändringar. Registrena r8 till r15 är caller-saved, vilket betyder att den som anropar en subrutin är ansvarig för att skydda den data som finns i i r8-15. Registrena r16 till r23 är callee-saved, vilket betyder att den anropade subrutinen är ansvarig för att antingen inte ändra värdena i r16-r23 eller först spara undan innehållet i dem och sedan återställa innan man returnerar. Det enklaste sättet att spara innehållet i ett register är att kopiera innehållet till ett annat register, men det går snabbt åt väldigt många register bara för att spara innehållet i andra register. Ett bättre sätt är att istället använda stacken genom att pusha dit det eller de register man vill spara och sedan poppa tillbaka dem när den anropade subrutinen är klar. Stacken använder man enklast genom att skapa ett makro för att lägga till data överst på stacken och ett makro for att hämta ut det som ligger på toppen av stacken. För att skapa ett makro väljer man ett namn, eventuella parametrar och anger sedan de instruktioner som bygger upp makrot. På så vis kan man sedan använda flera instruktioner genom att bara ange makronamnet. Nedan finns två makron for användning av stacken. PUSH lägger innehållet i ett register på stacken och POP hämtar informationen överst i stacken och lägger i ett register. Lägg in makrona i programmet under labben och använd dem vid användning av stacken.. macro PUSH reg subi sp, sp, 4 stw \ reg, 0( sp ). endm. macro POP reg ldw \ reg, 0( sp ) addi sp, sp, 4. endm Fundera på hur makrona fungerar. Varför ökas och minskas stackpekaren med 4? Vi använder namnet sp för stackpekaren, men vilket nummer har registret egentligen? 2.4 Subrutiner Viktigt att tänka på när man anropar en subrutin från en annan subrutin är att man måste spara undan återhoppsadressen innan man anropar nästa subrutin. Om man inte gör det finns inte längre rätt återhoppsadress när man ska returnera. Enklaste sättet att göra detta på är att ta ett ledigt register och kopiera innehållet i r31 till det innan man anropar den nästlade subrutinen. När den nästlade subrutinen returnerar kan man återställa återhoppsadressen genom att kopiera tillbaka den undansparade adressen till r31. Exempel på programflöde där man behöver spara undan återhoppsadressen:
Datorsystem Laboration 2 5 MAIN LOOP: c a l l br READ SOME DATA MAIN LOOP READ SOME DATA: # Read some data, not i n t e r e s t i n g f o r t h i s example push r31 # Protect the return address c a l l PUT SOME DATA ON LEDS # Some other s ubroutine pop r31 # Restore the return address För att kunna använda stacken behöver man tala om för kortet var den finns (eftersom man själv kan ställa in det). Det gör man genom att lägga in rätt minnesadress i register sp: 0x007FFFC. I sektion 2.2 ombads ni tänka igenom hur ert program ska konstrueras. Finns det ett behov av att använda stacken för att spara undan återhoppsadressen? 3 Labbuppgifter 3.1 Kommunikation över JTAG I labbens första del ska ni få kommunikationen mellan datorn som kör Monitor Program och Altera-kortet att fungera. Utgå från den struktur ni fått i kodexempel 1 och som ni förberett i uppgift 2.2. Skriv ett program i Assembly som läser från JTAG-porten och sedan skickar tillbaka samma data till JTAG-porten. När programmet fungerar som det ska kommer de tecken som skrivs in i terminalen i Monitor Program att synas i terminalen. Om man inte skickar tillbaka tecknen från terminalen kommer inget att synas i terminalfönstret. Att man inte ser några tecken i terminalen när man skriver dem är inte fel, det betyder bara att ert program inte fungerar ordentligt än! 3.1.1 Saker att tänka på Lägg projektet på den lokala disken D: istället för filservern Goofy. Använd DE2 Media Computer när projektet skapas. Ingen kod finns given för denna laboration, så glöm inte.text och liknande delar. Visa era resultat för en labbassistent innan ni går vidare.
Datorsystem Laboration 2 6 3.2 Kommunikation över serieporten När programmet kan skriva ut tecken i terminalen via JTAG går nästa del av labben ut på att också skicka de tecken som skrivs in i terminalen till serieporten så att ett annat DE2-kort kan ta emot de tecken som skickas. Programmet ska också lyssna på serieporten efter data som skickas till kortet och sedan visa mottaget data i terminalen. Bygg vidare på det program ni skrev i uppgift 3.1 och lägg till funktionalitet för att läsa och skriva till serieporten. Varje gång ett tecken kommer in till JTAG ska ni inte bara skicka tillbaka det till terminalen utan också skicka det till serieporten. Utöver att lyssna efter data på JTAG-porten måste programmet också lyssna efter data på serieporten. Data som kommer in på serieporten ska skickas också synas i terminalen för det mottagande kortet. På sås vis kommer ni att skriva ett litet chattprogram för kommunikation mellan två DE2-kort. Meddela en labbassistent att ni är klara, ni kommer då att bli tilldelade en annan grupp som också är klar med JTAG-delen. Om gruppen inte sitter inom lämpligt avstånd får ni flytta ihop och arbeta vid en dator. Det går att koppla två DE2-kort till en dator och använda två instanser av Monitor Program för att styra varsitt kort. Observera att det då behövs två projekt, ett för varje kort som ska styras. Visa era resultat för en labbassistent innan ni går vidare. 3.3 En mindre ändring av programmet När ni har två kort som kan chatta via serieporten kommer ni få en mindre extrauppgift att göra. Visa era resultat för en labbassistent innan ni går vidare. 3.4 När labben är klar Glöm inte att rensa undan projektet från D: så att inte några andra studenter kan råka ta fel projekt. Spara undan ert projekt i Goofy eller skicka assemblerfilerna till er mail om ni vill ha koden kvar. Packa ihop och lämna tillbaka labbkortet.