Intel Hex-File Adressierung bei über 64KByte

Gast #3283732
Lesenswert?

Hi Leute, ich bräuchte nochmal euren Rat :)

Ich habe vor einiger Zeit einen Bootloader geschrieben(Bootloader und 
passendes PC Programm), welcher sich an dem Beispiel aus dem Artikel 
"AVR Bootloader in C - eine einfache Anleitung" 
(http://www.mikrocontroller.net/articles/AVR_Bootloader_in_C_-_eine_einfache_Anleitung) 
orientiert hat.
Außerdem hab ich mit dem Artikel von RN-Wissen über das Intel-Hex-File 
(http://www.rn-wissen.de/index.php/HEX-Datei) gearbeitet. Der Bootloader 
läuft auch ohne Probleme, alles wie gewünscht.

Nun will ich aber auch größere uC-Progromme, die größer als 64Kbyte 
sind, mit dem Bootloader flashen. Da aber ja die Standart-Adressierung 
im Hex-File nur 16 Bit groß ist, wird auf eine andere Form der 
Adressierung zurück gegriffen. Im Artikel von RN-Wissen wird dies zwar 
ein wenig erleutert, jedoch tappe ich noch im Dunklen.

Könnte mir jemand eine Taschenlampe reichen? :)
Gast #3284026
Lesenswert?

Hauke schrieb:
> Im Artikel von RN-Wissen wird dies zwar
> ein wenig erleutert, jedoch tappe ich noch im Dunklen.

Es bleibt ja auch die Frage, ob linear oder segmentiert adressiert wird. 
Da musst du dich nach der Quelle deiner HEX-Files richten, an besten 
erzeugst du eines mit mit als 64 kByte und schaust es mit dem Editor an, 
dann siehst du schon, was du noch einbauen musst.

Gruss Reinhard
#3284127
Lesenswert?

Reinhard Kern schrieb:
> Da musst du dich nach der Quelle deiner HEX-Files richten, an besten
> erzeugst du eines mit mit als 64 kByte und schaust es mit dem Editor an,
> dann siehst du schon, was du noch einbauen musst.

Erstmal danke für die schnellen Antworten!

Ich werd Mittwoch auf der Arbeit (wo wir nicht das Studio benutzen) mal 
gucken, was für ein Hex-File erzeugt wird. Und dann melde ich mich 
spätestens nochmal wenn ich die Software für den uC anpasse, denn von 
Speicheradressierung hab ich noch zu wenig Anhung.

LG
Gast #3284523
Lesenswert?

Hauke schrieb:

> Da aber ja die Standart-Adressierung
> im Hex-File nur 16 Bit groß ist

Ist sie nicht. Hex bietet sogar zwei Möglichkeiten, die 64k-Grenze zu 
überhüpfen. Nicht ganz zufällig analog zu diverser Hardware bekannter 
CPU-Hersteller übrigens...

Egal, ob die "segment offset"-Variante oder die "linear offset"-Variante 
verwendet wird, bei beiden ist die Sache im Prinzip gleich: es ist ein 
spezieller Record in das Hexfile zu schreiben, der die Basisadresse 
angibt, die zu der 16-bit-Addressierung der folgenden Datenzeilen zu 
addieren ist. Nur die Codierung dieser Basisadresse ist leicht 
unterschiedlich und natürlich der Record-Typ. Der Hex-Interpreter muß ja 
wissen, wie er den Scheiß zu interpretieren hat.

Das Blöde an der Sache ist: längst nicht jeder Hex-Interpreter kann 
überhaupt mit solche Offsets umgehen. Und noch viel weniger beherrschen 
beide Varianten zu seiner Angabe tatsächlich vollständig korrekt.
Das liegt ganz offensichtlich an der krassen Inkompetenz vieler 
C-Programmierer, die scheinbar niemals an die Grenzen von "int" denken 
und denen auch keine hilfreiche runtime-Umgebung diese fehlenden 
Gedankengänge wenigstens in Form einer satten "integer 
overflow"-Exception gelegentlich in's Gehirn zurücknagelt...

Deine erste Aufgabe wird also sein, die diesbezüglichen Fähigkeiten des 
Systems abzuklopfen, an das du letztlich die Hexfiles verfüttern willst.
Gast #3284528
Lesenswert?

>Das liegt ganz offensichtlich an der krassen Inkompetenz vieler
>C-Programmierer, die scheinbar niemals an die Grenzen von "int" denken
>und denen auch keine hilfreiche runtime-Umgebung diese fehlenden

Ich würde bei Intel-Hex tatsächlich nicht über "int" nachdenken.
Die Offsets sind unsigned. Aber das scheint dir bei deinem
Hassgelaber vollständig entgangen zu sein.

Wenn man keine Ahnung hat, einfach mal die Fresse halten.
#3317742
Lesenswert?

Hi Leute,
ich bastel wieder ein bisschen an meinem Bootloader und versuche ihn zu 
optimieren.
Mit der Speicher Adressierung bei über 64KB uC's muss ich nochmal 
gucken, wie genau ich das mache.

Nun habe ich aber eine andere Frage:
Mir ist grad eingefallen, dass es doch eigentlich egal ist wie viel RAM 
mein Bootloader benötigt oder? Das eigentliche Bootloaderprogramm wird 
ja in den Flash des µC gespeichert. Den benötigten Platz im Flash muss 
ich ja wissen, um die Fusebits richtig setzen zu können. Aber wenn dann 
mein Bootloader gestartet wird, werden ja die Variablen erzeugt und im 
RAM gespeichert. Wenn ich später den Bootloader wieder lasse und in mein 
Hauptprogramm springe, müsste das Hauptprogramm doch den RAM mit seinen 
eigenen Variablen überschreiben. Oder?
Somit müsste es doch vollkommen egal sein, wie viel RAM ich in meinem 
Bootloader belege, was die Programmierung erheblich einfacher machen 
würde.

Irre ich mich?

LG Hauke
#3317857
Lesenswert?

Peter Dannegger schrieb:
> Der Bootloader sollte immer ein eigenständiges Programm sein.
> Startet er die Applikation, initialisiert diese den RAM komplett neu.
>
> Bootloader und Applikation zu vermischen, gibt nur Ärger.

Es wird aber nur der RAM initilisiert. Die benutzten Register wie UART 
und vor allen Dingen Interrupts müssen vom Bootloader zurück gesetzt 
werden.

mfg.
(Firma: fritzler-avr.de) #3317899
Lesenswert?

Und man sollte den Watchdog zu beginn des Bootloaders abschalten oder 
imemr resetten.
Sonst kommt man iwann auf die Idee die WDEN Fuse zu setzen oder in der 
Hauptsoftware den Bootloader per Watchdog aufzurufen zbd dann steckste 
inenr Endlosschleife fest.

WDT Abschalten im Bootloader (einfach unter die includes pasten):
#include <avr/wdt.h>

void wdt_init(void) __attribute__((naked)) 
__attribute__((section(".init1")));

void wdt_init(void)
{
    MCUCR = 0;
    wdt_disable();

    return;
}

Die Interrupts musste ersmal in den Bootloader biegen und dann 
zurückbiegen.

Hinbiegen:
GICR = (1 << IVCE);  /* enable change of interrupt vectors */
GICR = (1 << IVSEL); /* move interrupts to boot flash section */

Zurückbiegen:
GICR = (1 << IVCE);     /* enable change of interrupt vectors */
GICR &= ~(1 << IVSEL);    /* move interrupts to application flash 
section *

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren