Частая запись в энергонезависимую память


10

Я разрабатываю устройство, которое автоматически регулирует его физическое положение при изменении температуры. Если устройство выключено или питание отключено, устройству необходимо запомнить его последнюю температуру и положение. У меня есть возможность сохранить эти значения в EEPROM, но проблема в том, что положение и температура могут меняться очень быстро. Если бы я записывал temp и pos в EEPROM после каждого их изменения, это (1) немного замедляло бы прошивку и (2) скорее всего уничтожало EEPROM через год или два. Итак, как я вижу, мои варианты таковы ...

1) Используйте конденсатор / батарею для поддержания устройства в течение короткого времени после потери питания, чтобы я мог записывать значения в EEPROM только в это время. Мне это не нравится, потому что доска довольно требовательна к энергопотреблению, и это потребует большой кепки. И у меня нет тонны свободного места. И я не хочу дополнительную стоимость батареи и держателя батареи / или большой крышки.

2) использовать F-RAM вместо EEPROM, чтобы я мог писать в нее триллионы раз, не изнашиваясь. Мне не нравится этот вариант, потому что FRAM немного дороже, чем EEPROM, и это для производственного продукта (не только один).

3) Пишите только положение и температуру каждые 5 минут или около того. Таким образом, я всегда записываю довольно недавнюю позицию / темп, но я пишу не каждую секунду, поэтому моя программа не замедляется и EEPROM не умирает так быстро. Это похоже на мой лучший вариант.

У кого-нибудь еще есть предложения, о которых я не думаю?


5
Просто вопрос. Если устройство автоматически регулирует свое физическое положение, зачем вам запоминать последнюю температуру? При повторном включении устройства оно не обновит температуру и не отрегулирует ее положение?
Даниэль Грилло

1
Я согласен с Дэниелом. Что если вы выключите питание, и температура окружающей среды резко изменится? При включении питания, если вы использовали последнюю сохраненную температуру / позицию, вы все равно оказались бы в неправильном месте, и устройство в конечном итоге могло бы двигаться. Есть ли другое требование, которого нет в вашем вопросе?
Дейв

Что такое спецификация EEPROM - сколько циклов записи?
Джейсон С

Ответы:


10

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

Добавьте к своим данным 24-битный счетчик, чтобы длина вашего блока данных составляла, например, 8 байтов. Страницы в 24AA64 имеют длину 32 байта, поэтому EEPROM объемом 64 КБ вмещает 256 страниц. Из таблицы данных:

«При выполнении записи размером менее 32 байт данные на остальной части страницы обновляются вместе с записываемыми байтами данных. Это заставит всю страницу выдержать цикл записи, по этой причине на страницу указывается выносливость».

поэтому не имеет смысла использовать блоки данных размером менее 32 байт.

Посмотрите на счетчик первой страницы. Если он равен нулю, вы использовали максимальное количество циклов записи для этой страницы, поэтому вы переходите к следующей странице и проверяете этот счетчик. Повторяйте, пока не найдете счетчик> ноль. Это страница, которую вы сейчас используете. ЭСППЗУ Microchip обладают выносливостью в 1 миллион циклов, которую вы можете увеличить до 256 миллионов с помощью данного примера максимум 32 байта на блок в 64 КБ EEPROM. Этого должно быть достаточно, чтобы пережить ваш продукт: 40 лет, если вы пишете каждые 5 секунд (!).

Вы захотите инициализировать EEPROM при первом использовании. Как вы знаете, когда это. Используйте последнюю страницу, чтобы написать уникальную подпись при инициализации. При каждом включении проверяйте наличие подписи. Если это не так, устройство должно быть инициализировано. Вы можете предварительно установить счетчик на каждой странице с 0xF4240 (для 1 миллиона) или очистить все до 0xFF и записать 0xF4240 при первом использовании страницы.
Инициализация EEPROM необходима, потому что иногда в нее записывается определенный шаблон в процессе производства / тестирования.

редактировать
износ выравнивание должно решить ваши проблемы, но я все равно хочу прокомментировать решение конденсатора. Вы говорите, что плата довольно энергоемкая, но, возможно, вы можете изолировать питание микроконтроллера / EEPROM от остальной платы с помощью диода. Таким образом, вам, вероятно, понадобится всего несколько мА, когда основное питание пропадет. 24AA64 записывает страницу менее чем за 5 мс, затем при 10 мА и допустимом падении напряжения в 100 мВ, которое вам понадобится

Сзнак равнояTΔВзнак равно10мA5мs100мВзнак равно500μF

Легко с небольшой суперкап.

дальнейшее чтение
таблицы 24AA64
EEPROM Tutorial Endurance


Выносливость EEPROM указана на странице (по крайней мере, для 24AA64 и других EEPROM, которые я использовал). 24AA64 определяет 32-байтовую страницу, поэтому количество должно быть на страницу, а не на блок.
Саад

@ Саад - Правильно. Исправлено в моем ответе.
Stevenvh

4

1) Как только вы начали процесс записи, вам нужно только включить MCU / EEPROM и убедиться, что линии управления не глючат - I2C, вероятно, предпочтительнее SPI для этого. Нужно всего лишь несколько мА в течение нескольких миллисекунд, чтобы не оказаться слишком большой, и вы можете перевести MCU в спящий режим после начала записи. 3) вы, вероятно, можете применить некоторый интеллект, например, удержание - после того, как написано, оно всегда содержит определенное время, прежде чем может произойти другая запись. Или подождите, пока значение не станет стабильным, прежде чем писать.
Вы также можете увеличить выносливость, распределив данные по нескольким местам. У микрочипа есть некоторые инструменты и дополнения для расчета выносливости для их EEPROM, которые могут быть полезны.


4
Замечание по выносливости в приложении Microchip: ww1.microchip.com/downloads/en/AppNotes/01019A.pdf Из Appnote вы также можете увеличить выносливость примерно в 2 раза, уменьшив рабочее напряжение с 5 до 3,5 В.
Вандэ

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

3

Я бы предложил использовать блочно-ориентированное флэш-устройство и использовать один байт из каждого блока в качестве флага режима. Поддерживать в качестве инварианта, что почти все флаги режима будут запрограммированы; будет только один блок, где флаг режима не запрограммирован, а предыдущий блок (если необходимо, перенос). Это будет блок с самыми последними данными. Когда этот блок заполняется, сотрите следующий блок (обратите внимание, что стираемый блок может содержать любую комбинацию данных в течение цикла стирания, а инвариант все равно будет удерживаться), затем, когда стирание завершено, установите флаг режима на то, что использовалось для быть последним блоком.

Будет необходимо защитить питание флэш-памяти достаточно хорошо, чтобы гарантировать, что любая попытка запрограммировать байт будет либо успешной, либо неудачной во всей ее полноте, но это не будет иметь значения, если цикл стирания прерывается, оставляя блок, заполненный произвольными данными, так как следующая попытка записи записи данных сотрет этот блок.

Если ваши данные 16 бит, чип 64Kx8 будет содержать более 32 000 записей. Запись одной записи в секунду заполнит фишку примерно в 2,7 раза. Даже чип с выносливостью «всего лишь» 10 тысяч циклов стирания будет работать более 10 лет. Использование более крупного чипа или чипа с выносливостью 100 Кб пропорционально увеличит срок полезного использования.


2

1) Возможно, самый простой вариант, хотя он может потребовать изменений в оборудовании. Я достиг этого раньше без модификаций PBC, просто увеличивая разъединяющие заглушки и прерывая отключение.

2) Как вы указали, проблема с FRAM - это цена!

3) В зависимости от изменчивости ваших данных о температуре и положении вы будете увеличивать выносливость, записывая, только если значение изменилось. Возможно, вы измеряете температуру один раз в секунду, но если она меняется каждые 5 минут, проблема решена.


1

Вот как я решил эту проблему в своем проекте:

Зарезервируйте 1 сектор вспышки для хранения битовой маски неиспользуемых слотов и количества слотов для значения.

Я использовал битовую маску длиной 16 байт, поэтому у меня было 128 слотов для установки значений.

Битовая маска инициализируется для всех, что в терминах вспышки является стертым состоянием.

Если вы хотите записать новое значение, прочитайте битовую маску и найдите первый бит, который равен единице. Это номер слота, в который вы напишите значение. Измените этот бит на ноль, чтобы пометить его как использованный, и запишите битовую маску обратно во флэш-память, не стирая ее сначала. Затем запишите значение в слот после битовой маски, также не стирая флэш-память.

Таким образом, вы увеличиваете циклы флэш-записи в 128 раз, записывая новую битовую маску, изменяя только единицу на ноль.

Если вся битовая маска равна 0, удалите сектор флэш-памяти и начните заново.


3
Я могу разочаровать вас, но когда вы немного мигаете, весь сектор перезаписывается. Ваше решение очень скоро сделает сектор «битовой маски» мертвым.
Андрейс Кайников

1
Если вы не стираете вспышку, вы не используете один из циклов стирания 10К для сектора. Если у вас есть значение 0x7F и вы пишете значение 0x3F, результат будет 0x3F. Это поддерживает битовую маску в актуальном состоянии, но не стирает вспышку. Стирание происходит только после того, как вся битовая маска равна 0.
Robert

Если я не прав, давайте обсудим. Я не хочу здесь плохих ответов, и я действительно не хочу плохого дизайна в моем проекте.
Роберт

Я думаю, что Роберт прав. На моем микроконтроллере вы можете записывать только 4 байта за раз, но необходимые биты установлены в ноль. Единственный способ вернуть их к 1 - это очистить блок 1k. Это только циклы стирания, которые носят вспышку ...
Тим

Это может быть различным для каждого типа памяти и, возможно, даже для поставщика памяти. Я видел, что EEPROM должны стереть страницу, а затем переписать ее для каждой записи. Я видел флэш-память, вы можете написать биты, которые все еще равны единице, не стирая страницу.
mjh2007
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.