Перейти к содержанию

    

stm32 EEPROM алгоритмы экономии ресурса ячеек

Девайс пишет при выключении питания в EEPROM значение int(4 байта). Из алгоритмов на ум приходит только запись в ячейки 10 000 циклов, потом смена ячеек. Но меняющийся счетчик циклов будет также хранится в ячейках EEPROM, запись в которые также ограничена. Как в этом случе быть?

 

Процессор STL32L151. EEPROM внутренняя. Пользуюсь функцией HAL_FLASHEx_DATAEEPROM_Program которая также пытается экономить ресурс ячеек. Теме не менее вопрос остался.

 

Почему возник вопрос - есть опасение что детектирование пропадание питания сработает слишком поздно - электролиту подпитки не хватит энергии питать процессор. Такое бывает если напряжение питания убывает плавно а не падает до нуля резко. Большой электролит возможности поставить уже нет. Батарею подпитки тоже. Хотелось бы писать параметры в EEPROM хотя бы раз в 5 минут. EEPROM размером 4K.

Изменено пользователем Димон Безпарольный

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Один из вариантов - писать каждый раз в новую группу ячеек EEPROM по кругу, это позволяет размазать износ на несколько ячеек и, соответсвенно, увеличить суммарный ресурс. Чтобы при чтении была возможность определить где последнее записанное значение частью записанного значения должен быть счетчик. Где между соседними записями значение счетчика меняется скачком, а не на 1 там и была сделана запись в прошлый раз.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Один из вариантов - писать каждый раз в новую группу ячеек EEPROM по кругу, это позволяет размазать износ на несколько ячеек и, соответсвенно, увеличить суммарный ресурс. Чтобы при чтении была возможность определить где последнее записанное значение частью записанного значения должен быть счетчик. Где между соседними записями значение счетчика меняется скачком, а не на 1 там и была сделана запись в прошлый раз.

Но счетчик тоже в EEPROM писать надо. Это значит на 20 000 значений ресурс ячейки кончится.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1. А там точно 10 000 циклов заявлено, не более?

2. Сколько времени (лет) должно работать устройство, чтобы израсходовать заявленный ресурс?

3. Литиевая батарейка, питающая BackUp память, спасет гиганта мысли.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Но счетчик тоже в EEPROM писать надо. Это значит на 20 000 значений ресурс ячейки кончится.

Не нужно: к каждой записи добавляется номер, при инициализации лекго находится последняя.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

STM32L151 EEPROM 4K

Пишем по 8 байт (4 счетчик + 4 значение)

Достаем калькулятор

4 * 1024 / 8 = 512

512 * 5 = 2560 минут / 60 = 42 часа

42 * 10 000 = 420 000 часов / 24 = 17500 дней

17500 / 365 = 47 лет

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
STM32L151 EEPROM 4K

Пишем по 8 байт (4 счетчик + 4 значение)

Достаем калькулятор

4 * 1024 / 8 = 512

512 * 5 = 2560 минут / 60 = 42 часа

42 * 10 000 = 420 000 часов / 24 = 17500 дней

17500 / 365 = 47 лет

Так годится. Спасибо. Я так понимаю в счетчике упаковано 2 значения - начальный адрес текущих ячеек данных и счетчик циклов текущих ячеек?

Изменено пользователем Димон Безпарольный

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Я так понимаю в счетчике упаковано 2 значения - начальный адрес текущих ячеек данных и счетчик циклов текущих ячеек?

Ни к чему там 2 значения и четыре байта: просто счетчик, разрядность которого

покрывает максимальное количество записей в выделенном пространстве.

Получится массив записей счетчик-данные вида:

0365 <DATA>

0366 <DATA>

00BC <DATA>

00BD <DATA>

...

Понятно, что запись под номером 0366 является последней.

И с какой целью считать циклы?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Одного бита хватило бы, чтобы показать, где проходит граница между новыми и старыми записями в выделенном пространстве. Сначала пишем, к примеру, 1. А как дошли до конца, начинаем сначала, и пишем уже 0. И т.д. По переходу из 1 в 0 или наоборот находим границу. Она всегда одна будет, "аномалия".

Придумал только что за 1 минуту. :rolleyes:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ещё минуту надо подумать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Минута истекла, ответ - в студию! B)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Где будет граница после записи 1 в последнее слово EEPROM и перезагрузки устройства ?

"Ещё минуту надо было подумать"

это было пожелание к предыдущему посту.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Где будет граница после записи 1 в последнее слово EEPROM и перезагрузки устройства ?

На нуле, например. А где еще?

 

Другое дело, что однобитный маркер не позволит установить наиболее свежую запись при повреждении

содержимого памяти. Но это не всегда нужно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Там, в конце и будет. А если потом в нулевую ячейку запишем, в ней уже ноль запишем.

Бит - это так, пример. Нет смысла программировать один бит. Байт - другое дело. Или поле в байте.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В даташите на STM32L151 сказано, что количество стираний EEPROM - 300.000 (рисунок внизу).

Размер стираемого/записываемого блока: Double word, Word, Half word, Byte.

 

Если предположить, что ресурс 300К относится к каждому Double word (64 бит или 8 байт), а остальных ячеек не касается, то ресурс записи всей памяти будет:

1) 4096 байт / 8 байт = 512 Double word-ячеек.

2) 512 * 300.000 = 153.600.000 перезаписей. 153 миллиона!!! :w00t:

3) если писать каждые 5 минут один Double word (8 байт), то: 153600000 * 5 / 1440 = 533333 суток, или 1461 год.

Выглядит заманчиво, но что-то мне не верится. Такой ресурс может быть только у FRAM.

 

Скорее всего 300.000 перезаписей относится ко всему блоку EEPROM 4K.

В этом случае ресурс записи в EEPROM такой (при одной записи каждые 5 минут):

1) 300.000 * 5 / 1440 = 1041 сутки, или 2 года и 311 суток :laughing:

post-45309-1533581103_thumb.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти