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