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 C ( bessere Performance )
Snavigator starten
- In den Zielpfad wechseln
- F4 drücken und ins integrierte Terminal wechseln
- „snavigator“ eingeben und mit Enter bestätigen
- 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.
| Datentyp | Bit | kleinster Wert | größter Wert | Bemerkungen |
| Char | 8 | 0x80 / -128 | 0x7F / 127 | |
| short int | 16 | 0x8000 / -32768 | 0x7FFF / 32767 | |
| Int | (16)32(64) | 0x80000000 /-2.147.483.648 | 0x7FFFFFFF /2.147.483.647 | Abhängig von Compiler und System |
| unsigned int | 16 | 0 | 0xFFFFFFFF /2.147.483.648 | |
| long int | 32(64) | 0x80000000 /-2.147.483.648 | 0x7FFFFFFF /2.147.483.647 | Abhängig von Compiler und System |
| Float | 32 | ca. 3,4E-38 | ca. 3,4E38 | |
| double | 64 | ca. 1,7E-308 | ca. 1,7E308 | |
| long double | 80 | ca. 1,2E-4932 | ca. 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.