Ronny10
06.01.2007, 14:30
Wer Mikrocontroller programmiert (Hardware-Programmierung), sollte sich unbedingt mit der Programmierung in Assembler auskennen. In vielen Fällen ist es z.B. sehr wichtig das man genau weiss, welche Zeit ein Programm-Teil zur Auführung benötigt (zeitkritische Funktionen z.B. in Interrupt-Funktionen). Viele Fehler in einem C-Programm lassen sich durch einen Blick in die vom C-Compiler (GCC) erzeugte Assembler-Listdatei schnell auffinden (z.B. wegoptimierte Zeitschleifen usw.). Zur Erklärung (vereinfachte Darstellung): Der C-Compiler (GCC) erzeugt aus dem Quelltext, dem C-Programm-Text, eine Assembler-Datei. Diese Datei wird vom Assembler assembliert und der Assembler erzeugt daraus eine Object-Datei (.o). Der Linker erzeugt aus dieser Object-Datei, oder wenn das Programm aus mehreren C-Projekt-Dateien besteht, Object-Dateien, das fertige Programm. In unserem Fall (GCC) erzeugt der Linker eine spezielle Datei mit der Endung .hex. Es ist natürlich auch möglich, Assembler-Dateien in ein Projekt mit aufzunehmen. Assembler-Text-Dateien haben die Datei-Endung .s (nicht .c!). Wenn man z.B. im AVR-Studio für das aktuelles Projekt unter dem Menüpunkt: [Project][Configuration Options] die Option „Generate List File“ aktiviert (Häkchen unten rechts), wird bei der Compilierung des Projekts zusätzlich eine Assembler-List-Datei erzeugt. Diese Datei findet ihr dann in dem Projektordner [Other Files] mit der Datei-Endung .lss. Als Beispiel könnt ihr ja mal überprüfen, welches Assembler-Programm für eine Schleife in C bei den verschiedenen Optimierungs-Stufen des Compilers erzeugt wird. Die Optimierungs-Stufe wird im Projekt im AVR-Studio unter dem Menüpunkt: [Project][Configuration Options] Optimization eingestellt. Die Optimierung -Os steht z.B. für SIZE, also Programmgröße. Der Compiler versucht das fertige Programm so klein wie möglich zu erstellen. In der .lss-Datei müsst ihr nach der Zeile in der eure main()-Funktion beginnt suchen. Darunter befindet sich dann die for-Schleife. Bei entsprechendem Interesse, kann man ja das Thema „Assembler-Programmierung von Mikrocontrollern“ hier im Forum erweitern!
Das C-Programm für den Test:
#include <avr/io.h>
unsigned int i;
int main(void)
{
for(i=1; i; i++)
;
}
Compilierung mit Optimierungs-Stufe -O0
(Auszug aus der lss-Datei):
for(i=1; i; i++)
64: 81 e0 ldi r24, 0x01 ; 1
66: 90 e0 ldi r25, 0x00 ; 0
68: 90 93 61 00 sts 0x0061, r25
6c: 80 93 60 00 sts 0x0060, r24
70: 80 91 60 00 lds r24, 0x0060
74: 90 91 61 00 lds r25, 0x0061
78: 00 97 sbiw r24, 0x00 ; 0
7a: 51 f0 breq .+20 ; 0x90 <main+0x34>
7c: 80 91 60 00 lds r24, 0x0060
80: 90 91 61 00 lds r25, 0x0061
84: 01 96 adiw r24, 0x01 ; 1
86: 90 93 61 00 sts 0x0061, r25
8a: 80 93 60 00 sts 0x0060, r24
8e: f0 cf rjmp .-32 ; 0x70 <main+0x14>
Compilierung mit Optimierungs-Stufe -Os:
(Auszug aus der lss-Datei):
for(i=1; i; i++)
64: 81 e0 ldi r24, 0x01 ; 1
66: 90 e0 ldi r25, 0x00 ; 0
68: 90 93 61 00 sts 0x0061, r25
6c: 80 93 60 00 sts 0x0060, r24
70: 01 96 adiw r24, 0x01 ; 1
72: f1 f7 brne .-4 ; 0x70 <main+0x14>
74: 90 93 61 00 sts 0x0061, r25
78: 80 93 60 00 sts 0x0060, r24
Viel Erfolg: Peter (Ronny10)
Das C-Programm für den Test:
#include <avr/io.h>
unsigned int i;
int main(void)
{
for(i=1; i; i++)
;
}
Compilierung mit Optimierungs-Stufe -O0
(Auszug aus der lss-Datei):
for(i=1; i; i++)
64: 81 e0 ldi r24, 0x01 ; 1
66: 90 e0 ldi r25, 0x00 ; 0
68: 90 93 61 00 sts 0x0061, r25
6c: 80 93 60 00 sts 0x0060, r24
70: 80 91 60 00 lds r24, 0x0060
74: 90 91 61 00 lds r25, 0x0061
78: 00 97 sbiw r24, 0x00 ; 0
7a: 51 f0 breq .+20 ; 0x90 <main+0x34>
7c: 80 91 60 00 lds r24, 0x0060
80: 90 91 61 00 lds r25, 0x0061
84: 01 96 adiw r24, 0x01 ; 1
86: 90 93 61 00 sts 0x0061, r25
8a: 80 93 60 00 sts 0x0060, r24
8e: f0 cf rjmp .-32 ; 0x70 <main+0x14>
Compilierung mit Optimierungs-Stufe -Os:
(Auszug aus der lss-Datei):
for(i=1; i; i++)
64: 81 e0 ldi r24, 0x01 ; 1
66: 90 e0 ldi r25, 0x00 ; 0
68: 90 93 61 00 sts 0x0061, r25
6c: 80 93 60 00 sts 0x0060, r24
70: 01 96 adiw r24, 0x01 ; 1
72: f1 f7 brne .-4 ; 0x70 <main+0x14>
74: 90 93 61 00 sts 0x0061, r25
78: 80 93 60 00 sts 0x0060, r24
Viel Erfolg: Peter (Ronny10)