Tentamen med lösningsförslag

Relevanta dokument
Tentamen med lösningsförslag

Tentamen med lösningsförslag

Tentamen. DAT015 Maskinorienterad programmering IT DIT151 Maskinorienterad programmering GU. Tisdag 15 december 2009, kl

Tentamen med lösningsförslag

EDA480/EDA485 - Maskinorienterad programmering, tentamen 2006-xx-xx 1(7)

Tentamen med lösningsförslag

Tentamen med lösningsförslag

Tentamen. EDA485 Maskinorienterad programmering Z DAT015 Maskinorienterad programmering IT. Tisdag xx yyyy 2006, kl

Maskinorienterad programmering

Tentamen med lösningsförslag

Maskinorienterad programmering

Maskinorienterad programmering. Mekatronikingenjör åk 2/ lp 3. Lars-Eric Arebrink. Av institutionen utgiven. Lars-Eric Arebrink

Tentamen med lösningsförslag

Tentamen med lösningsförslag

Maskinorienterad programmering. Mekatronikingenjör åk 2/ lp 3. Lars-Eric Arebrink. Av institutionen utgiven. vid flera tillfällen.

Tentamen med lösningsförslag

Tentamen med lösningsförslag

Tentamen. EDA485 Maskinorienterad programmering Z. Måndag 6 mars 2006, kl i V-salar

Maskinorienterad programmering

Exempel på tentamen 1

Tentamen. DAT015 Maskinorienterad programmering IT. Fredag 21 april 2006, kl i V-salar

Programmering av inbyggda system 2014/2015

Tentamen med lösningsförslag

Tentamen. EDA432 Digital och datorteknik IT INN790 Digital och datorteknik GU. Måndag 23 oktober 2006, kl i V-salar

Tentamen. EDA432 Digital- och datorteknik, It DIT790 Digital- och datorteknik, GU. Onsdag 12 Januari 2011, kl

Tentamen. DIT150 Maskinorienterad programmering GU DAT015 Maskinorienterad programmering IT. Söndag 17 december 2006, kl

Programmering av inbyggda system. Kodningskonventioner. Viktor Kämpe

Tentamen med lösningsförslag

LEU240 Mikrodatorsystem

Tentamen med lösningsförslag

TENTAMEN (med svar och vissa lösningar)

Digital- och datorteknik

Digital- och datorteknik

Tentamen. EDA432 Digital- och datorteknik, IT DIT790 Digital- och datorteknik, GU. Måndag 18 Oktober 2010, kl

Tentamen med lösningsförslag

Facit till övningsuppgifter Kapitel 13 Anslutning av minnes- och I/O-moduler till buss 13-1

Tentamen med lösningsförslag

Tentamen med lösningar

EDA Digital och Datorteknik

Digital- och datorteknik

Exempel 1 på Tentamen med lösningar

Tentamen 3. EDAxxx Grundläggande Datorteknik DIT791 Grundläggande Datorteknik, GU. Måndag xx Oktober 20xx, kl

Tentamen med lösningsförslag

Fortsä'ning Pekare. Ulf Assarsson. Originalslides av Viktor Kämpe

Digital- och datorteknik

Digital- och datorteknik

(Lösningsförslag finns sist i denna fil.)

Tentamen med lösningsförslag

Exempel 3 på Tentamen

Digital- och datorteknik. Lars-Eric Arebrink. Betyg 4: 36 poäng Betyg 5: 48 poäng

Digital- och datorteknik. Lars-Eric Arebrink. vid flera tillfällen. Betyg 4: 36 poäng Betyg 5: 48 poäng

Programmering av inbyggda system 2012/2013. Kodningskonventioner och programbibliotek. maskinnära programmering i C och assemblerspråk

CHALMERS TEKNISKA HÖGSKOLA

Assemblerprogrammets struktur; exempel

Digital- och datorteknik. Lars-Eric Arebrink. Betyg 4: 36 poäng Betyg 5: 48 poäng

Tentamen med lösningsförslag

Fortsä'ning Pekare. Ulf Assarsson. Originalslides av Viktor Kämpe

Maskinorienterad Programmering 2010/11

Avbrottshantering. Övningsuppgifter

Tentamen med lösningsförslag

Tentamen med lösningsförslag

Digital- och datorteknik. Mekatronik-, data- och elektroingenjör Åk 1/ lp 1o2. Lars-Eric Arebrink. Av institutionen utgiven. vid flera tillfällen

Tentamen. EDA452 Grundläggande Datorteknik, D DIT790 Digital- och datorteknik, GU. Måndag 17 December 2012, kl

Programmering i maskinspråk (Maskinassemblering)

Tentamen med lösningsförslag

Tentamen med lösningsförslag

Tentamen med lösningsförslag

Digital- och datorteknik

Exempel 2 på Tentamen med lösningar

Digital- och datorteknik

Maskinorienterad programmering, IT2

Programmering i maskinspråk (Maskinassemblering)

Grundläggande C-programmering del 2 Pekare och Arrayer. Ulf Assarsson

Digital- och datorteknik

TENTAMEN. Digital- och datorteknik. Institutionen för data- och informationsteknik Avdelningen för datorteknik LEU431. Lars-Eric Arebrink

Tentamen med lösningsförslag

Avbrottshantering. Övningsuppgifter Lösningsförslag Uppgift (Reservation för diverse fel!)

Programmera i C Varför programmera i C när det finns språk som Simula och Pascal??

DAT 015 Maskinorienterad programmering 2010/2011. Uppbyggnad_och_funktion.pdf

Ulf Assarsson. Grundläggande C-programmering del 2 Pekare och Arrayer. Läromoment:

Kodningskonventioner (XCC12) Specifikation av strncpy: Övningsexempel: Maskinorienterad Programmering 2011/2012

Assemblerprogrammets. struktur; exempel

EDA215 Digital- och datorteknik för Z

Digital- och datorteknik

Ansvarig lärare: Olof Andersson, Telefon (besöker skrivsalen)

Digital- och datorteknik. Lars-Eric Arebrink. Av institutionen utgiven instruktionlista FLEXIBLE INSTRUKTION SET PROCESSOR FLISP

Digital- och datorteknik

Grundläggande C-programmering del 2 Pekare och Arrayer. Ulf Assarsson

Tentamen med lösningsförslag

Digital och Datorteknik EDA /2011. EDA 451 Digital och datorteknik 2010/2011. Uppbyggnad_och_funktion.pdf

Enkla datatyper minne

Assemblerprogrammering för HCS12

Tentamen (Svar och lösningsförslag)

Tentamen med lösningsförslag

Assemblerprogrammering del 3

Assemblerprogrammering, ARM-Cortex M4 del 3

Digital- och datorteknik. Lars-Eric Arebrink. vid flera tillfällen. Betyg 4: 36 poäng Betyg 5: 48 poäng

Programmering av inbyggda system

Lösningar till tentamen i EIT070 Datorteknik

Lösningar till tentamen i EIT070 Datorteknik

Transkript:

Institutionen för data- och informationsteknik CHALMERS TEKNISKA HÖGSKOLA Tentamen med lösningsförslag DAT015 Maskinorienterad programmering IT DIT151 Maskinorienterad programmering GU Fredag 9 april 2010, kl. 08.30-12.30 Examinatorer Jan Skansholm, tel. 772 1012 Rolf Snedsböl, tel 772 1665 Kontaktpersoner under tentamen Roger Johansson, tel 772 5729 Tillåtna hjälpmedel Häftet Instruktionslista för CPU12 I den får rättelser och understrykningar vara införda, inget annat. Du får också använda bladet C Reference Card samt en av böckerna Vägen till C, Bilting, Skansholm, Studentlitteratur och The C Programming Language, Kerninghan, Ritchie Även i boken får rättelser och understrykningar vara införda, inget annat Tabellverk och miniräknare får ej användas! Allmänt Siffror inom parentes anger full poäng på uppgiften. För full poäng krävs att: redovisningen av svar och lösningar är läslig och tydlig. Ett lösningsblad får endast innehålla redovisningsdelar som hör ihop med en uppgift. lösningen ej är onödigt komplicerad. du har motiverat dina val och ställningstaganden assemblerprogram är utformade enligt de råd och anvisningar som givits under kursen och tillräckligt dokumenterade. C-program är utformade enligt de råd och anvisningar som givits under kursen. I programtexterna skall raderna dras in så att man tydligt ser programmens struktur. Lösningar anslås såsom anges på kursens hemsida. Betygslistan anslås såsom anges på kursens hemsida. Granskning Tid och plats anges på kursens hemsida. Betygsättning För godkänt slutbetyg på kursen fordras att både tentamen och laborationer är godkända. Tentamenspoäng ger slutbetyg enligt: 20p betyg 3 < 30p betyg 4 < 40p betyg 5

Uppgift 1 Maskinorienterad programmering - Tentamen 9 april 2010 2(9) Adressavkodning, bussystem I ett mikrodatorsystem med mikroprocessorn CPU12 används en 16 kbyte ROM-kapsel för att lagra program och en 2 kbyte RWM-kapsel för att lagra variabler. Dessutom används en 8-bitars "three-state"-buffert som inport och ett 8-bitars register som utport. I figur 1 visas hur "chip-select"-avkodningen för dessa är utförd. a) Redogör för var i adressrummet processorn kan läsa eller skriva i de olika enheterna. Alla adresser där en enhet kan nås skall redovisas. (5p) b) Konstruktören upptäcker vid provning av systemet att märkliga saker ibland händer vid läsning av indata från inporten. Hjälp konstruktören reda ut vad som händer. (3p) Indata Utdata A 15 A 0 R/W VMA OE Databuss A 15 A 2 A 1 A 0 VMA C Register (8) Databuss Adressbuss (A10 - A0) Adressbus s A 15 A 13 VMA R/W CS RWM 2 R/W A 15 A 14 A 13 VMA CS ROM 16 kbyte Databuss Databuss Uppgift 1 a) Minnesmodulerna i adressrum M tar upp följande adressområden: A 15 A 14 A 13 A 12 A 11 A 10 A 9 A 8 A 7 A 6 A 5 A 4 A 3 A 2 A 1 A 0 RWM 1 x 0 x x x x x x x x x x x x x 8000h - 9FFFh och C000h - DFFFh ROM 1 1 1 x x x x x x x x x x x x x E000h FFFFh Inport 0 x x x x x x x x x x x x x x 1 alla udda i 0001-7FFFh Utport 0 x x x x x x x x x x x x 1 1 1 alla som slutar på 111 i området 0007-7FFFh b) När man läser inporten på adresserna 0xxx xxxx xxxx x111 så adresseras också utporten, ty den har ingen R/W-signal, och data som läses från inporten skrivs då också i utporten.

Uppgift 2 Avbrott Maskinorienterad programmering - Tentamen 9 april 2010 3(9) En pulsgenerator är ansluten via en avbrottsvippa till IRQ-ingången på en MC12-system. Pulsgeneratorn har en frekvens på 100 Hz. För att nollställa avbrottsvippan krävs en läsning på den symboliska adressen IRQCLR. Pulsgeneratorn är den enda avbrottskällan anslutet till IRQ-ingången på processorn. a) Du skall skriva en avbrottsrutin (IRQCNT) som läser en 8-bitars inport (IRQIN) och adderar det inlästa värdet till en 32-bitars variabel (IRQVAR). Både IRQIN och IRQVAR är variabler på tvåkomplementsform. (6p) b) Skriv en initieringsrutin IRQINIT som initierar avbrottssystemet och som gör att IRQCNT anropas vid avbrott och att IRQVAR nollställs från början. (4p) Uppgift 2 a) IRQCNT LEAS -1,SP ; Tecken LDAB IRQIN ; läs 8 bitar SEX B,D ;.. och ändra till 16 bit STAA 0,SP ; Spara tecken-byte ADDD IRQVAR+2 ; addera bit0-15 STD IRQVAR+2 LDD IRQVAR ; höga delen ADCB 0,SP ; addera bit 16-23 ADCA 0,SP ; addera bit 24-31 STD IRQVAR TST IRQCLR ; nollställ avbrottsvippan LEAS 1,SP ; Städa stacken RTI IRQINIT PSHX MOVW #0,IRQVAR ; Init Var MOVW #0,IRQVAR+2 CLR IRQCLR ; nollställ avbrottsvippan LDX #IRQCNT ; avbrottsvektor STX $fff2 ; (alt 3ff2) CLI PULX RTS

Uppgift 3 Småfrågor Maskinorienterad programmering - Tentamen 9 april 2010 4(9) a) Realtidssystem. Vad är den principiella skillnaden mellan ett tids-styrt och ett händelse-styrt realtidssystem? b) Grafik. Vilket är viktigast för att öka prestanda på ett nytt grafikkort man utvecklar: (1p) c) Seriekommunikation. Vad händer i ett CAN-nät om två noder (NodA och NodB) skickar sina meddelanden vid exakt samma tidpunkt? (2p) d) Varför kan man inte skriva en avbrottsrutin i C om kompilatorn inte stöder asm-direktivet? (1p) (2p) Uppgift 3 a) I ett tidsstyrt system används rundfrågning medan i ett händelsesystem används avbrott. b) Minnesbandbredden (Se OH:n Grafik) c) När två noder försöker skicka ett meddelande vid exakt samma tidpunkt kommer meddelandet med högst prioritet att skickas i sin helhet. Sändningen av det andra meddelandet upphör under arbitreringen. d) Det finns inget annat sätt att få kompilatorn att generera instruktionen RTI i standard-c.

Uppgift 4 Maskinorienterad programmering - Tentamen 9 april 2010 5(9) Följande funktion finns given i C. Skriv motsvarande funktion i assemblerspråk för HC12. Förutsätt samma konventioner vid översättningen som i XCC12, (se bilaga 2). (6p) #define DATA *( char *) 0x700 #define STATUS *( char *) 0x701 void printerprint( char *s ) while( *s ) while( STATUS & 1 ) DATA = *s; s++; Uppgift 4 kompilatorgenererad kod void printerprint( char *s ) _printerprint: ; ; while( *s ) printerprint1: TST [2,SP] BEQ printerprint2 ; ; while(!( STATUS & 1) ) ; printerprint3: LDAB $0701 ANDB #$01 TSTB BEQ printerprint3 ; DATA = *s; LDAB [2,SP] STAB $0700 ; s++; LDX 2,SP INX STX 2,SP BRA printerprint1 printerprint2: ; ; RTS handoptimerad kod void printerprint( char *s ) _printerprint: ; ; while( *s ) LDX 2,SP printerprint1: TST,X BEQ printerprint2 ; ; while(!( STATUS & 1) ) ; printerprint3: LDAB $0701 ANDB #$01 BEQ printerprint3 ; DATA = *s; LDAB 1,X+ (även s++ nedan) STAB $0700 ; s++; BRA printerprint1 printerprint2: ; ; RTS

Uppgift 5 Standardfunktionen strpbrk beskrivs på följande sätt: char strpbrk ( char * str1, char * str2 ); Locate character in string Maskinorienterad programmering - Tentamen 9 april 2010 6(9) Returns a pointer to the first occurrence in str1 of any of the characters that are part of str2, or a null pointer if there are no matches. The search does not include the terminating null-characters. Parameters str1 str2 C string to be scanned. C string containing the characters to match. Return value A pointer to the first occurrence in str1 of any of the characters that are part of str2, or a null pointer if none of the characters of str2 is found in str1 before the terminating null-character. If none of the characters of str2 is present in str1, a null pointer is returned. Exempel på användning: int main () char str[] = "This is a sample string"; char key[] = "aeiou"; char * pch; printf ("Vowels in '%s': ",str); pch = strpbrk (str, key); while (pch!= NULL) printf ("%c ", *pch); pch = strpbrk (pch+1,key); printf ("\n"); return 0; Utskriften ska bli: Vowels in 'This is a sample string': i i a a e i Din uppgift är att, i C, skriva en egen definition av funktionen strpbrk. Du får inte använda dig av indexering, utan måste utnyttja pekare. Du får inte anropa någon annan standardfunktion. Du måste alltså skriva all kod själv. (10p) Uppgift 5 const char *strpbrk( const char *s, const char *breakat) char *sscan, *bscan; for (sscan = s; *sscan!= '\0'; sscan++) for (bscan = breakat; *bscan!= '\0';) if (*sscan == *bscan++) return((char *) sscan); return( (char *) 0 );

Uppgift 6 (10p) Maskinorienterad programmering - Tentamen 9 april 2010 7(9) Till en enkel skrivare hör de tre åttabitars register som visas i vidstående figur. Basadressen är 600 hexadecimalt. För att starta utskrift av ett tecken placeras tecknet i dataregistret och därefter skrivs en etta i bit 0 i kontrollregistret. Om man vill att skrivaren skall generera ett avbrott när utskriften är klar skall även bit 1 i kontrollregistret sättas. Om man angivit att avbrott skall användas skall avbrott kvitteras genom att bitarna 0 och 1 i kontrollregistret nollställs. När ett tecken skrivits klart sätter skrivaren en etta i bit 2 i statusregistret. Bitarna 0 och 1 sätter skrivaren om pappret är slut eller något fel inträffat. Bit 3 i statusregistret sätts om någon av bitarna 0 till 2 är satt. (Bitarna 0 till 2 i statusregistret visas även med lysdioder på själva skrivaren så att användaren kan se vilken status skrivaren befinner sig i. Det finns också en reset-knapp på skrivaren som användaren kan trycka på för att generera ett avbrott.) Avbrottsvektorn som hör till skrivaren har adressen 3FF4 hexadecimalt. Programmerarens bild av skrivarporten adress DATA (+0) CTRL (+1) STAT (+2) b 7 b 6 b 5 b 4 b 3 b 2 b 1 b 0 b 7-b 1 Printer data (ASCII) b 1 b 0 b 1 Data available (DAV) b 0 Interrupt Enable (IE) b 3 b 2 b 1 b 0 b 3 Attention (ATT) b 2 Printer ready (RDY) b 1 Error (ER) b 0 Paper out (PO) Assemblerrutinen som visas här är given: Din uppgift är att, helt i C, skriva en modul (både.h fil och.c fil) som styr skrivaren. Du måste också ev. skriva någon ytterligare fil för att det skall gå att kompilera dina filer. För att undvika busy-wait skall modulen internt använda en kö. Det finns en färdigskriven kö-modul som kan användas. Denna har include-filen: * Filen asm.s12 segment init export _printtrap export _sei export _cli import _print_inter _printtrap: jsr _print_inter rti _sei: sei rts _cli: cli rts // Filen queue.h #ifndef QUEUE_H #define QUEUE_H struct qstruct; // qstruct definieras i.c filen typedef struct qstruct *Queue; // typen Queue typedef unsigned char Data; // typen Data Queue new_queue(); // skapar en ny kö void delete_queue(queue q); // tar bort kön helt och hållet void clear(queue q); // tar bort köelementen men behåller kön int size(queue q); // ger köns aktuella längd int add(queue q, Data c); //lägger in c sist i kön, ger 1 om OK, 0 annars int copy_first(queue q, Data *pc); //kopierar första elementet dit pc pekar //ändrar inte kön, ger 1 om OK, 0 annars void remove_first(queue q); //tar bort det första elementet #endif Din modul skall innehålla följande två interna hjälpfunktioner, vilka inte skall kunna anropas utifrån: init_printer, skall om den inte anropats tidigare initiera avbrottsvektorn för skrivaren, skapa en ny kö och nollställa processorns interrupt-flagga. print_next, skall kontrollera att skrivaren är redo att ta emot ett nytt tecken och i så fall hämta det första tecknet från kön och initiera utskrift av tecknet. Om kön är tom, papperet är slut eller om det är något fel på skrivaren skall inget göras. Modulen skall ha två funktioner som kan anropas från andra delar av programmet: print, har en parameter av typen unsigned char, ger som resultat värdet 1 eller 0 beroende på om utskriften lyckades eller inte. Skall initiera skrivaren (om så behövs) och lägga tecknet som gavs som parameter sist i kön. Skall initiera utskrift av nästa tecken om så behövs. print_inter, saknar parametrar och resultat, anropas från avbrottsrutinen när avbrott skett. Skall kvittera avbrottet och initiera utskrift av nästa tecken.

Maskinorienterad programmering - Tentamen 9 april 2010 8(9) Uppgift 6 /* filen asm.h, ges av asm.s12 och behövs för C-rutinerna */ void printtrap(void); // avbrottrutin, anropar print_inter void sei(void); // sätter avbrottsflaggan i processorn void cli(void); // nollställer avbrottsflaggan i processorn /*.c */ #include "queue.h" #include "asm.h" #include <stddef.h> typedef unsigned char port; typedef port *portptr; #define DATA_REG (*(portptr) 0x600 ) #define CTRL_REG (*(portptr) 0x601 ) #define DAV 2 #define IE 1 #define STAT_REG (*(portptr) 0x602 ) #define RDY 4 #define ER 2 #define PO 1 typedef void (*vec) (void); typedef vec *vecptr; #define PRINT_VEC_ADR 0x3FF4 #define PRINT_VEC *((vecptr) PRINT_VEC_ADR) static Queue q = NULL; static void print_next() unsigned char c; if (! (STAT_REG & RDY)) return; /* Skrivaren upptagen med utskrift, avbrott kommer när tecknet är klart */ else if ((STAT_REG & (ER PO))) return; /* Fel, kan inget göra här */ else if (copy_first(q, &c)) /* hämta nästa tecken ur kön */ remove_first(q); DATA_REG = c; CTRL_REG = DAV IE; static void init_printer(void) if (q == NULL) q = new_queue(); PRINT_VEC = printtrap; cli(); void print_inter() CTRL_REG = 0; print_next(); int print(unsigned char c) init_printer(); if (!add(q, c)) return 0; if (size(q) == 1) print_next(); return 1; /*.h-fil med prototypdeklarationer */ extern void print_inter(void); // anropas vid avbrott extern int print(unsigned char); // ger 1 om OK, 0 annars

Maskinorienterad programmering - Tentamen 9 april 2010 9(9) Bilaga 1 - Assemblerdirektiv för MC68HC12. Assemblerspråket använder sig av mnemoniska beteckningar som tillverkaren Freescale specificerat för maskininstruktioner och instruktioner till assemblatorn, s k pseudoinstruktioner eller assemblerdirektiv. Pseudoinstruktionerna framgår av följande tabell: Direktiv Förklaring ORG N Placerar den efterföljande koden med början på adress N (ORG för ORiGin = ursprung) L RMB N Avsätter N bytes i följd i minnet (utan att ge dem värden), så att programmet kan använda dem. Följden placeras med början på adress L. (RMB för Reserve Memory Bytes) L EQU N Ger label L konstantvärdet N (EQU för EQUates = beräknas till) L FCB N1, N2 Avsätter i följd i minnet en byte för varje argument. Respektive byte ges konstantvärdet N1, N2 etc. Följden placeras med början på adress L. (FCB för Form Constant Byte) L FDB N1, N2 Avsätter i följd i minnet ett bytepar (två bytes) för varje argument. Respektive bytepar ges konstantvärdet N1, N2 etc. Följden placeras med början på adress L. (FDB för Form Double Byte) L FCS "ABC" Avsätter en följd av bytes i minnet, en för varje tecken i teckensträngen "ABC". Respektive byte ges ASCII-värdet för A, B, C etc. Följden placeras med början på adress L. (FCS för Form Caracter String) Bilaga 2: Kompilatorkonvention XCC12: Parametrar överförs till en funktion via stacken. Då parametrarna placeras på stacken bearbetas parameterlistan från höger till vänster. Prolog kallas den kod som reserverar utrymme för lokala variabler. Epilog kallas den kod som återställer (återlämnar) utrymme för lokala variabler. Den del av stacken som används för parametrar och lokala variabler kallas aktiveringspost. Beroende på datatyp används för returparameter HC12 s register enligt följande tabell: Storlek Benämning C-typ Register 8 bitar byte char B 16 bitar word short int D 32 bitar long long int Y/D