www.mikrocontroller.net

Forum: Compiler & IDEs EEprom Verständnisfrage


Autor: Bernhard G. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

unter ->

http://www.mikrocontroller.net/articles/AVR-GCC-Tu...

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?

Autor: Rene H. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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-Tu...
File: "http://www.mikrocontroller.net/articles/AVR-GCC-Tu...
File type: "text/html"

Weshalb?

Autor: Michael U. (amiga)
Datum:

Bewertung
0 lesenswert
nicht 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-Tu...
> File: "http://www.mikrocontroller.net/articles/AVR-GCC-Tu...
> File type: "text/html"
>
> Weshalb?

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

Gruß aus Berlin
Michael

Autor: Randy (Gast)
Datum:

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

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

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

Autor: Bernhard G. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok Danke euch!

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.