Menu Close

Mikroprozessorsysteme (Praktikum 1)

Organisatorisches

  • Praktika:
    • 6 Termine
    • Keine Testate für die einzelnen Termine mehr
    • Eigenverantwortung der Funktionsfähigkeit der Programme
    • Vorbereitung und Anwesenheit sind Pflicht für jeden Termin
    • Dokumentation in Form eines Pflichtenhefts müssen geführt werden
    • Die Dokumentation und das fertige Programm werden abgenommen.
    • Während der Abnahme hat man 10 Minuten Zeit den Prüfer zu überzeugen
  • Änderungen:
    • 8. Juni auf den 11. Juni verschieben ( 3. Block )

Hardware

  • Etablieren von Kommunikation zwischen:
    • Schnittstellen
    • Tasten
    • etc.
  • Beherrscht kein C++, aber ( bessere Performance )

Snavigator starten

  1. In den Zielpfad wechseln
  2. F4 drücken und ins integrierte Terminal wechseln
  3. „snavigator“ eingeben und mit Enter bestätigen
  4. New Project auswählen

Debugger

  • Wechseln von arm-elf auf arm-eb63-elf 
  • Im snavigator als Debugger „arm-eb63-elf-insight“ eintragen

Makefile

  • Wurde nun mittels Variablen aufgebaut und erlaubt mehr Dynamik beim Wechseln der Compiler

Optimierungsstufen

  • Im Praktikum sollte so viel wie möglich damit gespielt werden, um die Veränderungen zu beobachten.
  • Mittels volatile kann man das „Wegoptimieren“ von Variablen verhindern

Verbinden mit dem Mikrocontroller

  • Programmier-Schnittstelle befindet sich auf dem Adapter
  • File → Target Settings → Remote/TCP → 141.100.52.14:2001
  • Run → Connect to Target

Ziele

An ganz einfachen Programmen soll ermittelt werden, welchen Code ein Compiler erzeugt, wo welche Variablen abgefragt werden und wie ein call by value/ reference in ARM Assembler umgesetzt wird.

Aufgabe 1

In einer Tabelle sind die elementaren Datentypen auszufüllen.

DatentypBitkleinster Wertgrößter WertBemerkungen
Char80x80 / -1280x7F / 127 
short int160x8000 / -327680x7FFF / 32767 
Int(16)32(64)0x80000000 /-2.147.483.6480x7FFFFFFF /2.147.483.647Abhängig von Compiler und System
unsigned int1600xFFFFFFFF /2.147.483.648 
long int32(64)0x80000000 /-2.147.483.6480x7FFFFFFF /2.147.483.647Abhängig von Compiler und System
Float32ca. 3,4E-38ca. 3,4E38 
double64ca. 1,7E-308ca. 1,7E308 
long double80ca. 1,2E-4932ca. 1,2E4932

Aufgabe 2

Anzugeben sind die folgenden Zahlen sowohl als int als auch als float.

>Dezimal>int>float
>1>0x00000001>0x3F800000
>-1>0xFFFFFFFF>0xBF800000
>65535>0x0000FFFF>0x477FFF00
>1,024*10³>0x00000400>0x44FFFFFF
>2.963.527.434.23>0x44FFFFFFFF>0x4E8A0000

Aufgabe 3

In einem C Programm werden zwei lokale Variablen angelegt, denen die Werte 0x1 und 0x2 zugewiesen werden. Das Programm soll übersetzt und der erzeugte Code dokumentiert werden.

49 int iLoc1 = 0x1; 
0x8304 <main+248>: mov r3, #1 ; 0x1 // Variable 1 den Wert 0x1 zuweisen
0x8308 <main+252>: str r3, [r11, #-24] // und auf den Stack schieben
50 int iLoc2 = 0x2;
0x830c <main+256>: mov r3, #2 ; 0x2 // Variable 2 den Wert 0x2 zuweisen
0x8310 <main+260>: str r3, [r11, #-20] // und auf den Stack schieben 51

Aufgabe 4

Anstelle von lokalen Variablen sollen nun globale Variablen benutzt werden und die Veränderung dokumentiert werden.

54 iGlob1 = 0x1; 
0x8314 <main+264>: ldr r2, [pc, #72] ; 0x8364 <main+344>
0x8318 <main+268>: mov r3, #1 ; 0x1
0x831c <main+272>: str r3, [r2]
55 iGlob2 = 0x2;
0x8320 <main+276>: ldr r2, [pc, #64] ; 0x8368 <main+348>
0x8324 <main+280>: mov r3, #2 ; 0x2
0x8328 <main+284>: str r3, [r2]
56

Notiz: Wie man sieht werden die global definierten Variablen zunächst aus der data section geholt, modifiziert und schließlich wieder zurück geschrieben. Die Adressen der globalen Variablen findet man über den Befehl arm-eb63-elf-mn heraus.

Aufgabe 5

Nun sollen zwei globale und zwei lokale Variablen angelegt und die Zuweisung „global=lokal“ gemacht werden.

58 iGlob1 = iLoc1; 
0x832c <main+288>: ldr r2, [pc, #72] ; 0x837c <main+368>
0x8330 <main+292>: ldr r3, [r11, #-24]
0x8334 <main+296>: str r3, [r2]
59 iGlob2 = iLoc2;
0x8338 <main+300>: ldr r2, [pc, #64] ;
0x8380 <main+372>
0x833c <main+304>: ldr r3, [r11, #-20]
0x8340 <main+308>: str r3, [r2]

Notiz: Die globale Variable wird aus der data section geladen, die lokale Variable aus dem Stack. Anschließend erfolgt die Zuweisung. Durch eine höhere Optimierungsstufe wird die globale Variable direkt mit dem Wert der lokalen Variable initialisiert.

Aufgabe 6

Es wird eine Funktion addition erstellt, die als Parameter zwei lokale und einer globale Variable übergeben kriegt.

63 addition(iLoc1,iLoc2,iGlob1); 
0x833c <main+304>: ldr r2, [r11, #-108]
0x8340 <main+308>: ldr r1, [r11, #-112]
0x8344 <main+312>: ldr r3, [pc, #92] ;
0x83a8 <main+412>
0x8348 <main+316>: ldr r3, [r3]
0x834c <main+320>: mov r0, r2
0x8350 <main+324>: mov r2, r3
0x8354 <main+328>: bl
0x83b0 <addition>

Notiz: Es finden keine wesentlichen Änderungen im Vergleich zu Aufgabe 5 statt. Die höchste Optimierungsstufe lässt die Funktion vollständig verschwinden.

Schreiben Sie einen Kommentar

Ihre E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahren Sie, wie Ihre Kommentardaten verarbeitet werden.

Index