Forum: Compiler & IDEs EEprom Verständnisfrage


von Bernhard G. (Gast)


Lesenswert?

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?

von Rene H. (Gast)


Lesenswert?

@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?

von Michael U. (amiga)


Lesenswert?

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

von Randy (Gast)


Lesenswert?

> 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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> 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.

von Bernhard G. (Gast)


Lesenswert?

Ok Danke euch!

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.