ESP32 a EEPROM

Petr Zapadlo zapik na email.cz
Úterý Srpen 20 10:06:16 CEST 2019


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



Další informace o konferenci Hw-list