ESP32 a EEPROM

Petr Zapadlo zapik na email.cz
Úterý Srpen 20 08:57:39 CEST 2019


Zdravím,

v tomhle zrovna problém není  - tato část kodu funguje dobře. Tohle byl 
jen testovací kus, kterým jsem ověřoval zápis a čtení a to funguje.  
Když je to na začátku setup(), tak to proběhne OK. Když stejný kus 
umístím do místa, kde potřebuji zapsat svou hodnotu, tak proběhnou třeba 
3 cykly a zhavaruje to, nebo to lehne hned v prvním a nebo to taky 
proběhne úplně bez problémů. Čím to je netuším, pocitově je to "nějak" 
odvislé od hodnoty zapisované do eeprom, ale může to být taky náhoda.

Petr

Dne 20.8.2019 v 08:49 Dodo Racek napsal(a):
> Iba strely od boku:
>
> "i" je deklarovany uint8_t
> "integer" (asi by som zvolil iny nazov premennej - niektory prekladac 
> to moze chapat ...povedzme po svojom... ) je deklarovany uint32_t
>
> v riadku     "write_to_eeprom(800+i, i); " musi dojst k pretypovaniu 
> premennych pred suctom ( 800 sa do uint8_t nezmesti, alebo bude pisat 
> niekam, kde nema... )
>
> Ak by prekladac pretypoval 'i" na uint32_t (alebo na int ?, alebo na 
> nieco ine? -> Aky mate prekladac? co by mal, kedze "by mal" dorovnat 
> premmenne na vyssi typ pred mat. operaciami - spoliehate sa na to), 
> tak by ste nasledne davali vo funkcii adresu nie ako uint8_t ale ako 
> uint32_t.
> Niektore vyvojove prostredia "arduino like" maju s automatickym 
> pretypovavanim zvlastne spravanie, alebo ho jednoducho (niekedy - 
> nevysledoval som do konca ) neurobia...
>
> ->  skuste urobit sucet mimo funkcie a pretypovat rucne premenne pred 
> suctom a funkcii posunut typ, ktory ocakava - resp. ustrazit si typy 
> hlavne pri premennej adresy, ale idealne vsade...
>
> v povodnej vasej rutine so zapisovanim po bytoch ste napr. mali rucne 
> pretypovanie premennej integer pred volanim write:
>
> >>     EEPROM.write((adresa+i), (uint8_t) integer);
>
>
>
> Dodo
>
>
>
> po 19. 8. 2019 o 22:19 Petr Zapadlo <zapik na email.cz 
> <mailto:zapik na email.cz>> napísal(a):
>
>     Zdravím,
>
>     chápu, nějak mi unikla existence metod put() a get(), možná v
>     době, kdy
>     jsem začal  tohle používat tak ještě nebyly. Nicméně, upravil jsem
>     zápis
>     následovně:
>
>     void write_to_eeprom(uint32_t integer, uint8_t adresa){
>          EEPROM.put(adresa, integer);
>          EEPROM.commit();
>     }
>
>     Tohle by mělo být celkem košer. Ostatně zapisuji jen jeden
>     uint32_t a to
>     ještě příležitostně, takže "ošoupání" buněk nehrozí.
>
>     Ale , jsem tam kde jsem byl. Narazil jsem ještě na jednu
>     zajímavost, na
>     začátek programu - sekce setup(). jsem si přidal následující
>     testovací kod:
>
>     EEPROM.begin(64);
>     for (uint8_t i=0; i < 60; i=i+4){
>          Serial.print("Adresa: ");
>          Serial.print(i);
>          Serial.print(" Data: ");
>          Serial.println(800+i);
>          write_to_eeprom(800+i, i);
>     }
>     for (uint8_t i=0; i < 60; i=i+4){
>        Serial.print("Adresa: ");
>        Serial.print(i);
>        Serial.print(" Data: ");
>        Serial.println(read_from_eeprom(i));
>     }
>
>     A tenhle kod, projde vždy a sedí zapsané a vyčtené hodnoty.
>
>     Nicméně pozdější zavolání  funkce write_to_eeprom() už nedopadne
>     dostanu
>     "kernel panic". A je to opravdu zápisem do eeprom, když ho
>     zakomentuji,
>     tak to funguje dobře (jen se neuloží hodnota do eeprom).
>
>     Jak tohle vykoumat?
>
>     Díky
>     petr
>
>
>
>
>     Dne 19.8.2019 v 06:19 Pavel Brychta napsal(a):
>     > Dobrý den,
>     >
>     > ten zápis není zcela optimální z hlediska toho, co vlastně
>     simulovaná
>     > EEPROM v ESP8266 je, takže to vezmu trošičku obšírněji:
>     >
>     > U ESP8266 je EEPROM simulovaná sektorem ve flash paměti, takže
>     trpí na
>     > wear leveling. Commit by se tedy měl používat pokud možno co
>     nejméně,
>     > respektive po zápisu co největších dat. Volání commit po zápisu
>     > každého bytu znamená 4 přepisy sektoru. U ESP32 v posledních
>     verzích
>     > jádra přešla emulace EEPROM na používání NVS, ale obávám se, že
>     > přístup k používání commit zůstal stejný. Další věcí pak je namísto
>     > bytového přístupu použít templatovaných metod put() a get(), které
>     > zabezpečí uložení celého prvku. Takže doporučuji:
>     >
>     > 1. překontrolovat, zda voláte .begin() na začátku programu s
>     > dostatečnou velikostí
>     >
>     > 2. použít .put()
>     >
>     > 3. commit() zavolat po uložení
>     >
>     > Hezký den,
>     >
>     > Pavel Brychta
>     >
>     > Dne 18.8.2019 v 22:18 Petr Zapadlo napsal(a):
>     >> Zdravím,
>     >>
>     >> potřebuji v jednom projektu přejít z ESP8266 -> ESP32.  Kod jsem
>     >> lehce upravil (především kvůli trochu jiným knihovnám), přeložil a
>     >> testuju a narazil jsem na nečekaný problém a to s EEPROM.
>     >>
>     >> Mám funkci:
>     >>
>     >> void write_to_eeprom(uint32_t integer, uint8_t adresa){
>     >>   for (uint8_t i=0; i<4;i++){
>     >>     EEPROM.write((adresa+i), (uint8_t) integer);
>     >>     EEPROM.commit();
>     >>     integer= integer >> 8;
>     >>   }
>     >> }
>     >>
>     >> Totožnou rutinu jsem už použil mockrát, hlavně s ESP8266 a ale i s
>     >> jedním ESP32 a nenarazil jsem na problém.  Nyní však když zapisuju
>     >> data do EEPROM tak mi cpu zhavaruje:
>     >>
>     >> Guru Meditation Error: Core  1 panic'ed (Cache disabled but cached
>     >> memory region accessed)
>     >> Guru Meditation Error: Core  1 panic'ed (IllegalInstruction).
>     >> Exception was unhandled.
>     >> Memory dump at 0x401495e8: bad00bad bad00bad bad00bad
>     >> A je do resetu vymalováno.
>     >>
>     >> A navíc je to závislé na datech - pokud je zapisovaná hodnota
>     kolem
>     >> 66000 tak je vše OK, pokud je cca 800, tak zhavaruje.
>     >>
>     >> když si dám vypsat jednotlivé byte co se zapisují, tak je vše OK?
>     >>
>     >> Nějak to mu nerozumím, už do toho tady čumím dost dlouho dobu a
>     >> nemohu se hnout z místa.
>     >>
>     >> Tuší někdo, v čem by mohl být problém?
>     >>
>     >> Díky
>     >>
>     >> Petr
>     >>
>     >> _______________________________________________
>     >> HW-list mailing list  -  sponsored by www.HW.cz <http://www.HW.cz>
>     >> Hw-list na list.hw.cz <mailto:Hw-list na list.hw.cz>
>     >> http://list.hw.cz/mailman/listinfo/hw-list
>     > _______________________________________________
>     > HW-list mailing list  -  sponsored by www.HW.cz <http://www.HW.cz>
>     > Hw-list na list.hw.cz <mailto:Hw-list na list.hw.cz>
>     > http://list.hw.cz/mailman/listinfo/hw-list
>
>     _______________________________________________
>     HW-list mailing list  -  sponsored by www.HW.cz <http://www.HW.cz>
>     Hw-list na list.hw.cz <mailto:Hw-list na list.hw.cz>
>     http://list.hw.cz/mailman/listinfo/hw-list
>
>
>
> _______________________________________________
> HW-list mailing list  -  sponsored by www.HW.cz
> Hw-list na list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list

------------- další část ---------------
HTML příloha byla odstraněna...
URL: <http://list.hw.cz/pipermail/hw-list/attachments/20190820/f863f932/attachment.html>


Další informace o konferenci Hw-list