Arduino UNO - какой ресурс у EEPROM?

progman
Offline
Зарегистрирован: 26.01.2019

Использую EEPROM для хранения промежуточных данных. Данные пишутся каждую секунду. 64 байта.

Стоит вопрос - переписывать один и тот же кусок памяти или мутить кольцевой буфер.

Ответ зависит от ресурса EEPROM - сколько циклов перезаписи гарантированно выдержит внутренняя память чипа?

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

progman пишет:

Использую EEPROM для хранения промежуточных данных. Данные пишутся каждую секунду. 64 байта.

Стоит вопрос - переписывать один и тот же кусок памяти или мутить кольцевой буфер.

Ответ зависит от ресурса EEPROM - сколько циклов перезаписи гарантированно выдержит внутренняя память чипа?

 

гарантиреуца 100`000 циклов записи на ячейку, но кольцевой буфер мутить стОит. 

 

Green
Offline
Зарегистрирован: 01.10.2015

Зависит от того сколько лет планируется использовать ус-во. Тесты у людей показывают до 3-5 млн циклов в домашних условиях.

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

progman пишет:

сколько циклов перезаписи гарантированно выдержит внутренняя память чипа?

Всегда смотрите первоисточник - даташит. Там указаны все характеристики чипа, в том числе ресурс Flash и EEPROM.

Green
Offline
Зарегистрирован: 01.10.2015

Только ДШ гарантирует при эксплуатации в диапазоне температур от и до, и питающих напряжений от и до. Ага?

SLKH
Offline
Зарегистрирован: 17.08.2015

Green пишет:

Только ДШ гарантирует при эксплуатации в диапазоне температур от и до, и питающих напряжений от и до. Ага?

Я бы вместо "гарантирует" написал "позволяет надеяться". При указанных условиях, разумеется.

Green
Offline
Зарегистрирован: 01.10.2015

Вы, конечно, можете писать что хотите, но прозводитель согласно ДШ гарантирует.)

b707
Offline
Зарегистрирован: 26.05.2017

progman пишет:

Использую EEPROM для хранения промежуточных данных. Данные пишутся каждую секунду. 64 байта.

 

Гарантированного ресурса ЕЕПРОМ в Уно хватит на 1.5 суток. Если спользовать буфер - примерно на месяц.

ИМХО, подумайте об оптимизации алгоритма. Скорее всего вам не нужно писать данные раз в секунду.

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

progman пишет:

Данные пишутся каждую секунду. 64 байта.

Очень жестко - может стоит подумать о бесперебойном питании аппарата, а данные в EEPROM записывать раз в час или сутки?

PRC
Offline
Зарегистрирован: 03.02.2019

Поставить внешнюю FRAM. Она работает как RAM с автономным питанием.

black-support
Offline
Зарегистрирован: 22.04.2019

А что произойдёт при порче EEPROM из-за частой перезаписи ?
И как отследить проблему (скорее всего при очередной попытке записи) ? Данные сотрутся, останутся старые, запишутся некорректно ? 

sadman41
Offline
Зарегистрирован: 19.10.2016

При считывании будут получены не те данные, что записаны.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

black-support пишет:

И как отследить проблему (скорее всего при очередной попытке записи)

Контрольную сумму щитать умеешь?

black-support
Offline
Зарегистрирован: 22.04.2019

DetSimen пишет:

Контрольную сумму щитать умеешь?

Нет. Но понял. 

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

black-support пишет:

DetSimen пишет:

Контрольную сумму щитать умеешь?

Нет. Но понял. 

 

Для небольших блоков данных можно пользоваться CRC8 который есть, например, в библиотеке 1-Wire

Гриша
Offline
Зарегистрирован: 27.04.2014

black-support пишет:

DetSimen пишет:

Контрольную сумму щитать умеешь?

Нет. Но понял. 

у dallas ( к примеру DS18B20) есть алгоритм проверки CRC  саму формулу реализовывать на ардуино не стоит, а вот использовать таблицу многие пользуют. 

в этом топике вроде табличка есть, да и на гитхабе встречал табличку и библиотеку (не помню какую) с примера реализации.

sadman41
Offline
Зарегистрирован: 19.10.2016

Да в avr-lib уже сделаны все эти *crc*: https://www.microchip.com/webdoc/AVRLibcReferenceManual/group__util__crc_1ga37b2f691ebbd917e36e40b096f78d996.html

Достаточно изобразить что-то типа

uint8_t data[] = { ... };
uint8_t crc = 0x00;

for (uint8_t i=0; i<sizeof(data); i++) {
  crc = _crc_ibutton_update(crc, data[i]);
} 

 

black-support
Offline
Зарегистрирован: 22.04.2019

Всем спасибо ! Буду пробовать.