PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : AVR: Datenaustausch Bootloader <=> Programm



Jaecko
14.12.2009, 13:37
Moin.

Welche (brauchbaren) Möglichkeiten gibt es, um zwischen dem Programm und dem Bootloader eines AVR (ATmega8/16/32 etc.) Daten auszutauschen? Es geht hierbei um einzelne Bytes, keine ganzen Datensätze oder "Strings".

Die derzeitige Lösung ist eine Section im RAM, die beim Start beider einfach nicht mit 0 initialisiert wird; d.h. ein Teil schreibt einen Wert hier rein, der andere Teil liest ihn einfach aus.

Nachteil dieser Section ist, dass die dann in der zu flashenden .hex auftaucht und die üblichen ISP-Programmer natürlich keine Möglichkeit haben, Daten ins RAM zu flashen; d.h. die .hex muss vor dem Flashen erst manuell von dieser Section befreit werden.

Gibts da noch was "eleganteres", ein Byte hier hin und her zu schicken?
Bzw. gibt es eine Möglichkeit, dass in der .hex-Datei auch wirklich nur der Flash-Bereich steht und nichts aus den RAM-Sections?

mfG

askazo
14.12.2009, 14:29
Die einfachste Möglichkeit für einen Datenaustausch wäre das EEPROM.
Die Daten sind dann völlig unabhängig vom Flash und bleiben auch nach einem Reset bzw. Power-Down noch erhalten.

Gruß,
askazo

Jaecko
15.12.2009, 09:22
Hm... EEPROM wär zwar ne Möglichkeit.
Kleines Problem: Der EEPROM sollte eigentlich dem Programm voll zur Verfügung stehen.
Grösseres Problem: Die Anzahl der Datenübertragungen ist damit auf die Lebensdauer des EEPROMS begrenzt.

askazo
15.12.2009, 11:02
Zum "kleinen" Problem:
Da Du nur einige Bytes brauchst, sollte das eigentlich kein Problem sein. Ich würde eher sagen, das RAM sollte dem Programm voll zur Verfügung stehen.

Zum "großen" Problem:
Das EEPROM macht 100.000 Schreibzyklen mit. Selbst, wenn Du pro Tag 10 mal den Bootloader aufrufst, würde das EEPROM fast 28 Jahre leben, bevor Du den Controller austauschen müsstest.... reicht das nicht?

Gruß,
askazo

TomEdl
15.12.2009, 16:04
Zum "großen" Problem:
Das EEPROM macht 100.000 Schreibzyklen mit. Selbst, wenn Du pro Tag 10 mal den Bootloader aufrufst, würde das EEPROM fast 28 Jahre leben, bevor Du den Controller austauschen müsstest.... reicht das nicht?

Wovon die 100000 aber nur eine "Mindestgrenze" sind, meistens halten EEPROMs wesentlich mehr Zyklen aus.

Grüße
Thomas

Jaecko
15.12.2009, 16:46
So... gerade nochmal nachgefragt: Die Verwendung des EEPROM scheidet aus, da alle 512 Bytes (Mega8) von der Software verwendet werden und von "ausserhalb" nicht verändert werden dürfen.

Also bleibt wohl nur die nicht-initialisierende RAM-Section.

Furtion
15.12.2009, 17:25
Hi,

wie wäre es dann mit einem größeren Chip mit 1kB++ Eeprom?

askazo
16.12.2009, 12:24
Wieviele Bytes müssen denn zwischen Programm und Bootloader ausgetauscht werden? Wenn's nur max. 8 Bytes sind und der Timer1 in der Phase nicht benötigt wird, könntest Du die Timer-Register (TCNT1,OCR1A,OCR1B,ICR1) für den Datenaustausch missbrauchen. Evtl. gehen auch noch andere Register, die vom Programm nicht verwendet werden.

Gruß,
askazo

sternst
16.12.2009, 12:44
Wieviele Bytes müssen denn zwischen Programm und Bootloader ausgetauscht werden? Wenn's nur max. 8 Bytes sind und der Timer1 in der Phase nicht benötigt wird, könntest Du die Timer-Register (TCNT1,OCR1A,OCR1B,ICR1) für den Datenaustausch missbrauchen. Evtl. gehen auch noch andere Register, die vom Programm nicht verwendet werden.Kommt ganz darauf an, wie der Wechsel von Application zu Bootloader (und umgekehrt) erfolgt. Normalerweise wird ja mindestens für eines von beiden (in der Regel App->Bootloader) der Watchdog-Reset verwendet, und dann ist's Essig mit deinem Vorschlag.

Jaecko
16.12.2009, 13:37
Hei, die Idee ist schon mal nicht schlecht.
Also der Wechsel vom Bootloader in die App. läuft über nen Jump nach 0x0000. Das müsste das Timer-Register ja überleben.

Der Timer wird zwar für das Timeout-Handling gebraucht, aber vor dem Jump deaktiviert, da die App. einen deaktivierten Timer erwartet.