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