logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Jak efektywnie zarządzać zapisami w EEPROM, by wydłużyć jej żywotność?

JanuszKornas 09 Lip 2019 17:17 702 6
REKLAMA
  • #1 18052380
    JanuszKornas
    Poziom 11  
    Posty: 120
    Pomógł: 6
    Ocena: 25
    EEPROM ma ograniczoną ilość zapisów, powiedzmy 100tys. Powiedzmy, że mam do zapisania kilka/naśco/dziesiąt bajtów konfiguracji. Wymyśliłem, jak zrobić, aby przy każdym zapisie użyć innego obszaru pamięci. Ale może są lepsze sposoby, to mnie na nie naprowadźcie.
    Mój pomysł jest taki:
    1. Za pierwszym odpaleniem, lub na jakiś przycisk ZERUJ_PAMIEC zeruję wszystkie komórki pamięci EEPROM.
    2. Gdy zmieniam konfiguracje, względem domyślnej w programie, to chciałbym ją zapisać w pamięci nieulotnej EEPROM:
    a) przeszukuję pamięć począwszy od pierwszej komórki i jeśli natrafię na wartości niezerowe, to był to poprzedni zapis. Wiem jaki ma rozmiar, więc zeruję te komórki (ustawiam wartości na zero) i zapisuję pod kolejnym adresem (uważając, aby struktura/dane zapisywane się zmieściły w dostępnej pamięci).
    b) przy starcie systemu przeszukuję pamięć od początku i jeśli znajdę wartość nie zerową, to jest początek zapisanej poprzednio konfiguracji, odczytuję ją i mam konfigurację z poprzedniego zapisu.

    Macie lepszy pomysł?

    P.S.
    Założyłem, że za każdym razem rozmiar zapisywanych danych jest taki sam. Ew pierwsza wartość może być informacją jakie dane zapisujemy.
  • REKLAMA
  • REKLAMA
  • #3 18052436
    JanuszKornas
    Poziom 11  
    Posty: 120
    Pomógł: 6
    Ocena: 25
    W dokumentacji nic nie ma o tym, że ta biblioteka równomiernie wykorzystuje dostępną przestrzeń. A standartowa bibliotego ma podobne funkcje, z wyjątkiem
    - debugowania
    - odnajdywania wolnego adresu,
    - zapisu wartości binarnej
    Może była superowa w 2012 roku, ale na dziś to wydaje się, że ma jedynie te trzy powyższe featurki ponad, to co mamy dostępne w Arduino.IDE.
  • REKLAMA
  • Pomocny post
    #4 18052444
    Konto nie istnieje
    Poziom 1  
  • #5 18052620
    JanuszKornas
    Poziom 11  
    Posty: 120
    Pomógł: 6
    Ocena: 25
    khoam napisał:
    To "odnajdowanie" adresu wiąże się też bezpośrednio z równomiernym zapisem komórek EEPROM.


    " the output is the first address available for writing in EEPROM. ..... This function is not much more than an every increasing counter and it differs from a malloc call in that there is no way to free memory."

    Rozumiem, tak:
    - znalezionym adrese jest pierwszy wolny do zapisu w EEPROM..... Ta funkcja nie jest niczym więcj niż powiększanym licznikiem.....

    Więc gdzie tutaj jakaś optymalizacja? Chyba, że featurkę dopisali w źródłach, a nie umieścili w opisie. Ale to wskaż proszę gdzie o tym pisze bo jestem ciekaw jak to zaimplementowali.

    khoam napisał:
    Ponadto jest jest zaimplementowana kontrola limitu zapisów.

    Kontrola dotyczy tylko gdy debugujesz swój program, aby omyłkowo w 6 minut, nie wykorzystać 100tys zapisów do wszystkich komórek i nie zajechać pamięcie, bo źle napisałeś program i w pętli zapisujesz ciągle dane do EEPROM, nieświadomie. Zresztą licznik zapisów, to nie jest optymalizacja zapisu.

    Napisze jeszcze raz: Mam powiedzmy 100 bajtów do zapamiętania.
    Jeśli dziś wykorzystuję adresy od 0..99, a włączę maszyne i chce zapisac kolejne, to mój pomysł polega na tym, aby odczytać, to co potrzeba, zmienić w swoich zmiennych, WYZEROWAC wszystkie adresy od 0..99 i zapisać od 100..199. Jutro gdy włączę maszynę, to zobacze, ze od 0..99 są zame zera, a jakieś dane zaczynają się od 100, więc wiem, że musze odczytac zmienne począwszy od adresu 100. Jeśli nic nie zmieniam, to pojutrze znowu przy uruchamieniu widze, że 0.99 są zera, a pierwsza jakaś wartość jest pod adresem 100. Jak następnym razem będe chciał coś zmienić, to uruchamiając soft zobaczę, że dane zaczynają się od 100, więc wyzeruję komórki 100..199 i zapiszę od 200..299.
    Muszę tylko uważać, aby zapis się zmieścił i nie przekroczył dostępnej pamięci. Taką metodą:
    - nie wykorzystam końcówki pamięcie,
    - muszę dla pierwszej zmiennej określić wartość, której nie wolno jej przyjmować (np.0), albo ustalić na jakąś stało i zużyć za każdym razem o ten pierwszy bajt więcej,
    - każdy zapis, to zapis wartości i zapis zer do poprzednich adresów (chyba, że to realizuje kasowanie i i tak by trzeba było to zrobić, więc nie "zużywamy" dostępnej ilości zapisów.


    khoam napisał:
    Jest jeszcze inna, (trochę) nowsza biblioteka, ale tej nie testowałem.
    EEPROMWearLevel: https://github.com/PRosenb/EEPROMWearLevel


    Ta druga na dzień dobry ma zapisane: "It reduces EEPROM wear by writing every new value to an other EEPROM location." więc robi, to czego szukam, jak doczytam jaką robi to metodą, to dam znać.

    Dzięki za nakierowanie.
  • #6 18052680
    Konto nie istnieje
    Poziom 1  
  • REKLAMA
  • #7 18053167
    JanuszKornas
    Poziom 11  
    Posty: 120
    Pomógł: 6
    Ocena: 25
    khoam napisał:
    Ciekawy tylko jestem, gdzie to wszystko jest zapamiętywane, bo chyba musi też być w pamięci EEPROM

    Gdybyś zerował wszystko przed "wlasciwymi danymi" to pierwszy niezerowy bajt byłby początkiem danych. Można by to raz przy starcie odczytać i po klopocie. Ew. zmieniać raz na dobę.

Podsumowanie tematu

LABEL_AI_GENERATED
W dyskusji poruszono temat efektywnego zarządzania zapisami w pamięci EEPROM, aby wydłużyć jej żywotność. Użytkownik zaproponował metodę, w której przy każdym zapisie wykorzystywany jest inny obszar pamięci, co ma na celu uniknięcie nadpisywania tych samych komórek. Zasugerowano użycie bibliotek, takich jak EEPROMEx oraz EEPROMWearLevel, które oferują funkcje równomiernego rozkładu zapisów oraz kontrolę limitu zapisów. Krytyka dotyczyła jednak braku optymalizacji w tych bibliotekach oraz konieczności zrozumienia, jak są one zaimplementowane. Wskazano również na możliwość zerowania pamięci przed zapisami, co mogłoby uprościć proces odczytu danych.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA