EEprom Verständnisfrage

Gast #1391676
Hallo,

unter ->

http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#EEPROM-Variable_auf_feste_Adressen_legen

steht, man sollte an der Position 0 nichts in den eeprom schreiben.
Weshalb?

Ich habe bei mir folgendes stehen ->

tEvents event_set[MAX_EVENTS] _attribute_ ((section (".eeprom")));

Die Daten werden in dem Fall aber auch an Position 0 geschrieben.
Und, kann ich mich darauf verlassen daß der Compiler bei 0 anfängt?
Ich habe nämlich in einem anderen Bereich noch Daten manuell eingefügt.


Kann mich da jemand aufklären?
Hallo,

Rene H. schrieb:
> @Moderator
> Wenn ich auf obigen Link klicke erhalte ich eine Viruswarnung:
>
> VIRUS ALERT
> The transferred file contained a virus and was therefore blocked by
> Webwasher!
>
> VirusName: "WW: Heuristic.Exploit.HTML.CodeExec.NKKF"
> Url: "http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial";
> File: "http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial";
> File type: "text/html"
>
> Weshalb?

die Heuristik-Erkennung des Webwashers scheint bei HTML wohl eher eine 
Würfelbude zu sein?

Gruß aus Berlin
Michael
Gast
> steht, man sollte an der Position 0 nichts in den eeprom schreiben.
> Weshalb?

Der hauptsächliche Grund ist der, dass wenn der uC Amok läuft und seine 
Pins unkontrolliert hin und her schaltet und dadurch im EEPROM einen 
Schreibvorgang auslöst die Adresse 0 die wahrscheinlichste ist die 
überschrieben wird, einfach weil es die ist die es erwischt wenn keine 
Adresse übergeben wird. Amok läuft der uC wenn er nicht richtig resettet 
wird, oder zu spät, er also schon los läft, die Resetschaltung aber erst 
später einen ordendlichen Reset auslöst. Oder auch beim Abschalten wenn 
die Spannung zu langsam sinkt und damit zu lange in einem Bereich bleibt 
in dem der uC nur noch "halb" funktioniert.
Evtl. auch ein Grund ist der dass das EEPROM evtl. Mist baut wenn die 
Spannung beim Einschalten zu langsam hoch kommt und der chipinterne 
Power-On Reset damit nicht zurecht kommt. Auch da ist bei einem 
versehentlichen Schreibzyklus die Adresse 0 die wahrscheinlichste die es 
erwischen könnte.


> Die Daten werden in dem Fall aber auch an Position 0 geschrieben.
> Und, kann ich mich darauf verlassen daß der Compiler bei 0 anfängt?
> Ich habe nämlich in einem anderen Bereich noch Daten manuell eingefügt.

Du kannst als erste Variable eine Dummyvariable definieren deren Wert 
unwichtig ist.
Ob du dich drauf verlassen kannst dass die Dummyvariable auf Adresse 
Null kommt? Und dass der Compiler immer bei Null anfängt?
Nein.
Aber er wird es wahrscheinlich so machen. Du kannst es ja im Compilat 
überprüfen ob das so ist. Bei jeder neuen Version des Compilers könnte 
es aber anders sein. D.h. Code der auf solche Eigenschaften aufbaut ist 
nicht wirklich portabel. Aber solange du nicht den Compiler wechselst 
und nach dem compilieren manuell prüfst ob das mit den 
EEPROM-Speicherbereichen so gelaufen ist wie du es braucht kannst du das 
schon so machen.

HTH
Randy
Moderator (Firma: Titel) Persönliche Seite
> man sollte an der Position 0 nichts in den eeprom schreiben.
> Weshalb?
Es war einmal...
... eine AVR-Familie (classic-AVR), bei denen es passieren konnte, dass 
das Abschalten der Versorgungsspannung die Ladungspumpe zum Löschen 
einer EEPROM-Zelle eingeschaltet hat. Damit wäre jetzt also die aktuell 
adressierte EEPROM-Zelle gelöscht worden. Weil aber ein paar ns später 
die Register der internen EEPROM-Adresse auf 0 zurückgefallen sind, 
wurde die vorherige Zelle nur "angelöscht" und den Rest der Löschenergie 
bekam die Adresse 0 ab. Deshalb war meist die EEPROM-Adresse 0 die 
betroffene. Und weil das so ein überraschendes Verhalten war, brannte 
sich in das Gehirn des Entwicklers der Merksatz ein: "Benutze niemals 
die EEPROM-Adresse 0".

Also: das ist ein uralter Hut, der sich mit neuen AVR-Generationen schon 
lange überlebt hat. Brown-Out einschalten und fertig.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.