Zwiększanie żywotności Eeprom - Wear leveling
: 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.
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.
Code: [Zaznacz cały] [Rozwiń/Zwiń]
- $regfile = "xm128a3udef.dat" 'FLASH-128KB,SRAM-8KB,EEP-2KB,7xTIMER,4xDMA,7xUSART,3xSPI,2xTWI,USB
- $crystal = 32000000 '32MHz
- $hwstack = 128 'FLASH 10K TIMES
- $swstack = 128 'EEPROM 100K TIMES
- $framesize = 512
- Config Submode = New
- Const My100k_times = 10
- Dim Mem_cell(my100k_times) As Eram Word
- Function Read_mem() As Word
- Local Fn As Word , Helpw As Word
- Helpw = &HFFFF
- For Fn = 1 To My100k_times
- If Mem_cell(fn) <> &HFFFF Then 'one by one check if you find FFFF
- Helpw = Mem_cell(fn) 'remember values that differ from FFFF
- Else 'if FFFF is found then previous is our value
- Read_mem = Helpw
- Exit Function
- End If
- Next
- End Function
- Sub Clear_ee_buff()
- 'this sub will do eeprom carry, format eeprom for next use
- Local Fn As Word
- Fn = My100k_times
- Do
- Mem_cell(fn) = &HFFFF
- Decr Fn
- Loop Until Fn = 0
- End Sub
- Sub Remember(byref Mem_it As Word)
- Local Fn As Word
- Fn = 1
- While Fn < My100k_times
- If Mem_cell(fn) = &HFFFF Then 'found FFFF, write memory
- Mem_cell(fn) = Mem_it
- Exit Sub
- End If
- Incr Fn
- Wend 'do this till FFFF found
- Call Clear_ee_buff() 'we dont Exit so memory must be full
- Mem_cell(1) = Mem_it
- End Sub
- '--------[ END SUB`s ]----------
- '--[ DEMO STARTS NOW ]----------
- Dim N As Byte , My_word As Word
- 'this routine shows that last value can be saved and readed back
- For N = 1 To 150
- Call Remember(n)
- My_word = Read_mem()
- 'print it if uou like
- Next