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