Klausur vom 10. Juli 2003 Assembler

Werbung
Berner Fachhochschule
Hochschule für
Technik und Architektur Burgdorf
Abt. Elektrotechnik
Labor für Technische Informatik
Klasse:
E4a/b
Name, Vorname:
Klausur vom 10. Juli 2003
Assembler-Programmierung und
Hardwarenahe Programmierung in C
Dauer:
8.00h bis 10.00h
Zulässige Hilfsmittel:
Abgegebene Skripte und Musterlösungen, ergänzt durch eigene Notizen und eigene Übungslösungen.
Buch von G. Schmitt “Mikrocomputer Technik mit dem Controller 68332”
Taschenrechner
Bemerkungen:
Die Aufgaben 1 und 2 sind auf Papier zu lösen und jedes Blatt ist mit Ihrem Namen zu versehen. Geben Sie bitte
am Schluss der Prüfung alle Aufgabenblätter in diesem Deckblatt ab.
Die Aufgaben 3 und 4 sind auf dem PC zu lösen. Speichern sie ihre Dateien im Directory "Klausur1". Machen
sie während der Klausur laufend Backups und drucken sie ihren Code am Ende auf dem Drucker aus (nur
Source-Files). Geben Sie bitte auch die ausgedruckten Blätter zusammen mit der Aufgabenstellung ab.
Für jede Aufgabe ist die zu erreichende Punktzahl angegeben. Einige der Aufgaben sind schwieriger, andere
leichter. Wir empfehlen Ihnen, zuerst alle Aufgaben kurz anzuschauen, bevor Sie mit der Prüfung beginnen.
Bei Unklarheiten fragen Sie uns bitte während der Prüfung.
Beilagen:
keine
Gewichtung / Bewertung der Aufgaben:
Aufgabe
max.Punktzahl:
erreicht:
Viel Glück
E. Firouzi, R. Weber
Klausur2.doc,10. Juli 2003, Fi/Wr
1
15
2
20
3
45
4
40
Seite 2 von 6
Aufgabe 1
Punkteverteilung: a): 5 b): 10
Total: 15
Der Code der nachfolgenden Aufgaben ist zu optimieren. Die Aufgabe ist auf Papier zu lösen.
Aufgabe 1a)
Optimieren sie in der Programmiersprache C folgende Anweisung:
val2 = (val1 * 4) / 64;
Beide Variablen (val1 und val2) sind vom Typ Integer.
Aufgabe 1b)
Der nachfolgende Assembler-Code addiert eine 16-bit Variable (var1) und eine 8-bit Variable (var2) und legt das
Ergebnis als 16-bit Wert in d3 ab. Als Hilfsvariable wird das Datenregister d1 verwendet:
move.l
clr.w
move.b
add.w
move.w
move.l
d1,-(a7)
d1
var2,d1
var1,d1
d1,d3
(a7)+,d1
//
//
//
//
//
//
Hilfsvariable d1 auf Stack retten
d1 loeschen, 16 bit!
d1 = var2
var1 addieren
Resultat in d3 ablegen
alter Wert von d1 zurueckholen
Optimieren sie diesen Code auf möglichst wenige Instruktionen!
Klausur2.doc,10. Juli 2003, Fi/Wr
Seite 3 von 6
Klasse:
E4a/b
Aufgabe 2
Name, Vorname:
Punkteverteilung: a) 5 b) 15 Total: 20
Betrachten Sie das folgende Programm, welches in C und Assembler definiert worden ist:
C-Code:
/* Deklaration der globalen Funktionen */
extern void swap(int *x, int *y);
/* Definition der lokalen Variablen */
int Array[3] = {1,3,2};
/* Definition der Hauptfunktion */
int main(int argc, char *argv[])
{
int i;
for(i = 0; i < 2; i++) {
// ß Stackpointer nach main-Aufruf
if(Array[i] > Array[i+1]) {
swap(&Array[i], &Array[i+1]);
}
}
return 0;
}
Assembler-Code:
_swap
move.w
CCR,-(A7)
; CCR-Register retten
movem.l
A0/A1,-(A7) ; A0 und A1 Register retten
link
A6,#-2
; 2 Bytes lokaler Variablenbereich fuer tmp
movea.l
20(A7),A0
; Linker Adresseoperator -> A0
movea.l
24(A7),A1
; Rechter Adresseoperator -> A1
move.w
(A0),(A7)
; Inhalt des A0 Zeigers -> tmp kopieren
move.w
(A1),(A0)
; Inhalt des A1 Zeigers -> Inhalt des A0 Zeigers
move.w
(A7),(A1)
; tmp -> Inhalt des A1 Zeigers
unlk
A6
movem.l
(A7)+,A0/A1 ; A0 und A1 zurueckholen
move.w
(A7)+,CCR
; CCR zurueckholen
rts
Aufgabe 2a)
Beschreiben Sie kurz was das Programm macht!
Klausur2.doc,10. Juli 2003, Fi/Wr
Seite 4 von 6
Aufgabe 2b)
Definieren Sie in der nächsten Tabelle wie der Stack in der Subroutine _swap, nach dem link-Befehl, aussieht!
Aufgepasst, für den Compiler besteht der Typ „int“ aus 16 bits.
Stack Pointer nach
dem main-Aufruf
Klausur2.doc,10. Juli 2003, Fi/Wr
Seite 5 von 6
Aufgabe 3
Punkteverteilung: a): 10 b): 12 c): 12 d): 11
Total: 45
Für einen MC68332 ist mit Hilfe des SCI-Modules eine serielle Schnittstelle (RS232) zu programmieren. Sie
können davon ausgehen, dass das SCI-Modul bereits initialisiert ist (8 Datenbits, kein Parity, kein Handshake).
Ihre Aufgabe ist es, eine Sende- und eine Empfangsfunktion zu schreiben. Dazu müssen sie auf folgende
Register zugreifen:
SCDR: SCI Data Register auf Adresse $FFFC0E
Dies ist ein 16-bit Register, wobei sie für diese Aufgabe nur die unteren 8 bits brauchen.
Wenn sie ein Zeichen (8 bits) übertragen wollen, so müssen sie dieses Zeichen ins SCDR-Register schreiben,
dadurch wird das Senden bereits gestartet. Wenn sie ein Zeichen (8 bits) empfangen wollen, so können sie dieses
Zeichen aus dem SCDR-Register lesen.
SCSR: SCI Status Register auf Adresse $FFFC0C
Dies ist ein 16-bit Register. Für die Aufgabenstellung sind folgende Bits interessant:
bit 8: TDRE = 0: Sendedatenregister SCDR enthält noch zu sendende Daten
TDRE = 1: Sendedatenregister ist leer, kann neue Daten aufnehmen
bit 6:
RDRF = 0: Empfangsdatenregister SCDR ist leer, keine Empfangsdaten vorhanden
RDRF = 1: Empfangsdatenregister enthält neue Daten
Diese Aufgabe ist auf dem PC zu lösen. Kompillierbare Files und ein Linkbares Projekt geben Zusatzpunkte
(Aufgabe a). Anmerkung: Wichtig ist nur, dass sie ein Projekt generieren, welches kompillierbar und linkbar ist,
die Funktionalität können sie ohne Kit natürlich nicht prüfen. Sie können diese Aufgabe auch auf Papier lösen,
dadurch verlieren sie jedoch einige Punkte aus Aufgabe a).
Aufgabe 3a)
Machen sie ein kleines Projekt mit folgenden Files: main.c und serial.68k . Die Funktionen zum Senden und
Empfangen von Zeichen (Aufgabe 3b und 3c) sollen sie in Assembler programmieren und im File serial.68k
ablegen. Die Testfunktion aus Aufgabe 3d ist in C zu programmieren und im File main.c abzulegen. Das Projekt
soll kompillierbar und linkbar sein. Die Files sollen einen angemessenen Header haben. Die Funktionen müssen
sie nicht nochmals beschreiben (liegt ja schon in dieser Aufgabenstellung vor), hingegen sollten sie ihren Code
kommentieren!
Aufgabe 3b)
Schreiben sie in Assembler den Code für eine Funktion putchar(), welche in C wie folgt definiert wäre:
int putchar (int c);
Die Funktion putchar() schreibt das Zeichen c (umgewandelt in unsigned char) auf die serielle Schnittstelle. Die
Funktion liefert das ausgegebene Zeichen zurück. Tritt ein Fehler auf (z.B. Sendebuffer ist voll) so wird EOF
zurückgegeben (EOF soll als –1 definiert werden).
Aufgabe 3c)
Schreiben sie in Assembler den Code für eine Funktion getchar(),welche in C wie folgt definiert wäre:
int getchar(void);
Die Funktion getchar() liefert das nächste Zeichen von der seriellen Schnittstelle als unsigned char
(umgewandelt in int) oder EOF bei Fehler (z.B. wenn der Empfangsbuffer leer ist).
Aufgabe 3d)
Schreiben sie in ihrem Mainprogramm eine Testfunktion, welche empfangene Zeichen von der seriellen
Schnittstelle einliest und diese gleich wieder ausgibt (Echo). Verwenden sie dazu die Funtkionen putchar() und
getchar().
Klausur2.doc,10. Juli 2003, Fi/Wr
Seite 6 von 6
Aufgabe 4
Punkteverteilung: a): 5 b): 10 c): 20 d): 5
Total: 40
Mit der angegebenen Schaltung soll einen Digitalthermometer realisiert werden.
X
PA0
X>Y
Y
CPU
MC68332
PIO
82C55A
PB0-PB5
1
aus
64
LED
TemperaturSensor
PC0-PC5
D/A
Der Temperatursensor liefert eine Spannung im Bereich von 0 Volt bis 16 Volt am X-Eingang des Komparators,
die der gemessenen Temperatur proportional ist. Der D/A-Wandler (Digital/Analog) liefert eine
Ausgangsspannung in 0.25 Volt Schritten, die abhängig von der Binärzahl PC0-PC5 ist. Diese Spannung liegt
im Bereich von 0.0 Volt (PC = 000000) bis 15.75 Volt (PC = 111111) und wird am Y-Eingang des Komparators
geliefert. Ist die Spannung am X-Eingang größer als die am Y-Eingang, so reagiert der Komparator mit einer
logischen „1“ an seinem Ausgang (PA0 = 1).
Aufgabe:
Schreiben Sie ein C-Programm, welches die obige Temperaturmessung realisiert! Halten Sie sich dabei an den
folgenden Programmablauf:
a) Erzeugen Sie ein kleines Projekt. Das Programm soll wie folgt aufgeteilt sein:
·
Code ab Adresse $7000
·
Variablen ab Adresse $9000
b) Die zu implementierende Messmethode soll auf die interne Datenpufferregister (PA, PB, PC und
Configuration) des PIO zugreifen. Der PIO hat als Vorgabe eine Basisadresse von 0X10000 (Hexadezimal
in C). Die Offsets der internen Register zu dieser Basisadresse können in der folgenden Tabelle entnommen
werden. Definieren Sie eine C-Datenstruktur, mit welchem auf die vier Register des PIO zugegriffen werden
kann! Eine Variante der absoluten Adressierung kann dazu verwendet werden.
A1
A0
Register
0
0
PA
0
1
PB
1
0
PC
1
1
Configuration Register
c) Definieren Sie anschließend die Hauptfunktion um die Temperatur als Funktion der Spannung zu
bestimmen! Dabei soll die Temperatur nach erfolgter Bestimmung auf der angeschlossenen
Leuchtdiodenkette anzeigt werden.
Hinwies: Um die Temperatur als Funktion der Spannung zu bestimmen, muss zuerst im Datenpufferregister
des A/D-Wandlers einen Nullwert geschrieben werden (PC-Register). Dieser Wert soll dann systematisch
inkrementiert werden, bis die Ausgangsspannung des A/D-Wandlers größer als die Ausgangsspannung des
Temperatursensors wird. Anschließend kann der letzte getestete Wert des A/D-Wandlers im
Datenpufferregister der Leuchtdiodenkette geschrieben werden (PB-Register).
d) Die Temperaturmessungen soll kontinuierlich alle 10 Sekunden durchgeführt werden. Wie würden Sie das
realisieren?
Klausur2.doc,10. Juli 2003, Fi/Wr
Herunterladen