ESP32 a EEPROM

Pavel Brychta pavel.brychta na duhasys.eu
Úterý Srpen 20 10:13:08 CEST 2019


DD,

ok, vyzkoušejte a dejte vědět. ESPException decoder se v PIu bohužel 
používá pěkně mizerně a hlavně ručně, protože podpora ještě není. Pro 
Atom neporadím, protože používám VSC, takže Vás můžu jen nasměrovat na 
https://community.platformio.org/t/backtrace-decoder-for-esp32/2626/2 
Možná budete moct použít VSC postupy odsud 
https://gist.github.com/stritti/b5f409963139af11676a5b39614aa36d , nebo 
https://github.com/platformio/platform-espressif8266/issues/31 a 
sledovat diskuze.

Pavel

Dne 20.8.2019 v 10:06 Petr Zapadlo napsal(a):
> Zdravím,
>
> to nebyl celý kod, handleSubmit() je samozřejmě podstatně 
> komplikovanější, chtěl jsem jen ilustrovat, jak se lze dostat k volání 
> zápisu do eeprom.  Pokud je zakomentován EEPROM.put(), tak vše 
> funguje. Tady problém nečekám.
>
> Večer vyzkouším vaše rady a taky zkusím jít na Espressif 1.8.0. Uvidím 
> jestli bude nějaký rozdíl.
>
> Ještě poprosím o nějaké informace jak zapnout Exception decoder, o tom 
> slyším poprvé.
>
> Díky
>
> Petr
>
>
>
> Dne 20.8.2019 v 09:34 Pavel Brychta napsal(a):
>> 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
>> _______________________________________________
>> 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