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