EEPROM: Ende des statisch reservierten Bereichs ermitteln?

#3012331
Lesenswert?

Hi
Ich möchte im EEPROM nicht nur Daten mit statischer Größe, sondern 
zusätzlich auch eine Datenstruktur speichern, deren Größe erst zur 
Laufzeit bekannt wird. Damit die dynamische Datenstruktur nichts 
überschreibt, darf sie natürlich erst hinter dem reservierten Bereich 
abgelegt werden.
Ich finde jedoch keine Möglichkeit das Ende des reservierten Bereichs 
(EEMEM) zu ermitteln.

Zur Zeit behelfe ich mir damit in einem struct alle EEPROM Daten fixer 
Größe zusammenzufassen. So kann ich mittels sizeof die Größe berechnen 
lassen und als Offset verwenden. Dieser Ansatz ist jedoch eigentlich 
Schrott, da dadurch die Modularität der Software im Eimer ist.

Wie löst Ihr sowas?
#3012357
Lesenswert?

Hi,

das ist ein guter Punkt den du da ansprichst.
Auch ich organisier mein EEPROM als große Datenstruktur. Über Makros 
kann man sich recht bequem die Adressen der einzelnen Member liefern 
lassen.

Natürlich muss dazu jedes Modul diese Datenstruktur kennen.
Dadurch könnte ein Modul theoretisch auch auf Member zugreifen, die sie 
nichts angehen. Das ist ein Problem, ja.
Allerdings ist das bei EEPROM eh so ne Sache. Theoretisch kannst du ja 
direkt auf jede Adresse zugreifen.

Aber die Modularität geht eigentlich nicht verloren. Ändert sich die 
Zusammensetzung oder Aufbau der Struktur liefert das Makro eben ne 
andere Adresse, das stört ja das Modul nicht (einen Mechanismus zur 
Erkennung von ungültigen Werten, z.B. durch Checksumme, vorausgesetzt).

Ganz im Gegenteil, ohne diese Struktur geht dir Modularität verloren.
Dann müsstest du doch in jedem Modul entscheiden, an welche Stelle des 
EEPROM du nichtflüchtige Daten legst.
Ändert sich dann was an der "Struktur" musst du defines in zig Modulen 
anrühren.

Ich bleib erstmal bei diesem Konzept. Immer noch besser als per Hand 
irgendwo Adressen zu hinterlegen...
#3012365
Lesenswert?

Jetzt hätt ich doch fast deine eigentliche Frage außen vor gelassen.

Solange nur ein Modul einen veränderlichen Speicherbereich braucht ist 
dein Ansatz ganz gut.

Wollen mehrere Module "dynamsich allokieren" müsstest du vorher evtl. 
abschätzen, wieviel Speicher jedes Modul maximal braucht.
Wenn du zB denkst der Datensatz wird nie größer als 100 Byte dann packst 
du eben ein 100-Byte Array mit in deine Struktur.

Ob es da elegantere Lösungen gibt, kA, mir fällt nichts ein.
Moderator Persönliche Seite #3012414
Lesenswert?

Thomas M. schrieb:
> Ich finde jedoch keine Möglichkeit das Ende des reservierten Bereichs
> (EEMEM) zu ermitteln.

Der Linker legt (über den Linkerscript) ein entsprechendes Symbol
an (__eeprom_end).  Damit du das in C benutzen kannst, musst du
es aber deklarieren.
1
extern void * __eeprom_end;
2

3
int eemem[] __attribute__((section(".eeprom"))) = { 42, 24 };
4

5
int
6
main(void)
7
{
8
  return (int) &__eeprom_end;
9
}

main() würde hier den Wert 4 zurückgeben.
#3012421
Lesenswert?

le x. schrieb:
> Ganz im Gegenteil, ohne diese Struktur geht dir Modularität verloren.
> Dann müsstest du doch in jedem Modul entscheiden, an welche Stelle des
> EEPROM du nichtflüchtige Daten legst.
> Ändert sich dann was an der "Struktur" musst du defines in zig Modulen
> anrühren.

Nein, er kann auch problemlos in mehreren Modulen EEMEM Variablen 
definieren. Der Compiler (genauer Linker) kümmert sich dann um die 
Adressvergabe. Nachteil ist dann nur, dass sich diese Adressen ändern 
können. Die EEPROM-Daten als "Block" (z.B. Inhalt einer 
EEPROM-Hex-Datei) sind dann also nicht zwischen verschiedenen 
Software-Versionen austauschbar.

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