www.mikrocontroller.net

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


Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?
avr-gcc -o2 -mmcu=atmega8 main.c -o main.out
...
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.

Autor: Marcus Woletz (mwoletz)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: olibert (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.
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?!

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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:
>
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.
>
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:
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

Autor: Marcus Woletz (mwoletz)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
avr-gcc -O2 -mmcu=atmega8 main.c -o main.elf
avr-objcopy -j .text -j .data -O ihex main.elf main.hex
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...? :)

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Klaus schrieb:

> Folgende (angepasste) Toolchain funktioniert leider auch nicht, beim
> Übertragen werden wieder
>
>
avr-gcc -O2 -mmcu=atmega8 main.c -o main.elf
>
avr-objcopy -j .text -j .data -O ihex main.elf main.hex
>
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ß.

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.

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habe meinen "Fehler" gefunden, die Verwendung sieht dann bspw. so aus:
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!

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Klaus schrieb:
> Habe meinen "Fehler" gefunden, die Verwendung sieht dann bspw. so aus:
>
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#...

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.