ESP32 a EEPROM

Pavel Brychta pavel.brychta na duhasys.eu
Úterý Srpen 20 09:34:52 CEST 2019


Dobrý den,

no verze Atomu je asi nezajímavá - spíš šlo o verzi PIO, ale to nevadí. 
ESP32 Core používám 1.8.0, což by neměl být tak velký rozdíl (bohužel 
verze v PIO nekorespodují s oficiálními verzemi espressif Core, což je 
dost opruz). Pro PIO a ladění zadejte do platformio.ini

build_flags =
   ;-fexceptions
   -D CORE_DEBUG_LEVEL=5
   -D DEBUG_ESP_PORT=Serial
(doufám, že mám debug_level správně - takhle to používám já...).

Ten handlesubmit IMO není také dobře - nikde nevidím odeslání (aspoň 
nějaké) odpovědi. Nespadne spíš následně webový server? Exception 
decoder nenapoví víc?

Pavel

Dne 20.8.2019 v 9:11 Petr Zapadlo napsal(a):
> Dobrý den,
>
> používám Atom/PlatformIO, Atom je 1.40, Espressif 32 verze 1.9.0.
>
> Soubor .csv jsem v kompilační struktuře nenašel. Zapnout ladící výpisy 
> asi mohu, jen momentálně nevím jak, tak do hloubky jsem se ještě 
> neponořil (pokud teda nemyslíte ladící výpis typu Serial.print()).
>
> Funkci, kde se zapisuje do EEPROM, volám z obsluhy web serveru:
>
> WebServer server(80);
>
> setup() {
>
>     server.on("/", handleRoot);
>   server.on("/wlon", handleWlon);
>   server.on("/wloff", handleWloff);
>   server.onNotFound(handleNotFound);
>   server.begin();
>
> }
>
> void handleRoot() {
>       if (server.hasArg("wjas")) {
>     handleSubmit();
>     }
> }
>
> void handleSubmit() {
> write_to_eeprom((uint32_t)w_jas, 0);
> }
>
> Petr
> Dne 20.8.2019 v 06:23 Pavel Brychta napsal(a):
>> 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
>> _______________________________________________
>> 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