Forum: Compiler & IDEs Linux: Hex-File erstellen?


von Klaus (Gast)


Lesenswert?

Hallo,

ich möchte meinen uC (Atmega8) unter Linux programmieren 
(Programmiersprache C) und flashen.
Dazu habe ich avr-gcc und avrdude (+Dependencies) installiert.
Das Kompilieren des Quellcodes funktioniert einwandfrei, das Übertragen 
einer Hexfile zum uC ebenfalls (mit einer Testfile ausprobiert).

Ich habe aber keine Ahnung, wie ich vom Ergebnis des Compilers zu einer 
Hexfile komme?
1
avr-gcc -o2 -mmcu=atmega8 main.c -o main.out
...
1
avrdude -p m8 -c avr910 -P /dev/ttyUSB0 -U flash:w:main.hex -D

Es gibt zig Anleitungen, Forenbeiträge etc., die auf einen Thread von 
AVRfreaks verweisen. Damit wird aber die komplette 
Entwicklungsumgebung erzeugt, meine steht ja soweit.

Dadurch bin ich mir nicht sicher, was ich tun muss um eine Hexfile zu 
bekommen?

Besten Dank für Euer Bemühen.

Grüße
 K.

von Marci W. (Gast)


Lesenswert?

Hallo,

also für's konvertieren von a.out nach .hex wird eigentlich immer 
objcopy (bzw. avr-objcopy) eingesetzt. Oder habe ich Deine Frage nicht 
richtig verstanden?

ciao

Marcus

von olibert (Gast)


Lesenswert?

Fuer das Compilieren in Unix-Umgebungen bemueht man normalerweise ein 
Makefile. Diese enthaelt die notwendigen Compiler-Optionen.

Als Vorlage koenntest du Joergs Makefile-Generator nehmen..

http://www.sax.de/~joerg/mfile/

..oder falls du Zugriff auf eine WinAVR-Installation hast, nimm das 
Template von dort.

von Klaus (Gast)


Lesenswert?

Vielen Dank für die Hinweise.
Das avr-objcopy-Tool hatte ich ganz übersehen, das avr-objdump hatte ich 
mir angesehen :/

Mit folgendem Befehl habe ich nun versucht eine Hexfile zu erstellen. 
Fnktioniert auch fehlerfrei.
1
avr-objcopy -O ihex -I binary main.out main.hex

Beim flashen bekomme ich allerdings einen Fehler:
>avrdude: verification error, first mismatch at byte 0x0000
>         0x7f != 0x12
>avrdude: verification error; content mismatch

Zudem ist die Hexfile stolze 11kB groß geworden!

Den Makefile-Generator werde ich mir mal näher anschauen. Trotzdem 
müsste es doch eine Möglichkeit geben, über die o.g. Befehle einen 
Quellcode in den uC zu bekommen?!

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

olibert schrieb:
> Fuer das Compilieren in Unix-Umgebungen bemueht man normalerweise ein
> Makefile. Diese enthaelt die notwendigen Compiler-Optionen.

Jepp. Makefiles fallen ja bekanntlich vom Himmel...

Klaus schrieb:
>
1
avr-gcc -o2 -mmcu=atmega8 main.c -o main.out

Diese Ausgabe ist nicht in binary (bin), sondern die Standard avr-ld 
Ausgabe, also elf (elf32-avr). Von daher nennt man die Ausgabe weniger 
missverständlich besser main.elf. Zudem wird optimiert mit -O, nicht mit 
-o.

> Mit folgendem Befehl habe ich nun versucht eine Hexfile zu erstellen.
> Fnktioniert auch fehlerfrei.
>
1
avr-objcopy -O ihex -I binary main.out main.hex

Naja, nicht wirklich. Du schiebst das ganze ELF, binär und Bit für Bit 
auf den µC. Womit er erstens nix anfangen kann, und zweitens sind da 
noch Debug-Infos und allso'n Zeug drinne. Ergo:
1
avr-objcopy -j .text -j .data -O ihex main.elf main.hex

> Zudem ist die Hexfile stolze 11kB groß geworden!
>
> Den Makefile-Generator werde ich mir mal näher anschauen. Trotzdem
> müsste es doch eine Möglichkeit geben, über die o.g. Befehle einen
> Quellcode in den uC zu bekommen?!

Du willst nicht den Quellcode im µC ;-)

Johann

von Marci W. (Gast)


Lesenswert?

Klaus schrieb:
[...]
> Beim flashen bekomme ich allerdings einen Fehler:
>>avrdude: verification error, first mismatch at byte 0x0000
>>         0x7f != 0x12
>>avrdude: verification error; content mismatch

ich kenne avrdude nicht, aber das klingt, als würde nach dem 
programmieren des Speichers der nachträgliche Vergleich (Inhalt-Soll zu 
Inhalt-Ist) schiefgehen. Und das gleich an Adresse null. Seltsam. Kann 
eigentlich nicht am falschen Hex-File liegen, da der Programmer die 
geschriebenen mit den rückgelesenen Daten vergleicht. Mit falschem 
hexfile wird evtl. Dein Programm nicht laufen. Aber der Datenvergleich 
müsste trotzdem ein OK melden.

>
> Zudem ist die Hexfile stolze 11kB groß geworden!

Na ja, kommt darauf an, wie groß Dein Programm ist und welche 
Bibliotheken/Startup-Codes Du dazugelinkt/verwendet hast.

>
> Den Makefile-Generator werde ich mir mal näher anschauen. Trotzdem
> müsste es doch eine Möglichkeit geben, über die o.g. Befehle einen
> Quellcode in den uC zu bekommen?!

Quellcode? Verstehe ich jetzt nicht ganz.

ciao

Marcus

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Klaus schrieb:

> Beim flashen bekomme ich allerdings einen Fehler:
>>avrdude: verification error, first mismatch at byte 0x0000
>>         0x7f != 0x12
>>avrdude: verification error; content mismatch
>
> Zudem ist die Hexfile stolze 11kB groß geworden!

Es gibt einen wrap-around, weil der ATmega nur 8k Flash hat. Somit wird 
Byte 0x2000 an Adresse 0 geschieben usw. Beim Auslesen ergibt sich dann 
ein Fehler.

von Klaus (Gast)


Lesenswert?

Hallo,

ich möchte mir zunächst mal recht herzlich für eure Antworten bedanken.

>Du willst nicht den Quellcode im µC ;-)
Natürlich nicht, hatte mich missverständlich ausgedrückt.

Folgende (angepasste) Toolchain funktioniert leider auch nicht, beim 
Übertragen werden wieder
1
avr-gcc -O2 -mmcu=atmega8 main.c -o main.elf
1
avr-objcopy -j .text -j .data -O ihex main.elf main.hex
1
avrdude -p m8 -c avr910 -P /dev/ttyUSB0 -U flash:w:main.hex -D

>avrdude: verifying ...
>avrdude: verification error, first mismatch at byte 0x0001
>         0xc0 != 0x40
>avrdude: verification error; content mismatch

Immerhin ist die Hexfile nur noch 316 Bytes groß.

Zudem habe ich mich mit mfile beschäftigt und dies eingerichtet. Aber 
ich verstehe noch nicht ganz, wie ich dies anwenden soll.
Das Template habe ich nach meinen Wünschen angepasst, aber wie benutze 
ich dies nun?

Die Readme ist in der Richtung etwas mager, aber vielleicht ist auch 
alles so logisch und schlüssig, dass es gar nicht notwendig ist...? :)

von Oliver (Gast)


Lesenswert?

>Das Template habe ich nach meinen Wünschen angepasst, aber wie benutze
>ich dies nun?

Gar nicht...

Nimm das Original-Template, und lass das in Ruhe.

MFile starten, und in den Menus Quelldateien, Prozessor, 
Optimierungsstufem etc. einstellen. MFile trägt das dann an den 
richtigen Stellen ins makefile ein. makefile in den Projektordner 
abspeichern, dort make aufrufen, fertig. (ok, die Sourcen und die Pfade 
dazu kann man auch von Hand ins fertige makefile schreiben)

Oliver

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Klaus schrieb:

> Folgende (angepasste) Toolchain funktioniert leider auch nicht, beim
> Übertragen werden wieder
>
>
1
avr-gcc -O2 -mmcu=atmega8 main.c -o main.elf
>
1
avr-objcopy -j .text -j .data -O ihex main.elf main.hex
>
1
avrdude -p m8 -c avr910 -P /dev/ttyUSB0 -U flash:w:main.hex
2
> -D

>>avrdude: verifying ...
>>avrdude: verification error, first mismatch at byte 0x0001
>>         0xc0 != 0x40
>>avrdude: verification error; content mismatch
>
> Immerhin ist die Hexfile nur noch 316 Bytes groß.

Sieht eher wie ein Problem der Progger-Hardware aus als das einer 
falschen oder falsch angewandten Toolchain. Vielleicht mal die 
Übertragungsrate reduzieren.

Die Größe des Programmes ist nicht die Größe des Hexfiles. Die Größe des 
Programmes ist ablesbar in der Ausgabe von avr-size.

von Klaus (Gast)


Lesenswert?

Habe meinen "Fehler" gefunden, die Verwendung sieht dann bspw. so aus:
1
make -f Makefile

Wieder etwas dazu gelernt.
Alles funktioniert einwandfrei :)

Noch kurz erwähnt, wählt man bei mfile "usb" als Schnittstelle aus, wird 
auch nur "usb" in die Makefile geschrieben. Händisch kann man dies aber 
auch korrigieren. Aussehen muss es so:
>AVRDUDE_PORT = /dev/ttyUSB0

Besten Dank an alle netten Helfer!

von Oliver (Gast)


Lesenswert?

>Habe meinen "Fehler" gefunden, die Verwendung sieht dann bspw. so aus:
>make -f Makefile

Nennst du das Makefile makefile, dann sieht die Verwendung so aus:

make

Oliver

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Klaus schrieb:
> Habe meinen "Fehler" gefunden, die Verwendung sieht dann bspw. so aus:
>
1
make -f Makefile

Hast du etwa ein makefile und ein Makefile? Eigentlich sollte ein 
blankes "make" funktionieren:

http://www.gnu.org/software/make/manual/make.html#Makefile-Arguments

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Klaus schrieb:

> Noch kurz erwähnt, wählt man bei mfile "usb" als Schnittstelle aus, wird
> auch nur "usb" in die Makefile geschrieben.

Das ist OK.  Das ist für solche Programmiergeräte gedacht, die nicht
über eine virtuellen seriellen Treiber arbeiten (beispielsweise die
diversen Atmel-Tools oder USBasp), sondern die direkt über libusb
angesteuert werden müssen.

> Händisch kann man dies aber
> auch korrigieren. Aussehen muss es so:
>>AVRDUDE_PORT = /dev/ttyUSB0

Bei dir.  Bei anderen ist es vielleicht /dev/ttyUSB17, auf einem
anderen System ist es /dev/cuau3 oder /dev/cuaU0, und auf wieder
anderen Systemen einfach com14.  Ich kann versuchen, die ersten
zwei oder drei gängigen Namen solcher Seriell-Emulations-Schnitt-
stellen noch mit einzubauen, aber alles wird ein Mfile leider auch
nicht ohne händisches Editieren erschlagen können -- genauso, wie
es bei den "echten" USB-Tools den Fall nicht berücksichtigt, dass
man davon mehrere angeschlossen hat und diese nach Seriennummer
unterscheiden muss.

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.