Hallo,
warum unterscheiden bzw. wo unterscheiden sich die beiden Formate in der
Code erstellung?
Hintergrund:
Ich habe ursprünglich den ethersex Bootloader verwendet und damit
binarys geflasht. Nun hatte ich das Problem das der Code nicht sauber
ausgeführt wurde.
Das Äuserte sich in der fehlerhaften Übertragungen des Uart. Ich bin ums
verrecken nicht hinter den Fehler gekommen.
Dann habe ich das binary File mal direkt geflasht und ... fehlerhafte
Übertragungen. Erstelle ich aber ein Hex File (Selber Code) und flashe
direkt ist alles ok.
Ich bin bisher nicht dahinter gekommen warum das so ist.
System
Atmega644 16MHz und avrdude
Kann mir einer erklären worauf ich bei binarys achten muss.
Gerry
Bei neueren GCC version gibt es m.M.n. die Möglichkeit die Fuses direkt
ins Hexfile zu integrieren. Der Programmer muss dies dann natürlich
unterstützen, aber falls deiner dies kann, dann ist das Problem somit
wohl auch gleich gefunden. Ich nehme an die Fehler mit der Uart stammen
von falschen Fusebits, die in den Binary files nicht enthalten sind und
somit manuell vorgenommen werden müssten.
Hallo,
die Fusebits sind es nicht.
Der Uart funktioniert ja soweit. Nur werden halt nicht alle Zeichen
übertragen.
Beispiel String "12345 12345 AAAAA BBBB" steht fest im Programm
Mit binary wird "AAA BBBB" übertragen bei ihex alles.
Ich hab das Gefühl das es irgendetwas mit dem Speicherbereich zu tun
hat.
Aber wie gesagt ich komm nicht dahinter.
Kann es sein das Progmem Chars anders bei binary code behandelt/abgelegt
werden?
Gerry
Gerry L. schrieb:> Kann es sein das Progmem Chars anders bei binary code behandelt/abgelegt> werden?
Nein, beides sind reine Image-Formate, d. h. sie enthalten einen
Speicherabzug. Bei Intel Hex gibt's zusätzlich noch Adressinfor-
mationen, sodass man nicht benötigte Adressen überspringen kann und
auch bei Adressen ≠ 0 beginnen kann, während ein reines Binary
implizit bei Adresse 0 beginnt und nur einen einzigen, in sich
zusammenhängenden Speicherblock enthalten kann.
Von irgendwelchen Spielereien auf Quell- oder Objektcodeebene wie
im Flash abgelegten Daten haben beide Formate keinerlei Information
mehr enthalten.
Danke für die Infos, leider erklärt das immer noch nicht warum nun ihex
geht und binary nicht.
Ich hab den Bootloader zwar mitlerweile auf einen ihex loader umgestellt
aber eine Lösung des Problems ist es nicht.
Ich erlaube mir mal ein Stück code zu zeigen. Bei welchem es Probleme
gibt.
Beschreibe ich den Uart mit
1
voidusart_write_str(char*str){
2
3
while(*str){
4
usart_write_char(*str++);
5
}
6
}
ist alles bestens, aber mit der folgenden Routine werden Zeichen
verschluckt.
Du könntest Dir im Programm eine CRC über das Flash bzw. einzelne
Flashbereiche berechnen und ausgeben lassen.
Dann könntest Du Dich damit an das Problem herantasten:
Welche Flashbereiche sind tatsächlich unterschiedlich?
Es liegt nicht am flashen selber. Da ich nach feststellung des Problems
das Programm direkt mit dem STK500 geflasht habe, also ohne Ethernet
Loader. Das Problem bleibt leider das gleiche.
Welche Flashbereiche unterschiedlich sind weiss ich nicht.
Er kommt aber beim binary nicht mit pgm_read_byte klar.
Gerry L. schrieb:> okay, hier sind sie.
Gut, sie stimmen zumindest überein.
Du schreibst, dass du sie mit einem Bootloader programmierst. Kann
der mit irgendwas in deiner Umgebung ein Problem haben? Beim Intel-
Hex-Format kann er ja zumindest rudimentär überprüfen, ob jede Zeile
korrekt übertragen worden ist (anhand einer einfachen Prüfsumme)
und diese ggf. nochmal neu anfordern. Bei einer reinen Binärdatei
geht das nicht.
Hallo Jörg,
meine letzten Tests fanden ohne Bootloader statt.
Ich habe beide Files direkt mit dem stk500 geflasht und keine Fehler
erhalten.
Da mein PC gerade ein Upgrade erhält habe ich die hochgeladenen Files
mit dem Laptop kompiliert. Sobald ich Zeit habe werde ich alles nochmal
am PC durch testen.
Schönes WE
Gerry
Wenn Du einen Debugger hast, kannst Du den Flash-Inhalt in beiden Fällen
auslesen und vergleichen.
Oder Du könntest Dir doch CRCs über die Flash-Bereiche berechnen und
ausgeben.
Ich hab z.B. folgenden Anwendungsfall:
Beim PIC24 hab ich sog. "Config Register" (ähnlich Fuses beim AVR) im
Hexfile drinn. Diese liegen in einem speziellen Flash-Bereich. Der
Debugger programmiert mir alles (inkl. ConfigRegs), mein Bootloader
programmiert die ConfigRegs aber explizit nicht (weil er sonst eventuell
selber nicht mehr funktioniert). D.h. je nach verwendeter
Programmiermethode wird dort ein Flash-Bereich beschrieben oder eben
auch nicht.
Hallo,
ich habe leider keinen Debugger.
Was ich nicht verstehe ist wenn beide Files gleich sind und ich beide
files mit dem stk500 (ohne Bootloader also direkt) flashe warum
funktioniert das ihex aber das binary nicht.
Fakt ist ein
1
usart_write_char("Test");
kommt vollständig an aber ein
1
usart_write_P(PSTR(format),##args)
nur verstümmelt. Es fehlen die ersten chars.
Ich werde mal versuchen das auf einen Atmega64 zu testen.
Aber wie Jörg schon sagte sind beide Files gleich.
@Jörg
Wie hast du das eigentlich getestet das beide Files gleich sind?
Gerry
Gerry L. schrieb:> Was ich nicht verstehe ist wenn beide Files gleich sind und ich beide> files mit dem stk500 (ohne Bootloader also direkt) flashe warum> funktioniert das ihex aber das binary nicht.
Das ist auch nicht zu verstehen. Möglicherweise hast du noch
andere Randbedingungen, die sich zwischen beiden unterscheiden.
> Wie hast du das eigentlich getestet das beide Files gleich sind?
Das Hexfile mittels avr-objcopy auch noch in ein binäres gewandelt
und dann beide mit cmp -l verglichen.
Stefan Ernst schrieb:> Ich würde dann noch als weiteren Test in beiden Fällen den Inhalt des> Flash wieder auslesen und miteinander vergleichen.
Macht die Programmiersoftware normalerweise aber ohnehin von sich
aus (sowohl AVRDUDE als auch die Backends von AVR Studio).
Jörg Wunsch schrieb:> Stefan Ernst schrieb:>> Ich würde dann noch als weiteren Test in beiden Fällen den Inhalt des>> Flash wieder auslesen und miteinander vergleichen.>> Macht die Programmiersoftware normalerweise aber ohnehin von sich> aus (sowohl AVRDUDE als auch die Backends von AVR Studio).
Ja, aber bei so einem skurrilen Problem würde ich mich nicht darauf
verlassen und es besser selber noch mal kontrollieren. Vielleicht findet
ja beim Binary bereits beim Einlesen eine Verfälschung selbigen statt,
das würde das automatische Verify dann nicht entdecken.
Stefan Ernst schrieb:> Ja, aber bei so einem skurrilen Problem würde ich mich nicht darauf> verlassen und es besser selber noch mal kontrollieren.
Mag er tun, aber ich verwette meine nicht vorhandene Perücke, dass
das nichts ergeben wird.
Jörg Wunsch schrieb:> Stefan Ernst schrieb:>>> Ja, aber bei so einem skurrilen Problem würde ich mich nicht darauf>> verlassen und es besser selber noch mal kontrollieren.>> Mag er tun, aber ich verwette meine nicht vorhandene Perücke, dass> das nichts ergeben wird.
Wenn ich wetten sollte, dann würde ich auch darauf setzen, dass es
nichts ergibt. Trotzdem ...
Und einen Alternativ-Vorschlag, was da schief laufen könnte, hast du ja
auch nicht. ;-)
Stefan Ernst schrieb:> Und einen Alternativ-Vorschlag, was da schief laufen könnte, hast du ja> auch nicht. ;-)
Doch, debuggen. Aber das kann er nicht.
Also, ich habe nun einmal per avrdude das ihex file in den mc geflasht
und mit dem Studio4 ausgelesen.
Das selbe dan mit dem binary....
Nach dem auslesen beide verglichen und ... sie unterscheiden sich!?
Was nun ?
Beide Files im Anhang.
Die Unterschiede sind ziemlich am Anfang.
Wenn gewünscht kann ich auch gerne das gesamte Projekt hochladen oder
vieleicht das Makefile. Es kann gut sein das ich irgendetwas falsch
mache.
Gerry
Wie wurde denn das binary.hex auf den µC geladen, bzw. wie entstand es ?
Ist es dieselbe Quelle ?
Der Unterschied besteht darin, dass Progmem-Daten, die unmittelbar vor
der Webseite eingebunden werden, Auszug daraus:
> Compiliert am Jun 1 2012 um 21:32:12> System Ready> MAC 0x%2x:0x%2x:0x%2x:0x%2x:0x%2x:0x%2x> RESET - reset the AVR - Controller> REBOOT - reboot from TFTP-Server
statt wie im ihex ein 0x0D 0x0A (CR/LF), im binary nur ein 0x0A (LF)
enthalten, was zu Darstellungsproblemen führen kann.
Der restliche Programmcode scheint gleich zu sein. Delay 62,5ms, ein
Timer mit einem Sprung auf 0, ISR's vorhanden aber Interrupts
deaktiviert, dafür wird das SPSR gepollt. Kein Schreibzugriff dagegen
auf UDR0, so dass man eine fehlerhafte Ausgabe nachvollziehen könnte.
Die Übertragungskette um das Programm auf den Controller zu bekommen,
wird nicht selektiv ein CR/LF in ein LF verändern. Sicher, dass die
richtigen Versionen kompiliert werden (Jun 1) ?
MWS schrieb:> Wie wurde denn das binary.hex auf den µC geladen, bzw. wie entstand es ?> Ist es dieselbe Quelle ?
Es wurde per makefile aus dem .elf ein ihex und binary erstellt.
Per avrdude erst das ihex geflasht mit atmel studio 4 ausgelesen
dann per avrdude das binary geflasht unt mit atmel studio 4 ausgelesen.
> Der Unterschied besteht darin, dass Progmem-Daten, die unmittelbar vor> der Webseite eingebunden werden, Auszug daraus:>>> Compiliert am Jun 1 2012 um 21:32:12>> System Ready>> MAC 0x%2x:0x%2x:0x%2x:0x%2x:0x%2x:0x%2x>> RESET - reset the AVR - Controller>> REBOOT - reboot from TFTP-Server>> statt wie im ihex ein 0x0D 0x0A (CR/LF), im binary nur ein 0x0A (LF)> enthalten, was zu Darstellungsproblemen führen kann.
Aber genau das ist doch das Problem es sollte keine Unterschiede geben.
> Sicher, dass die> richtigen Versionen kompiliert werden (Jun 1) ?
Ja.
Jörg Wunsch schrieb:> Das Binary ggf. per FTP auf einen anderen Rechner transferiert, und> dabei den ASCII-Modus benutzt?
Unwahrscheinlich dass dabei lediglich im Bereich bis ungefähr Flashbyte
2000 das CR entfernt wurde, denn ab Beginn der inkludierten Webseite ist
alles wieder normal.
Oben angehängtes "avr.bin" enthält übrigens die 0D0A Sequenz auch im
Bereich bis Byte 2000.
Gerry L. schrieb:> Aber genau das ist doch das Problem es sollte keine Unterschiede geben.
Wobei Du ja herausfinden möchtest wo der Fehler liegt, bzw. in welchem
Teil der Kette eine Verfälschung eintritt.
Kannst Du denn mal auch mit AVR-Studio flashen statt mit Avrdude, um
dort Fehler auszuschließen ?
Auch wäre die inkludierte Datei interessant, welche den von mir
geposteten Textauszug enthält, und wie sie im Quellcode eingebunden ist.
> Es wurde per makefile aus dem .elf ein ihex und binary erstellt.
Mach doch obigen Versuch nochmal und poste nicht nur die runter- sondern
auch die hochgeladenen Dateien (bin & hex), das sind dann 4, mach' ein
Zip draus und stell's hier ein.
Sieht alles recht mysteriös aus.
Habe gerade nochmal nachgesehen, avrdude selbst sollte eigentlich
korrekt arbeiten:
1
#if defined(WIN32NATIVE)
2
/* Open Raw Binary format in binary mode on Windows.*/
3
if(format==FMT_RBIN)
4
{
5
if(fio.op==FIO_READ)
6
{
7
fio.mode="rb";
8
}
9
if(fio.op==FIO_WRITE)
10
{
11
fio.mode="wb";
12
}
13
}
14
#endif
fio.mode ist, was danach ans fopen() weitergegeben wird als zweiter
Parameter.
Kannst du ggf. mal statt
avrdude ... -U avr.bin
schreiben
avrdude ... -U flash:w:avr.bin:b
Nicht, dass es da noch ein Problem mit der automatischen Erkennung
einer binären Datei gibt.
Andererseits, wie MWS schon schrieb, wäre es dann wiederum verwunder-
lich, warum nur ein Teil der CR-LF-Sequenzen davon betroffen sein
sollte.
Ich habe nichts per ftp transferiert.
Ein binary geht nicht mit dem stk500 zu flashen soweit mir bekannt ist.
Ich habe jetzt das ganze Paket als Zip angehangen.
Eventuell kann ja jemand etwas erkennen.
Gerry
Gerry L. schrieb:> Eventuell kann ja jemand etwas erkennen.
Am Code selbst ist nix zu erkennen.
Das PNG zeigt den Progmem Teil aus main.c zu:
> usart_write("Get PONG: %i.%i.%i.%i\r\n"> usart_write("ERROR\r\n\r\n");
In der bin-Datei steht's richtig drin, nur im ausgelesenen binary.hex
nicht mehr.
Da das binary.hex älter als avr.bin/hex ist: sind diese alle vom
unveränderten Projekt ?
Es stellt sich so dar:
Im Quellcode ist \r\n drin
Im bin, hex und elf ist CR/LF drin
AVR-Studio unterschlägt nicht gezielt CR's beim auslesen
Der ATM644 wird keine CR's entfernen
Wenn man davon ausgeht dass es immer das gleiche Projekt ist, bliebe nur
ein fehlerhaftes Programmieren, also avrdude, wurde aber auch schon
ausgeschlossen.
Gerry L. schrieb:> Ich habe ursprünglich den ethersex Bootloader verwendet
Jetzt wär's interessant, ob beim per Bootlader geflashten Code das
gleiche CR-Verschwinden auftritt.