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