ESP32 a EEPROM

Petr Zapadlo zapik na email.cz
Pondělí Srpen 19 22:18:45 CEST 2019


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



Další informace o konferenci Hw-list