ESP32 a EEPROM

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


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



Další informace o konferenci Hw-list