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