Zwiększanie żywotności Eeprom - Wear leveling

Gotowe kody obsługi układów elektronicznych udostępnione przez użytkowników forum.
ODPOWIEDZ
Awatar użytkownika
niveasoft
Posty: 1239
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Zwiększanie żywotności Eeprom - Wear leveling

Post autor: niveasoft » 07 cze 2018, 15:40

Jedna komórka pamięci eeprom w AVR ma gwarantowane przez producenta 100 tyś zapisów.
Musząc cos zapisywac często łatwo można limit zapisów osiągnąć. Poniższy kod pokazuje jak można używając 10 razy więcej komórek dziesięciokrotnie zwiększyć możliwość ilości wpisów do Eeprom. 10 to nie maximum a, po prostu ustawienie że chcemy zwiększyć x10..
Łatwo to rozwinąc na więcej zmiennych. Kod jest przykładowy i specjalnie prosty.
  1. $regfile = "xm128a3udef.dat"                                'FLASH-128KB,SRAM-8KB,EEP-2KB,7xTIMER,4xDMA,7xUSART,3xSPI,2xTWI,USB
  2. $crystal = 32000000                                         '32MHz
  3. $hwstack = 128                                              'FLASH 10K TIMES
  4. $swstack = 128                                              'EEPROM 100K TIMES
  5. $framesize = 512
  6.  
  7. Config Submode = New
  8.  
  9. Const My100k_times = 10
  10. Dim Mem_cell(my100k_times) As Eram Word
  11.  
  12.  
  13.  
  14.  
  15. Function Read_mem() As Word
  16.  Local Fn As Word , Helpw As Word
  17.  
  18.  Helpw = &HFFFF
  19.  
  20.   For Fn = 1 To My100k_times
  21.    If Mem_cell(fn) <> &HFFFF Then                           'one by one check if you find FFFF
  22.     Helpw = Mem_cell(fn)                                    'remember values that differ from FFFF
  23.    Else                                                     'if FFFF is found then previous is our value
  24.     Read_mem = Helpw
  25.      Exit Function
  26.    End If
  27.   Next
  28.  
  29. End Function
  30.  
  31. Sub Clear_ee_buff()
  32. 'this sub will do eeprom carry, format eeprom for next use
  33.  Local Fn As Word
  34.  
  35.    Fn = My100k_times
  36.    Do
  37.     Mem_cell(fn) = &HFFFF
  38.      Decr Fn
  39.    Loop Until Fn = 0
  40. End Sub
  41.  
  42. Sub Remember(byref Mem_it As Word)
  43.   Local Fn As Word
  44.  
  45.  Fn = 1
  46.  While Fn < My100k_times
  47.  
  48.   If Mem_cell(fn) = &HFFFF Then                             'found FFFF, write memory
  49.    Mem_cell(fn) = Mem_it
  50.     Exit Sub
  51.   End If
  52.  
  53.   Incr Fn
  54.  Wend                                                       'do this till FFFF found
  55.  
  56.  Call Clear_ee_buff()                                       'we dont Exit so memory must be full
  57.   Mem_cell(1) = Mem_it
  58.  
  59. End Sub
  60.  
  61. '--------[ END SUB`s ]----------
  62.  
  63.  
  64. '--[ DEMO STARTS NOW ]----------
  65.  
  66. Dim N As Byte , My_word As Word
  67.  
  68.  
  69. 'this routine shows that last value can be saved and readed back
  70.  
  71. For N = 1 To 150
  72.  
  73.  Call Remember(n)
  74.   My_word = Read_mem()
  75.   'print it if uou like
  76.  
  77. Next
ODPOWIEDZ