mikrocontroller.net

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


Autor: frischling (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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};

Autor: Dirk Broßwick (sharandac)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: frischling (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ?

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
42

Oliver

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.