<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body text="#000000" bgcolor="#FFFFFF">
<p>Zdravím,</p>
<p>v tomhle zrovna problém není - tato část kodu funguje dobře.
Tohle byl jen testovací kus, kterým jsem ověřoval zápis a čtení a
to funguje. Když je to na začátku setup(), tak to proběhne OK.
Když stejný kus umístím do místa, kde potřebuji zapsat svou
hodnotu, tak proběhnou třeba 3 cykly a zhavaruje to, nebo to lehne
hned v prvním a nebo to taky proběhne úplně bez problémů. Čím to
je netuším, pocitově je to "nějak" odvislé od hodnoty zapisované
do eeprom, ale může to být taky náhoda.</p>
Petr<br>
<br>
Dne 20.8.2019 v 08:49 Dodo Racek napsal(a):<br>
<blockquote type="cite"
cite="mid:CAP5hgLgFB38_i_qXhGDxjQhoT9+upi2MaENNFqHX93T5gtkFZg@mail.gmail.com">
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<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><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><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"
moz-do-not-send="true">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"
moz-do-not-send="true">www.HW.cz</a><br>
>> <a href="mailto:Hw-list@list.hw.cz" target="_blank"
moz-do-not-send="true">Hw-list@list.hw.cz</a><br>
>> <a href="http://list.hw.cz/mailman/listinfo/hw-list"
rel="noreferrer" target="_blank" moz-do-not-send="true">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"
moz-do-not-send="true">www.HW.cz</a><br>
> <a href="mailto:Hw-list@list.hw.cz" target="_blank"
moz-do-not-send="true">Hw-list@list.hw.cz</a><br>
> <a href="http://list.hw.cz/mailman/listinfo/hw-list"
rel="noreferrer" target="_blank" moz-do-not-send="true">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"
moz-do-not-send="true">www.HW.cz</a><br>
<a href="mailto:Hw-list@list.hw.cz" target="_blank"
moz-do-not-send="true">Hw-list@list.hw.cz</a><br>
<a href="http://list.hw.cz/mailman/listinfo/hw-list"
rel="noreferrer" target="_blank" moz-do-not-send="true">http://list.hw.cz/mailman/listinfo/hw-list</a><br>
</blockquote>
</div>
<br>
<fieldset class="mimeAttachmentHeader"></fieldset>
<br>
<pre wrap="">_______________________________________________
HW-list mailing list - sponsored by <a class="moz-txt-link-abbreviated" href="http://www.HW.cz">www.HW.cz</a>
<a class="moz-txt-link-abbreviated" href="mailto:Hw-list@list.hw.cz">Hw-list@list.hw.cz</a>
<a class="moz-txt-link-freetext" href="http://list.hw.cz/mailman/listinfo/hw-list">http://list.hw.cz/mailman/listinfo/hw-list</a>
</pre>
</blockquote>
<br>
</body>
</html>