ESP32 a EEPROM

Dodo Racek dodoracek na gmail.com
Úterý Srpen 20 08:49:30 CEST 2019


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> 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
> >> 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
>
> _______________________________________________
> 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/fe334823/attachment.html>


Další informace o konferenci Hw-list