Forum: Mikrocontroller und Digitale Elektronik toolchain .bin .hex assembler


von bauchbursche (Gast)


Lesenswert?

Hallo guten Tag,

weiß jemand wie die AVR Toolchain  genau funktioniert?


1.) mit avr-gcc eine  *.bin-Datei erstellen.

avr-gcc -Wall -g -Os -mmcu=attiny13 -o main.bin main.c

2.) ein ihex datei erstellen

avr-objcopy -j .text -j .data -O ihex main.bin main.hex

* FRAGE1: Warum nicht gleich eine  *.hex Datei erstellen? Kann avr-gcc 
nicht avr-objcopy aufrufen?

https://blog.podkalicki.com/how-to-compile-and-burn-the-code-to-avr-chip-on-linuxmacosxwindows/

*.bin hat doch weniger Informationen (Nur Daten) als *.hex
wie arbeitet avr-objcopy, dass es das passende Informationen erstellt?

Außerdem:
Oft wird ja so eine Toolkette angegeben:
1
*c->Compiler -> *.s -> Assembler -> *.o->linker->*.bin
1
"The -S option tells gcc to stop after translating a source file into assembly language, before the
2
assembler is invoked. The output file is called <filename>.s"
3
4
"The GNU linker is a powerful application, but in many cases there is no need to invoke ld directly-- gcc
5
invokes it automatically unless you use the -c (compile only) option"

* FRAGE2: Kann der Gnu C Compiler eigentlich auch direkt Objektfiles 
erstellen? Oder wird dafür immer ein extra Assembler benötigt?

Vielen Dank

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Warum nicht einfach nur ein ELF?

Programmer wie avrdude verstehen auch ELF, da braucht man nicht erst 
über hex oder bin oder srec oder wer weiß was noch zu gehen.

> Kann der Gnu C Compiler eigentlich auch direkt Objektfiles erstellen?
> Oder wird dafür immer ein extra Assembler benötigt?

Ja.

: Bearbeitet durch User
von Stefan F. (Gast)


Angehängte Dateien:

Lesenswert?

bauchbursche schrieb:
> -o main.bin

Wenn ich eine *.bin Datei sehe, erwarte ich, dass das ein 1:1 Abbild des 
Programmspeichers im Binärformat ist. Die Datei die du mit "avr-gcc -o 
main.bin" erstellst ist aber eine ELF Datei. Die von dir gewählte 
Dateiendung ist irreführend. Das ELF Format ist das Linux Pendant zu 
*.exe.

Für Programmfragmente benutzt normalerweise das Suffix *.o. Für das 
finale komplette Programm nutzt man üblicherweise die Endung *.elf. 
Beide haben das ELF Dateiformat.

> Warum nicht gleich eine  *.hex Datei erstellen?

Weil die HEX Datei ein Abbild des Programmspeichers ist. Zum Debuggen 
brauchst du mehr Daten, zum Beispiel die Information, wo welche 
Funktionen und Variablen im Speicher liegen. Diese Infos sind in der ELF 
Datei enthalten (falls mit Parameter -g erzeugt).

> Kann avr-gcc nicht avr-objcopy aufrufen?

Keine Ahnung. Die ganze GNU Toolchain ist ja eigentlich dafür gedacht, 
von einem Build Tool (wie make) aufgerufen zu werden. Da tut es nicht 
weh, ein Kommando mehr zu konfigurieren. Abgesehen davon können die 
meisten Bedienprogramme für Programmieradapter direkt mit der ELF Datei 
als Input arbeiten. Damit ist die Erstellung der *.hex Datei optional.

> Kann der Gnu C Compiler eigentlich auch direkt Objektfiles erstellen?

Das tut er. Der gcc erzeugt Objekt Files. Die Datei die du main.bin 
genannt hasst, müsste eigentlich main.o heissen, denn das ist ein 
Objektfile.

> Oft wird ja so eine Toolkette angegeben:
> *c->Compiler -> *.s -> Assembler -> *.o->linker->*.bin

Manchmal hilft ein Blick in den Assembler Quelltext, um unerwartetes 
Verhalten nachzuvollziehen oder um Performance-Engpässe zu untersuchen. 
Man kann das Assembler-Listing auch nachträglich aus dem ELF File heraus 
generieren.

avr-objdump -h -S main.elf

von Axel S. (a-za-z0-9)


Lesenswert?

bauchbursche schrieb:
> weiß jemand wie die AVR Toolchain  genau funktioniert?

Ja. Dieses Forum ist allerdings nicht der Ort dafür und ein Post (und 
die Antworten darauf) sind nicht angemessen für die Darstellung der 
teils komplexen Zusammenhänge.

> 1.) mit avr-gcc eine  *.bin-Datei erstellen.
>
> avr-gcc -Wall -g -Os -mmcu=attiny13 -o main.bin main.c

Nein. Da passiert nicht das, was du denkst. In Wirklichkeit wird

1. die Datei main.c durch den C-Präprozessor gejagt
2. das Ergebnis an avr-gcc verfüttert, der daraus ASM Code erzeugt
3. der ASM Code wird von avr-as zum Objektcode übersetzt
4. der Objektcode wird mit Startup-Code und Libraries zu einer (im 
Prinzip) ausführbaren ELF Datei gelinkt

In epischer Breite nachzulesen unter den diversen Fundstellen von

https://www.google.com/search?q=gcc+stages+of+compilation

Daß du die Ausgabedatei *main.bin* nennst, ändert nichts daran, daß es 
in Wirklichkeit eine ELF [1] Datei ist.

[1] https://de.wikipedia.org/wiki/Executable_and_Linking_Format

> 2.) ein ihex datei erstellen
>
> avr-objcopy -j .text -j .data -O ihex main.bin main.hex

objcopy ist das Schweizer Armeemesser der Binutils. Es extrahiert die 
Sektionen .text (ausführbarer Maschinencode) und .data (Daten) aus der 
ELF Datei.

> * FRAGE1: Warum nicht gleich eine  *.hex Datei erstellen? Kann avr-gcc
> nicht avr-objcopy aufrufen?

Warum sollte der Compiler das? Die Frage die du dir vielmehr stellen 
solltest, ist warum du überhaupt eine HEX Datei brauchst. Die meisten 
Programmiertools verstehen ELF durchaus.

Andererseits verwenden 99% der Programmierer irgendein Buildtool. Das 
klassische wäre make. Da ist es vollkommen egal, ob man ein oder 10 
Kommandos ausführen muß.

> * FRAGE2: Kann der Gnu C Compiler eigentlich auch direkt Objektfiles
> erstellen? Oder wird dafür immer ein extra Assembler benötigt?

Den gcc gibt es für eine Menge Architekturen. Es ist denkbar, daß das 
Backend für einige direkt Maschinencode erzeugt. Für AVR aber nicht.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.