<div dir="ltr"><div>Iba strely od boku:</div><div><br></div><div>"i" je deklarovany uint8_t</div><div>"integer" (asi by som zvolil iny nazov premennej - niektory prekladac to moze chapat ...povedzme po svojom... ) je deklarovany uint32_t <br></div><div><br></div><div>v riadku
"write_to_eeprom(800+i, i); " musi dojst k pretypovaniu premennych pred suctom ( 800 sa do uint8_t nezmesti, alebo bude pisat niekam, kde nema... )<br></div><div></div><div><br></div><div>Ak by prekladac pretypoval 'i" na uint32_t (alebo na int ?, alebo na nieco ine? -> Aky mate prekladac? co by mal, kedze "by mal" dorovnat premmenne na vyssi typ pred mat. operaciami - spoliehate sa na to), tak by ste nasledne davali vo funkcii adresu nie ako uint8_t ale ako uint32_t.</div><div>Niektore vyvojove prostredia "arduino like" maju s automatickym pretypovavanim zvlastne spravanie, alebo ho jednoducho (niekedy - nevysledoval som do konca ) neurobia...<br></div><div></div><div><br></div><div>-> skuste urobit sucet mimo funkcie a pretypovat rucne premenne pred suctom a funkcii posunut typ, ktory ocakava - resp. ustrazit si typy hlavne pri premennej adresy, ale idealne vsade...<br></div><div><br></div><div>v povodnej vasej rutine so zapisovanim po bytoch ste napr. mali rucne pretypovanie premennej integer pred volanim write:<br></div><div><br></div><div>>> EEPROM.write((adresa+i), (uint8_t) integer);</div><div><br></div><div><br></div><div><br></div><div>Dodo<br></div><div><br></div><div><br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">po 19. 8. 2019 o 22:19 Petr Zapadlo <<a href="mailto:zapik@email.cz">zapik@email.cz</a>> napísal(a):<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Zdravím,<br>
<br>
chápu, nějak mi unikla existence metod put() a get(), možná v době, kdy <br>
jsem začal tohle používat tak ještě nebyly. Nicméně, upravil jsem zápis <br>
následovně:<br>
<br>
void write_to_eeprom(uint32_t integer, uint8_t adresa){<br>
EEPROM.put(adresa, integer);<br>
EEPROM.commit();<br>
}<br>
<br>
Tohle by mělo být celkem košer. Ostatně zapisuji jen jeden uint32_t a to <br>
ještě příležitostně, takže "ošoupání" buněk nehrozí.<br>
<br>
Ale , jsem tam kde jsem byl. Narazil jsem ještě na jednu zajímavost, na <br>
začátek programu - sekce setup(). jsem si přidal následující testovací kod:<br>
<br>
EEPROM.begin(64);<br>
for (uint8_t i=0; i < 60; i=i+4){<br>
Serial.print("Adresa: ");<br>
Serial.print(i);<br>
Serial.print(" Data: ");<br>
Serial.println(800+i);<br>
write_to_eeprom(800+i, i);<br>
}<br>
for (uint8_t i=0; i < 60; i=i+4){<br>
Serial.print("Adresa: ");<br>
Serial.print(i);<br>
Serial.print(" Data: ");<br>
Serial.println(read_from_eeprom(i));<br>
}<br>
<br>
A tenhle kod, projde vždy a sedí zapsané a vyčtené hodnoty.<br>
<br>
Nicméně pozdější zavolání funkce write_to_eeprom() už nedopadne dostanu <br>
"kernel panic". A je to opravdu zápisem do eeprom, když ho zakomentuji, <br>
tak to funguje dobře (jen se neuloží hodnota do eeprom).<br>
<br>
Jak tohle vykoumat?<br>
<br>
Díky<br>
petr<br>
<br>
<br>
<br>
<br>
Dne 19.8.2019 v 06:19 Pavel Brychta napsal(a):<br>
> Dobrý den,<br>
><br>
> ten zápis není zcela optimální z hlediska toho, co vlastně simulovaná <br>
> EEPROM v ESP8266 je, takže to vezmu trošičku obšírněji:<br>
><br>
> U ESP8266 je EEPROM simulovaná sektorem ve flash paměti, takže trpí na <br>
> wear leveling. Commit by se tedy měl používat pokud možno co nejméně, <br>
> respektive po zápisu co největších dat. Volání commit po zápisu <br>
> každého bytu znamená 4 přepisy sektoru. U ESP32 v posledních verzích <br>
> jádra přešla emulace EEPROM na používání NVS, ale obávám se, že <br>
> přístup k používání commit zůstal stejný. Další věcí pak je namísto <br>
> bytového přístupu použít templatovaných metod put() a get(), které <br>
> zabezpečí uložení celého prvku. Takže doporučuji:<br>
><br>
> 1. překontrolovat, zda voláte .begin() na začátku programu s <br>
> dostatečnou velikostí<br>
><br>
> 2. použít .put()<br>
><br>
> 3. commit() zavolat po uložení<br>
><br>
> Hezký den,<br>
><br>
> Pavel Brychta<br>
><br>
> Dne 18.8.2019 v 22:18 Petr Zapadlo napsal(a):<br>
>> Zdravím,<br>
>><br>
>> potřebuji v jednom projektu přejít z ESP8266 -> ESP32. Kod jsem <br>
>> lehce upravil (především kvůli trochu jiným knihovnám), přeložil a <br>
>> testuju a narazil jsem na nečekaný problém a to s EEPROM.<br>
>><br>
>> Mám funkci:<br>
>><br>
>> void write_to_eeprom(uint32_t integer, uint8_t adresa){<br>
>> for (uint8_t i=0; i<4;i++){<br>
>> EEPROM.write((adresa+i), (uint8_t) integer);<br>
>> EEPROM.commit();<br>
>> integer= integer >> 8;<br>
>> }<br>
>> }<br>
>><br>
>> Totožnou rutinu jsem už použil mockrát, hlavně s ESP8266 a ale i s <br>
>> jedním ESP32 a nenarazil jsem na problém. Nyní však když zapisuju <br>
>> data do EEPROM tak mi cpu zhavaruje:<br>
>><br>
>> Guru Meditation Error: Core 1 panic'ed (Cache disabled but cached <br>
>> memory region accessed)<br>
>> Guru Meditation Error: Core 1 panic'ed (IllegalInstruction). <br>
>> Exception was unhandled.<br>
>> Memory dump at 0x401495e8: bad00bad bad00bad bad00bad<br>
>> A je do resetu vymalováno.<br>
>><br>
>> A navíc je to závislé na datech - pokud je zapisovaná hodnota kolem <br>
>> 66000 tak je vše OK, pokud je cca 800, tak zhavaruje.<br>
>><br>
>> když si dám vypsat jednotlivé byte co se zapisují, tak je vše OK?<br>
>><br>
>> Nějak to mu nerozumím, už do toho tady čumím dost dlouho dobu a <br>
>> nemohu se hnout z místa.<br>
>><br>
>> Tuší někdo, v čem by mohl být problém?<br>
>><br>
>> Díky<br>
>><br>
>> Petr<br>
>><br>
>> _______________________________________________<br>
>> HW-list mailing list - sponsored by <a href="http://www.HW.cz" rel="noreferrer" target="_blank">www.HW.cz</a><br>
>> <a href="mailto:Hw-list@list.hw.cz" target="_blank">Hw-list@list.hw.cz</a><br>
>> <a href="http://list.hw.cz/mailman/listinfo/hw-list" rel="noreferrer" target="_blank">http://list.hw.cz/mailman/listinfo/hw-list</a><br>
> _______________________________________________<br>
> HW-list mailing list - sponsored by <a href="http://www.HW.cz" rel="noreferrer" target="_blank">www.HW.cz</a><br>
> <a href="mailto:Hw-list@list.hw.cz" target="_blank">Hw-list@list.hw.cz</a><br>
> <a href="http://list.hw.cz/mailman/listinfo/hw-list" rel="noreferrer" target="_blank">http://list.hw.cz/mailman/listinfo/hw-list</a><br>
<br>
_______________________________________________<br>
HW-list mailing list - sponsored by <a href="http://www.HW.cz" rel="noreferrer" target="_blank">www.HW.cz</a><br>
<a href="mailto:Hw-list@list.hw.cz" target="_blank">Hw-list@list.hw.cz</a><br>
<a href="http://list.hw.cz/mailman/listinfo/hw-list" rel="noreferrer" target="_blank">http://list.hw.cz/mailman/listinfo/hw-list</a><br>
</blockquote></div>