Forum: Compiler & IDEs Array grösse <> eeprom Atmega644


von frischling (Gast)


Lesenswert?

Der Atmega644 hat ein 2KB großes EEPROM.

Wenn ich folgende Definition kompilieren will bekomme ich keine 
Fehlermeldung.


uint16_t  eprom[4095]  EEMEM =  {0};

Kann ja irgendwie nicht in das EPROM passen 2 Byte mal 4096 gleich 8192 
KBytes.

Erst wenn ich über 16383 komme bekomme ich die Fehlermelung "size of 
array 'eprom' is too large".

Was passiert den wenn ich eprom[4000] adressiere ?

Sollte man sowas nicht in der AVR-LIBC abfangen?
Im Prinzip ist dem Preprozessor bekannt wie gross die EPROMS der Atmegas 
sind !?

Folgendes müsste doch funktionieren :

uint16_t  eprom[1023]  EEMEM =  {0};

von Dirk B. (sharandac)


Lesenswert?

Dem Kompiler ist es egal welche größe du dort angeben tust :-), der weis 
iegentlich nix vom EEprom und deren größe. Und die Fehlermelung das du 
keine Werte größer 16383 angeben kannst ist auch richtig. Denn AVR-GCC 
kann keine Arrays größer 32Kb verwalten da er mit einen signed int16 
verwaltet wird der nur von -16383 bis +16384 als Wertbereich hat, und da 
du uint16 angeben hast macht 2 x 16383 halt ca 32Kbyte an Speicher.

CA Dirk

von frischling (Gast)


Lesenswert?

Hmmm, danke !

Naja, eprom.h lädt ja noch 644-spezifische header-files.
Dort könnte man eine entsprechende Warnug ausgeben ?!

Egal....


Wenn mein Array nun Speicher adressiert der garnicht vorhanden ist,
was bekomme ich da für einen Wert zurückgeliefert ?

von Oliver (Gast)


Lesenswert?

42

Oliver

von Peter D. (peda)


Lesenswert?

frischling wrote:

> Was passiert den wenn ich eprom[4000] adressiere ?

Die oberen Bits werden einfach abgeschnitten. Nach dem letzen Byte 
greifst Du also wieder auf Byte0 zu.


Generell sollte man auf den EEPROM möglichst wenig zugreifen. Das Lesen 
dauert länger und das Schreiben dauert viel viel länger als im SRAM.

Ich habe gute Erfahrungen damit gemacht, daß ich die Daten immer im SRAM 
ablege.
Beim Einschalten wird ein Datensatz vom EEPROM in den SRAM kopiert und 
dann damit gearbeitet bzw. geändert.
Und erst, wenn man z.B. durch Tastendruck bestätigt, daß die neuen Daten 
gespeichert werden sollen, wird vom SRAM zurück in den EEPROM 
geschrieben.

Es gibt aber auch Anwendungen wo mehrere Bytes schreiben mit vielen ms 
Zeitverbrauch zuviel Verzögerung ist. Dann erfolgt das Rückschreiben in 
den EEPROM im Hintergrund im Timerinterrupt.

Insbesondere wenn man im EEPROM mehrere Datensätze ablegt, ist das 
Bearbeiten des gerade aktiven Datensatzes im SRAM sehr effektiv.


Peter

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.