Forum: Mikrocontroller und Digitale Elektronik ATMEGA EEMEM: zwei Applikationen greifen auf dieselbe Variablen zu?


von Thomas B. (xantiac)


Lesenswert?

Liebe Kollegen,

an einem Messgerät auf Basis von ATMEGA1284 sollen zwei unterschiedliche 
Applikationen laufen. Applikation 1 hat einmalig in EEPROM mehrere 
HW-Parameter gespeichert und kann sie jetzt jedesmal auslesen. (Das 
Speichern ins EEPROM ist jetzt nicht mehr aktiv).
1
//Applikation 1
2
uint8_t    EEMEM HW_ver;
3
eeprom_write_byte(&EEMEM HW_ver, 2);


Diesen abgespeicherten Wert würde ich gerne nach dem Flashen der zweiten 
Applikaton lesen können. Wie macht man es?
1
//Applikation 2
2
uint8_t    EEMEM HW_ver;
3
uint8_t HW_ver_SRAM = eeprom_read_byte(&HW_ver);

Nach dem Flashen der zweiten applikation, lese ich aber eine 0. 
Wahrscheinlich stimmt der Speicherort nicht, obwohl ich die gleiche 
Reihenfolge in der Definition der EEMEM variablen in beiden apps habe.

Wenn ich die Applikation 1 darauf spiele, kann ich die Variable aus 
EEPROM wieder richtig lesen, d.h. EEPROM wird nicht beim Flashen 
gelöscht! (wir kennen ja die Bugs mit EESAVE beim Flashen und im 
Debugger).

Wie geht es denn?

Vielen Dank für alle Tipps!
Karel

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Thomas B. schrieb:
> Wahrscheinlich stimmt der Speicherort nicht, obwohl ich die gleiche
> Reihenfolge in der Definition der EEMEM variablen in beiden apps habe.
Das darf der Compiler trotzdem in beliebiger Reihenfolge ablegen. Wenn 
du eine Speicherzelle direkt ansprechen willst, dann musst du eine fixe 
Adresse festlegen und direkt diese Adresse verwenden.

> an einem Messgerät auf Basis von ATMEGA1284 sollen zwei unterschiedliche
> Applikationen laufen.
Passen die nicht in ein einziges Programm? Es ist unüblich, für einen 
Betriebsartenwechsel den Controller umzuprogrammieren...

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Zunächst muss sichergestellt sein, dass das Flashen den EEPROM nicht 
löscht / leert, und dass App 2 keine Werte in den EEPROM lokatiert.

Doku zu ld:
1
-R filename
2
--just-symbols=filename
3
4
Read symbol names and their addresses from filename, but do not relocate
5
it or include it in the output. This allows your output file to refer
6
symbolically to absolute locations of memory defined in other programs.
7
You may use this option more than once.

D.h. Beim Linken von App 2 linkt man auf diese Weise gegen App 1, um die 
entsprechenden (absoluten) Adressen von App 1 bekannt zu manchen und zu 
verwenden.

Evtl. ist ratsam, zunächst den "EEPROM-Anteil" von App 1 zu extrakieren, 
um unerwünschte Fehler bei doppelt vergebenen Namen zu vermeiden.

von Thomas (kosmos)


Lesenswert?

um 4 kByte du adressieren benötigts du 12 Bits oder eben 2 Bytes, ich 
vermute das du einen Fehler in der Adressierung hast evtl. die Bytes 
vertauscht.

Nichts desto trotz mit dem AVR Studio kannst du das komplette EEPROM 
auslesen und dort solltest du deine Daten finden auch wenn sie aufgrund 
eines Adressierungsfehlers etwas verschoben wurden.

von Thomas B. (xantiac)


Lesenswert?

Liebe Kollegen,

danke für eure Tipps.

Lothar M. schrieb:
>> an einem Messgerät auf Basis von ATMEGA1284 sollen zwei unterschiedliche
>> Applikationen laufen.
> Passen die nicht in ein einziges Programm? Es ist unüblich, für einen
> Betriebsartenwechsel den Controller umzuprogrammieren...

Lothar, es get um eine alte und neue Firmware (was ich nicht erwähnt 
habe) und ich wollte die schon abgelegten Daten weiter verwenden. Und 
der Unterschied zwischen uns beiden ist der, dass Du an fertige Produkte 
denkst und ich arbeite im Bereich Demonstratoren/Prototypenbau, wo man 
tatsächlich für den Betriebsartenwechsel den Controller umprogrammieren 
kann/darf :-)

Johann, danke für die Lösung mit ld! Für mich war schneller die 
Datenstruktur einfach aus dem alten Quellcode zu nehmen und im Programm 
"manuell" initialisieren.

Grüße
Karel

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.