Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

EEPROM i AVRlib - technika were leveling

Jakub17 26 Lut 2018 10:00 486 6
  • #1 26 Lut 2018 10:00
    Jakub17
    Poziom 6  

    Witam

    Mam pytanie odnośnie rozdziału z książki: "Język C dla mikrokontrolerów AVR", być może ktoś czytał i mi coś wyjaśni lub sam autor się wypowie.
    W książce autor przedstawia funkcję do zapisu danych w EEPROM wykorzystując podstawową funkcję eeprom_write_word() z AVRlib. Tylko funkcje te działają na tej zasadzie że kasują komórkę pamięci, a następnie zapisują ją nową zawartością, co niweczy zalety were leveling. Jednakże jak autor słusznie zauważył że domyślnie komórki eeprom mają wartość 0xFF (fusebit EESAVE nieustawiony).

    Ale czy to oznacza, że po ponownym uruchomieniu programu (bez przeprogramowania pamięci flash) technika were leveling nie zadziała? No bo program dokona zapisu w tym samym miejscu pamięci co ostatnio, ale obszar ten nie będzie wykasowany bo będzie zawierał treść z poprzedniego uruchomienia programu, więc zapis każdego obiektu będzie skutkował każdorazowym kasowaniem, tak?

    0 6
  • #2 26 Lut 2018 12:02
    tmf
    Moderator Mikrokontrolery Projektowanie

    Zapisując do EEPROM możesz zmieniać tylko stan bitów z 1 na 0, zmiana z 0 na 1 wymaga skasowania komórki.

    Jakub17 napisał:
    W książce autor przedstawia funkcję do zapisu danych w EEPROM wykorzystując podstawową funkcję eeprom_write_word() z AVRlib. Tylko funkcje te działają na tej zasadzie że kasują komórkę pamięci, a następnie zapisują ją nową zawartością, co niweczy zalety were leveling.


    Dlaczego uważasz, że niweczy? Istotą wear levelingu jest rozłożenie zapisu na kilka komórek pamięci, co odpowiednio zwiększa trwałość, gdyż do żadnej z nich nie zapisujesz więcej niż dozwoloną liczbę razy. Problem leży w innym miejscu - w jaki sposób sygnalizować w której komórce jest aktualna wartość. To można zrobić na kilka sposobów, które nie mają związku z kasowaniem. Można też zrobić tak, że np. rozkładamy zapis na 8 komórek pamięci EEPROM, a komórkę aktywną sygnalizujemy poprzez skasowanie bitu w innej komórce. Kasowanie bitu jest operacją nieniszczącą, więc w ten sposób do jednek komórki możemy zapisywać 8-razy bez zmniejszenia trwałości. Oczywiście tu może pojawić się problem jeśli użyte funkcje zapisu za każdym razem kasują komórkę. Ae tak nie musi być w przypadku funkcji z eeprom.h - ich działanie zależy od stanu rejestrów kontrolnych pamięci FLASH i umożliwiają one rozdzielenie kasowania i zapisu. Więc wszystko jest ok.

    0
  • #3 26 Lut 2018 13:19
    Jakub17
    Poziom 6  

    tmf napisał:
    Kasowanie bitu jest operacją nieniszczącą


    Teraz to jestem troche skołowany. Na stronie 224 w swojej książce (wydanie 2) piszesz:
    "W przeciwieństwie do kasowania, proces programowania bitu (zmiany stanu z 1 na 0) nie jest dla pamięci destrukcyjny, możemy go więc wykonać dowolną liczbę razy."


    tmf napisał:

    Dlaczego uważasz, że niweczy? Istotą wear levelingu jest rozłożenie zapisu na kilka komórek pamięci, co odpowiednio zwiększa trwałość, gdyż do żadnej z nich nie zapisujesz więcej niż dozwoloną liczbę razy.


    Czyli chodzi o to by kasować pewien obszar komórek jednocześnie, w przypadku przepełnienia określonego bufora?

    tmf napisał:

    Oczywiście tu może pojawić się problem jeśli użyte funkcje zapisu za każdym razem kasują komórkę. Ae tak nie musi być w przypadku funkcji z eeprom.h - ich działanie zależy od stanu rejestrów kontrolnych pamięci FLASH i umożliwiają one rozdzielenie kasowania i zapisu. Więc wszystko jest ok.


    Mowiąc o tym, że funkcja z eeprom.h dokonuje kasowania przed zapisem powoływałem się na Twoją książkę (str.235 wytłuszczonym drukiem) oraz na
    https://www.nongnu.org/avr-libc/user-manual/group__avr__eeprom.html gdzie jest napisane: "All write functions force erase_and_write programming mode."

    Dodatkowo nie rozumiem jednego fragmentu z książki (str.235)
    "[..]Ponieważ tylko operacja kasowania uszkadza komórkę, możemy jako znacznik zajętości w tablicy bufor wykorzystać pojedyncze bity z tablicy wskaźnik."

    Tablica wskaźnik leży w pamięci eeprom. Jak wykorzystać pojedyncze bity skoro najmniejszą jednostką jaką można zapisać w eeprom jest bajt (o czym piszesz na początku rozdzialu). Wybacz, że oczekuję tutaj korepetycji z czytania ze zrozumieniem Twojej książki, ale naprawdę nie mogę wydedukować o co chodzi w tym zdaniu, troche za krótko dla mnie opisane.

    0
  • Pomocny post
    #4 26 Lut 2018 14:40
    michalko12
    Specjalista - Mikrokontrolery

    Kasowanie komórki != kasowanie bitu.

    Kasowanie komórki oznacza że komórka == 0xff
    Kasowanie bitu oznacza że bit == 0


    Tak komórka może zmieniać swoją wartość bez potrzeby kasowania
    0b1111 1111
    0b0111 1111
    0b0011 1111
    0b0001 1111
    0b0000 0111
    0b0000 0011
    0b0000 0001
    0b0000 0000

    Potrafisz z tego wyciągnąć wnioski?

    Są jeszcze inne wersje funkcji oszczędzające w jakimś stopniu pamięć EEPROM https://www.nongnu.org/avr-libc/user-manual/g...eprom.html#ga63aee2719099e8435e8584d4b3e51991

    0
  • #5 26 Lut 2018 15:21
    krzysiek_krm
    Poziom 31  

    Witam,
    można również całą tę pamięć potraktować jak bufor kołowy i zapisywać kolejne komplety danych, każdy z nich opatrując jakimś "time stamp" ewentualnie "count stamp" dla rozpoznania tego, który jest najnowszy.

    Pozdrawiam

    0
  • Pomocny post
    #6 26 Lut 2018 18:50
    tmf
    Moderator Mikrokontrolery Projektowanie

    Wcześniejsze kwestie wyjaśnił już kol. @michalko12.

    Jakub17 napisał:
    Mowiąc o tym, że funkcja z eeprom.h dokonuje kasowania przed zapisem powoływałem się na Twoją książkę (str.235 wytłuszczonym drukiem) oraz na
    https://www.nongnu.org/avr-libc/user-manual/group__avr__eeprom.html gdzie jest napisane: "All write functions force erase_and_write programming mode."


    Nowsze AVRy posiadają dodatkowe bity konfigurujące zachowanie się EEPROM. Można w nich rozdzielić kasowanie komórki (nadawanie jej wartości 0xFF) od programowania (zapisu dowolnej wartości). W takiej sytuacji kolejne zapisy są nieniszczące (bity EEPM).

    Jakub17 napisał:
    Dodatkowo nie rozumiem jednego fragmentu z książki (str.235)
    "[..]Ponieważ tylko operacja kasowania uszkadza komórkę, możemy jako znacznik zajętości w tablicy bufor wykorzystać pojedyncze bity z tablicy wskaźnik."

    Tablica wskaźnik leży w pamięci eeprom. Jak wykorzystać pojedyncze bity skoro najmniejszą jednostką jaką można zapisać w eeprom jest bajt (o czym piszesz na początku rozdzialu).


    Zapisywać możemy tylko cały bajt, ale kasować możemy pojedyncze bity (nadawać im wartość 0). Zapis 1 na poszczególnych pozycjach bitu nic nie robi - jak pisałem nie da się zmienić stanu bitu z 0 na 1, a więc taki zapis jest nieniszczący. Zmiana z 0 na 1 możliwa jest tylko przez skasowanie komórki pamięci. Stad też, tak jak pokazał kol. @michalko12, 8-krotny zapis do tej samej komórki, kasujący kolejne bity, odpowiada tylko jednej operacji kasowania komórki. A więc w ten sposób można wydłużyć życie komórki, robiącej jako wskaźnik 8-krotnie (zakładając, że zmieniamy rejestr kontrolny tak, aby zapis nie wywoływał automatycznie kasowania komórki pamięci).

    0