Mathias hat geschrieben:Das ist eine interessante Frage, Lazarus erzeugt eine elf, bin und hex.
An averdude übergibt man dann die hex, obwohl dies eine Zext-Datei ist.
Vielleicht kann da Timm Thaler helfen.
Leicht.
Lazarus erzeugt die gar nicht. Lazarus kompiliert die einzelnen Pascal-Dateien Deines Projektes zu Assembler-Code. Das sind die *.s-Dateien. Diese werden dann den avr-embedded-exes aus den Binutils übergeben, die einen Linker und Assembler enthalten. Erst diese erzeugen dann den Maschinencode, wie sie es auch mit jedem selbstgeschriebenen Assembler-Code machen würden* (soweit ich das verstanden habe).
Die *.bin enthält den reinen Maschinencode, so wie er später im Controller stehen wird. Der hat aber den Nachteil auch Nullzeichen (0x00) oder Steuerzeichen enthalten zu können, quasi den ganzen Zeichenraum von 0x00 bis 0xFF. Das kann bei Übertragung oder beim Dateilesen Probleme machen, deswegen nimmt man den eigentlich nicht zum Programmieren. Wenn man die *.bin nicht braucht, kann man die Erzeugung auch unterdrücken bzw. wieder löschen lassen.
Die *.elf ist ein sogenanntes production file, welches neben dem Programmcode auch noch EEPROM-Inhalt und Fusebit-Konfiguration beinhaltet. Vorteil, man hat alles zusammen, Nachteil, manche Programmer können damit nichts anfangen.
Die *.hex ist ein uraltes universelles Format, welches schon die alten Römen zum Programmieren ihrer Katapulte verwendeten:
https://de.wikipedia.org/wiki/Intel_HEX Großer Vorteil, es enthält den Maschinencode in Hex-Darstellung, daher keine Steuerzeichen die Ärger machen können, und es enthält Adressen und Checksummen. Nachteil, durch die Hex-Darstellung braucht es zwei Bytes pro Flashbyte, die Datei ist doppelt so groß. Die Hex-Daten werden vom Programmer wieder in Maschinenbytes zusammengefasst. Wenn euer Opa euch erzählt, wie er früher Maschinencode programmiert hat, dann hat er solche Hex-Zahlen in das Programmiergerät getippert.
Da die *.hex eigentlich** keine EEPROM-Daten enthält, bekommt man wenn man EEPROM-Konstanten ablegt (wobei ich noch nicht probiert habe wie das in Pascal geht) noch eine *.eep-Datei. Diese muss zusätzlich zur *.hex-Datei gebrannt werden.
*) Mit avr-embedded-objdump kann man sich übrigens aus einer *.bin oder *.hex wieder Assembler-Code machen, um zu überprüfen was da zusammenkompiliert wird - oder um mal zu gucken, was andere so machen. Dazu muss man allerdings bißchen Assembler verstehen.
**) Da beim AVR der EEPROM hinter dem Flash liegt, kann man EEPROM-Daten mit in das *.hex-File schreiben und an den AVR übertragen. Allerdings können a) nicht alle Programmer damit umgehen und b) wenn man mit einem Bootloader programmiert kann es passieren, dass man in den Bootloader hineinschreibt, bis er "abstürzt" (er überschreibt sich selber bis zur Funktionsunfähigkeit) - und dann isser tot.