ESP32 a EEPROM

Pavel Brychta pavel.brychta na duhasys.eu
Úterý Srpen 20 06:23:59 CEST 2019


Dobrý den,

přiznám se, že mi dochází nápady - s tímhle jsem se nesetkal a 
nepředpokládám, že máte v .begin malou velikost (i kdyby ano, tak ten 
objekt si hlídá přístup out of bounds). Můžete sem poslat obsah 
partition tabulky (soubor .csv)? Respektive ještě jinak - jaké prostředí 
a jakou verzi Core používáte? Můžete ve Vaší aplikaci zapnout ladící 
výpisy? Objekt EEPROM při commit (snad) něco vypisuje. Další nápad - 
nevoláte to v ISR? Neukáže Exception decoder na něco, co by mohlo 
způsobit tohle chování?

Pavel

Dne 19.8.2019 v 22:18 Petr Zapadlo napsal(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ší informace o konferenci Hw-list