[ESP8266] ACHTUNG! Flash-Speicher Schreibzugriff bei JEDEM Aufruf von u.a Wifi.begin

  • Hi Leute,

    Ha da letztens etwas wichtiges in der inzwischen sehr umfangreichen Dokumentation vom ESP8266 Arduino Core entdeckt:
    Wifi.persistent()

    Demnach ist es normalerweise so dass bei wirklich JEDEM Aufruf von unter anderem WiFi.begin() die übergebenen Parameter erneut in den Flash Speicher geschrieben wird auch wenn sich diese gar nicht ändern.

    Programmiert man jetzt bspw. einen Logger der sich zwischen den Messungen schlafen legt oder komplett abschaltet und dann nach dem Start wie üblich WiFi.begin() aufruft wird mit JEDEM start die WiFi Konfiguration erneut in den Flash Speicher geschrieben was natürlich zu Abnützung und schlussendlich zum Tod einzelner Speicherzellen führt.
    Bei einem Projekt bei dem das nur ein paar mal am Tag passiert ist das sicher vernachlässigbar, wenn das aber beipelsweise jede Minute passiert sieht es auf ein Jahr hochgerechnet gleich ganz anders aus.

    Eine einfach Lösung für dieses Problem ist:
    WiFi.persistent(false)

    Diese WiFi Methode stellt sicher dass die Konfiguration nur erneut in den Flash Speicher geschrieben wird wenn sich diese auch geändert hat.
    Wichtig dabei ist dass Wifi.persistent(false) vor allen anderen WiFi Methoden ausgeführt werden muss.

    Allerdings muss man dabei dann bspw. folgendes beachten: (Mehr infos in den Links)

    Zitat

    Please note that functions WiFi.disconnect or WiFi.softAPdisconnect reset currently used SSID / password. If persistent is set to false, then using these functions will not affect SSID / password stored in flash.


    Hier geht es zwar speziell um den ESP8266 Arduino core vermute aber, da dieses Problem tiefer geht, dass auch bspw. die NodeMCU Firmware, Micropyhton, Basic und was es nicht sonst so alles gibt davon betroffen sind.
    Die Dokumentation vom ESP Arduino core ist aber soweit ich gesehen hab die einzige die darauf eingeht und auch eine Lösung bietet.


    Links:
    WiFi config corrupted after multiple restarts - https://github.com/esp8266/Arduino/issues/1054
    WiFi.persistent() - https://github.com/esp8266/Arduin…s.md#persistent
    Espressif FAQ (Seite 23: Which APIs will write or save data to the flash memory?) - http://espressif.com/sites/default/…ssif_faq_en.pdf
    ESP8266 Reboot Cycled Caused by Flash Memory Corruption — Fixed! - http://rayshobby.net/esp8266-reboot…rruption-fixed/

    DON'T PANIC!

    Einmal editiert, zuletzt von joh.raspi (7. Dezember 2016 um 18:51)

  • [ESP8266] ACHTUNG! Flash-Speicher Schreibzugriff bei JEDEM Aufruf von u.a Wifi.begin? Schau mal ob du hier fündig wirst!


  • Muss ich gleich mal umstellen :)

    Hast du jetzt das WiFi.persistent(false) eingebaut?
    Sofern du keine anderen WiFi Methoden verwendest die Einstellungen im Flash speichern könntest du auch einfach WiFi.begin() rauswerfen beziehungsweise das ganze so umprogrammieren dass WiFi.begin() nur wenn wirklich nötig aufgerufen wird. Also beispielsweise erst nach zehn Sekunden. Der ESP verbindet sich ja auch ohne WiFi.begin() automatisch nach dem start mit dem Wlan Netzwerk sofern er schonmal mit diesem verbunden wurde.

    PS: Hab mir auch gedacht Oha als ich das entdeckt hab. Erklärte aber den mysteriösen Tod einer meiner Temp Logger. :X

    DON'T PANIC!

    Einmal editiert, zuletzt von joh.raspi (8. Dezember 2016 um 01:53)

  • Die Zeile

    Code
    WiFi.persistent(false);

    habe ich jetzt in zwei verschiedenen Sketchen. Einer wird ohne Fehlermeldung übersetzt. Beim anderen gibt es die Meldung


    Zitat

    exit status 1
    'WiFi' does not name a type

    obwohl in beiden ESP8266WiFi.h und somit auch ESP8266WiFiGeneric.h eingebunden wird.
    Ich habe den Verdacht, er in dem fehlerhaften Sketch den boolschen Type nicht kennt. Welche Headerdatei hilft da weiter?
    Merkwürdig ist, das dort auch andere WiFi Methoden benutzt werden, die nicht angemeckert werden.

    Marcus

    PS: Die Hinweise auf ESP Easy und die Suchliste sind sehr gut. Vielen Dank!

    Einmal editiert, zuletzt von MarcusFE (14. Dezember 2016 um 17:53)

  • Seltsam,

    " 'WiFi' does not name a type" bedeutet normal dass die "<ESP8266WiFi.h>" nicht eingebunden ist.

    "true" und "false" werden von der Arduino IDE (bzw. dem Framework) definiert. Kannst ja mal testwesie ein Serial.println(true) und Serial.println(false) ausführen und schauen.

    Eventuell ein Tippfehler?

    DON'T PANIC!

  • Mit Tippfehler hatte ich eigentlich die "<ESP8266WiFi.h>" gemeint.
    Das mit dem Serial.println() war nur für dich damit du siehst dass es an dem nicht liegen kann.
    Er sagt ja dass er 'WiFi' nicht kennt und nicht dass er "false" nicht kennt.

    Zentris
    Hab keine Ahnung. Sieht nach einer Art "Factory Reset" aus die einfach alle Einstellung löscht.
    Automatisch zusammengefügt:
    Teste mal folgendes:

    Das Beispiel macht nichts weiter wie sich mit dem Wlan Netzwerk zu verbinden und funktioniert definitiv.

    DON'T PANIC!

    Einmal editiert, zuletzt von joh.raspi (14. Dezember 2016 um 18:42)


  • Mit Tippfehler hatte ich eigentlich die "<ESP8266WiFi.h>" gemeint.

    Ich auch. Aber ESP8266WiFi ist in den Sketchen gefärbt. Daher schließe ich einen Tippfehler aus.
    Dein Sketch wird fehlerfrei kompiliert, genauso wie mein anderer Sketch.
    Beim Aufruf der persistent-Methode ist in allen drei Sketchen das Wort persistent nicht gefärbt, WiFi schon.

    Das ist das Problemkind:


    Marcus

    Einmal editiert, zuletzt von MarcusFE (14. Dezember 2016 um 19:48)

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!