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?
@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?
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
> 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
> 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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.