Forum: Mikrocontroller und Digitale Elektronik Adressierung bei EEPROMS in C


von Josef Zimmermann (Gast)


Lesenswert?

Hallo

ich habe da ein kleines Problem. Zur Berechnung der Adressen von
Tabellen im EEPROM würde ich gerne die Tabellengrösse verwenden, ohne
bei möglichen Änderungen jedesmal die Adressen per Hand berechnen zu
müssen. Eine Prüfung der Bereichsgrenze (EE_ADR_END) sollte schon beim
compilieren erfolgen und nicht erst zu Laufzeit.


Beispiel:

#define ENTRIES_TAB1 100
#define ENTRIES_TAB2 130
#define EE_ADR_END   0x0FFF

typedef {
  uint32 a;
  int16  b;
} tab1_t;

typedef {
  uint8 a;
  int16  b;
} tab2_t;

tab1_t tab1[ ENTRIES_TAB1];
tab2_t tab2[ ENTRIES_TAB2];

#define EE_ADR_TAB1 0
#define EE_ADR_TAB2 ( EE_ADR_TAB1 + sizeof( tab1));

#if ( ( EE_ADR_TAB2 + sizeof( tab2)) > EE_ADR_END)
#error("Tabelsize overflow")
#endif


Weil aber sizeof nicht vom Präprozessor aufgelöst werden kann,
funktioniert das Ganze nicht. Hat jemand eine Idee?

von OldBug (Gast)


Angehängte Dateien:

Lesenswert?

Auf die Schnelle wüsste ich da nur eine Lösung, siehe Anhang.
Getestet mit gcc auf Win-XP, CHECK_OVF auf 1 setzen, damit der
Präprozessor schon beim Kompilieren einen Fehler bei Überlauf
Produziert. Bleibt CHECK_OVF auf 0, kann man zur Laufzeit Testen.

Was anderes fällt mir im Moment nicht ein... :\

von Josef Zimmermann (Gast)


Lesenswert?

> Was anderes fällt mir im Moment nicht ein... :\
Geht mir im Moment genauso.

Vermutlich kann ich das so machen, weil sich die Strukturen der
Tabellen wahrscheinlich nicht mehr ändern werden. Zumindest kann ich
damit eine Änderung der Tabellengrößen automatisch übernehmen und einen
range check durchführen.

Dein Vorschlag ist auf jedenfall deutlich besser als mein Ansatz.
Vielen Dank.

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.