Forum: Mikrocontroller und Digitale Elektronik Avrdude Fehlermeldung verification error


von Matthias W. (matt007)


Lesenswert?

AVRDUDE soll ein Blinkprogramm laden in einen ATmega4809. Das Laden des 
Blinkprogramms Blink.ino.hex (3kB) aus der Arduino-IDE klappt:
1
avrdude -v -v -p atmega4809 -c arduino -P COM11 -b 115200 -D -U flash:w:Blink.ino.hex:i

Der Versuch mit einem main.hex (6kB) das dazu noch eine USART-Ausgabe 
macht (erstellt mit WinAVR) macht Probleme:
1
avrdude -v -v -p atmega4809 -c arduino -P COM11 -b 115200 -D -U flash:w:main.hex:i
1
1956 bytes of flash written
2
verifying flash memory against main.hex:
3
load data flash data from input file main.hex:
4
input file main.hex contains 1956 bytes
5
reading on-chip flasg data:
6
Reading ######
7
verifying ...
8
verification error, first mismatch at byte 0x0000
9
0x01 ! 0x6a
10
verification error; content mismatch

beim anderen file läuft es mit demselben Avrdude durch mit:
1
verifying ...
2
1312 bytes of flash verified

avrdude -v zeigt Version 6.3-20171130

gibt es eine Idee wie das gelöst werden kann?

Gruss
Matthias

von Stefan F. (Gast)


Lesenswert?

Ist die Stromversorgung in Ordnung? Mit Abblock-Kondensator?

von Matthias W. (matt007)


Lesenswert?

Stefan ⛄ F. schrieb:
> Ist die Stromversorgung in Ordnung? Mit Abblock-Kondensator?

an der CPU sind Block-Cs. Es ist diese Platine: 
Beitrag "Atmega4809nano"

das Flashen des Bootloaders klappte, das Beispiel Blink auch. Das 
selbsterstellte Blink-Programm main.hex mit USART mit WINAVR nun 
übersetzt, gelinkt will nicht laden. Ein Problem der Toolkette?

von Matthias W. (matt007)


Angehängte Dateien:

Lesenswert?

hier die beiden hex-Dateien. Das main.hex wird nicht korrekt geladen.

von Stefan F. (Gast)


Lesenswert?

Die blink.ino.hex beginnt an Adresse 0x0200.
Die main.hex beginnt hingegen an Adresse 0x0000.

Aus der Datei boards.txt 
(https://github.com/MCUdude/MegaCoreX/blob/master/megaavr/boards.txt) 
geht hervor, dass das Programm bei Verwendung des Booatloaders an 
Adresse 0x0200 beginnen muss:

> 4809.menu.bootloader.uart0_default.build.text_section_start=.text=0x200

Offenbar belegt der Arduino Bootloader den Teil davor. Da du das 
Programm mittels Bootloader installierst, hast du wohl keinen 
Schreibzugriff auf den Anfang des Flash Speichers, weswegen der 
Vergleich fehlschlägt.

Du musst das Programm entweder mit einem ISP Programmieradapter an 
Adresse flashen (und den Bootloader deaktivieren), oder du musst deine 
IDE so konfigurieren, dass sie den Platz für den Bootloader frei hält, 
so dass das Programm wie bei der Arduno IDE erst ab Adresse 0x0200 
beginnt.

Jemand anders kennt sich hier vielleicht mit deiner IDE aus und kann 
erklären, wo man das einstellt.

von Matthias W. (matt007)


Lesenswert?

Stefan ⛄ F. schrieb:
> Die blink.ino.hex beginnt an Adresse 0x0200.
> Die main.hex beginnt hingegen an Adresse 0x0000.

Vielen Dank für die Analyse Stefan ! so wird es klarer !

bisher verwendete ich Atmega328p mit Bootloader und WinAVR. Das klappte 
ohne daß es zu so einem Problem kam. Zum Programmieren nahm ich auch ein 
normales Makefile.

nun hat sich eigentlich nicht viel verändert, nur verwende ich statt 
Atmega328 einen Atmega4809 und habe mittels der Arduino-IDE auf diesen 
einen Bootloader gebrannt. Die Arduino IDE scheint das wohl zu erkennen 
und lädt dann wohl die Blink-Datei an eine passende Adresse.

das Makefile jedoch weiß nicht daß der Bootloader unten den Platz nun 
wegnimmt. So scheint es.

ist die Frage wie sich das Problem am besten lösen lässt. Entweder der 
Bootloader muss woanders hin oder das Programm dann.

ich bin weder für das Thema Bootloader noch für die IDE oder den 
Compiler ein Fachmann. Ich will das eigentlich nur nutzen.

Danke und Gruss
Matthias

von Stefan F. (Gast)


Lesenswert?

Matthias W. schrieb:
> bisher verwendete ich Atmega328p mit Bootloader und WinAVR. Das klappte
> ohne daß es zu so einem Problem kam.

Ja, weil bei dieser AVR Serie der Bootloader ganz am Ende des Flash 
Speichers liegt. Das Programm beginnt dort immer an Adresse 0x0000 egal 
ob mit oder ohne Bootloader.

> ist die Frage wie sich das Problem am besten lösen lässt.

Keine Ahnung. Ich würde mal in der Arduino IDE alle Details einschalten 
und mir die Kommandozeilen-Parameter angucken die von der IDE generiert 
werden.

von Matthias W. (matt007)


Lesenswert?

Stefan ⛄ F. schrieb:
> Ich würde mal in der Arduino IDE alle Details einschalten
> und mir die Kommandozeilen-Parameter angucken die von der IDE generiert
> werden.

Danke für den Hinweis Stefan !

beim Compiler sah ich das vor längerer Zeit mal genauer an, das war sehr 
unübersichtlich und wenig verständlich für mich. Es ging über mehrere 
Seiten. Daher wollte ich wieder zu WinAVR.

den Aufruf zu AVRdude habe ich von der Arduino-IDE übernommen. Nur 
klappt das eben nicht wenn der Code an die falsche Stelle gelinkt wird.

man müsste also die Linkerkommandos ansehen. Vermutlich kann man dem 
Linker sagen wo er das hinpacken soll. Beim Assembler war es früher ja 
genauso.

von Stefan F. (Gast)


Lesenswert?

Matthias W. schrieb:
> man müsste also die Linkerkommandos ansehen.

Ja, davon gehe ich aus.

von Matthias W. (matt007)


Lesenswert?

Stefan ⛄ F. schrieb:
> Ja, davon gehe ich aus.

hast Du vielleicht einen Link zu einer aktuellen Anleitung des Linkers 
dieser AVR-GCC-Umgebung 8.4? Ich bin zwar kein Profi - aber reinschauen 
könnte ich mal.

von Stefan F. (Gast)


Lesenswert?

Matthias W. schrieb:
> hast Du vielleicht einen Link zu einer aktuellen Anleitung des Linkers

von Einer K. (Gast)


Lesenswert?

Ich weiß gar nicht, wie man sich so **** anstellen kann.

Offensichtlich existiert eine Arduino IDE und sie kann mit dem Board 
umgehen.
Also schaut man sich die Parameter beim Kompilieren an.

Das Argument "das ist aber unübersichtlich" mag stimmen, ist aber nicht 
relevant, wenn man seine Ziele erreiche will!

Selbst mir, ohne ein solches Board zu haben ist es problemlos möglich 
dafür zu kompilieren und auch in die betreffende platform.txt zu 
schauen, denn dort finden sich die Parameter.

Da es dir nicht möglich ist den richtigen Eintrag zu finden, habe ich 
mir mal die Arbeit gemacht (ca 1 Minute) und kann ich dir hier den 
Arduino Linkeraufruf für Blink.ino zeigen:
1
"E:\gekürzter path/avr-gcc" -Wall -Wextra -Os -g -flto -fuse-linker-plugin -Wl,--gc-sections -Wl,--section-start=.text=0x200 -mmcu=atmega4809 -o "c:\\temp\\arduino_build_484401/Blink.ino.elf" "c:\\temp\\arduino_build_484401\\sketch\\Blink.ino.cpp.o" "c:\\temp\\arduino_build_484401\\core\\variant.c.o" "c:\\temp\\arduino_build_484401/core\\core.a" "-Lc:\\temp\\arduino_build_484401" -lm

von Stefan F. (Gast)


Lesenswert?

Da sind wohl diese drei Parameter relevant:

> -fuse-linker-plugin -Wl,--gc-sections -Wl,--section-start=.text=0x200

von Matthias W. (matt007)


Lesenswert?

Arduino Fanboy D. schrieb:
> und auch in die betreffende platform.txt zu
> schauen, denn dort finden sich die Parameter.

danke für den Hinweis auf diese Datei !

von Matthias W. (matt007)


Lesenswert?

Arduino Fanboy D. schrieb:
> und kann ich dir hier den
> Arduino Linkeraufruf für Blink.ino zeigen

Danke. Das -Wl,--section-start=.text=0x200 legt den Text wohl mit dem 
nötigen Offset ab. So etwas war zu vermuten.

von Matthias W. (matt007)


Lesenswert?

Stefan ⛄ F. schrieb:
> Da sind wohl diese drei Parameter relevant:

danke Stefan ! die Arduino IDE weiß wenn per Bootloader geladen werden 
soll und setzt dann im Linker den benötigten Offset. Dann ist klar daß 
es so gehen wird. Offset 200h sind die 512byte die der Bootloader wohl 
groß ist.

von Matthias W. (matt007)


Lesenswert?

Arduino Fanboy D. schrieb:
> Da es dir nicht möglich ist den richtigen Eintrag zu finden

die Suche nach den Einträgen in der Zeile des Linkers stand heute auf 
meiner Arbeitsliste. Danke daß Du es vor mir gefunden und gemeldet hast.

von Einer K. (Gast)


Lesenswert?

Och, das konnte ich nicht ahnen.....

Mir schien, das hättest du schon probiert, und wärst daran versagt.

von Matthias W. (matt007)


Lesenswert?

Arduino Fanboy D. schrieb:
> Mir schien, das hättest du schon probiert

nein - das stand auf der Arbeitsliste für heute unter dem Punkt: 
"Anschauen welche Befehle die Arduino IDE nutzt für das Linken"

auch der Punkt: "Mit Linkerkommandos probieren" steht da noch - 6 Zeilen 
tiefer.

Danke jedenfalls an Dich. War nett daß Du an mich gedacht hast !

von Matthias W. (matt007)


Lesenswert?

mein Versuch dem Linker über das Makefile den Offset beizubringen 
liefert eine Fehlermeldung:
1
avr.gcc: error: unrecognized command line option '--section-start=.text=0x200'

bei den LDFLAGS im Makefile steht:
1
LDFLAGS = -Wl,-Map=$(TARGET).map,--cref 
2
LDFLAGS += -Wl,--relax,--gc-sections 
3
LDFLAGS += -Wl,--section-start=.text=0x200

die letzte Zeile hatte ich neu hinzugefügt.

von Stefan F. (Gast)


Lesenswert?

Matthias W. schrieb:
> mein Versuch dem Linker über das Makefile den Offset beizubringen
> liefert eine Fehlermeldung

Das fehlt ja auch etwas. Es muss

> -Wl,--section-start=.text=0x200

heissen. -Wl, leitet Parameter ein, die gcc an den Linker weiter reichen 
soll.

von Matthias W. (matt007)


Lesenswert?

Stefan ⛄ F. schrieb:
> -Wl,--section-start=.text=0x200

genau diese Zeile habe ich doch oben drin.

von Stefan F. (Gast)


Lesenswert?

Matthias W. schrieb:
>> -Wl,--section-start=.text=0x200
> genau diese Zeile habe ich doch oben drin.

Die Fehlermeldung war
> unrecognized command line option '--section-start=.text=0x200'

Das sah für mich so aus, als ob der Teil "-Wl," fehlt.

ich habe das gerade mal mit einem beliebigen meiner Projekte 
ausprobiert. Ich habe zum Makefile nur diese eine Zeile hinzugefügt:

> LDFLAGS += -Wl,--section-start=.text=0x200

Und es funktioniert. Hast du vielleicht irgendwo ein Leerzeichen zu 
viel?

von Matthias W. (matt007)


Lesenswert?

Stefan ⛄ F. schrieb:
> Hast du vielleicht irgendwo ein Leerzeichen zu viel?

Danke Stefan ! Das Entfernen aller Leerzeichen löst das Problem.

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.