Продление срока службы EEPROM

Я работаю над программным обеспечением, использующим Uno (ATmega328P). У меня есть байт стадии, который может принимать одно из 5 значений (0-4) в моем коде, и он будет увеличиваться на 1 каждые 2,5 часа. Если я потеряю питание, мне нужно убедиться, что при пробуждении стадия будет такой же, какой она была на момент потери питания, поэтому каждый раз при обновлении стадии я сохраняю ее в EEPROM.

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

В настоящее время мне не нужно использовать EEPROM для чего-либо еще, поэтому, чтобы продлить срок службы EEPROM, я собираюсь выделить 1 четверть (0-255 байт) для сохранения этого значения. Каждый раз, когда я меняю стадию, я буду записывать 3 байта в EEPROM, что будет:

  • Индексный байт (используется для сдвига адресов, по которым я записываю).
  • Байт стадии (стадия, которую мне нужно сохранить).
  • Байт количества (количество раз, когда я записывал сцену по текущему индексу).

Для начала индекс будет записан в байт 0 в EEPROM, стадия — в байт 1, а количество — в байт 2.

Мой план состоит в том, чтобы разрешить запись этапа в байт 1 250 раз, затем очистить счетчик и сместить индекс на 3. Это, в свою очередь, переместит байты, в которые записываются этап и счетчик, на 4 и 5. Я буду делать это до тех пор, пока индекс не достигнет конца 255 байтов, а затем верну индекс на 0. Таким образом, в общей сложности я должен иметь возможность выполнить сдвиг 85 раз.

Каждый байт имеет 100 000 циклов стирания/записи, так что это означает, что я могу пройти через байты 0-255 400 раз, записывая сцену 250 раз за проход. Так что вместо 100 тыс. записей у меня будет около 8,5 млн записей.

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

, 👍0


3 ответа


1

Вы можете загрузить спред, сохранив текущее значение ИЛИ 0x80 или 0x00.

При записи вы записываете в следующую ячейку памяти, а когда она переходит на следующую ячейку, вы берете другое значение и выполняете с ним операцию ИЛИ.

Значения в EEPROM будут

[{0x00|value},{0x00|value},{0x00|value},...,{0x00|value},{0x00|value},{0x00|value},{0x80|value},{0x80|value},{0x80|value},...,{0x80|value},{0x80|value}]

или

[{0x80|value},{0x80|value},{0x80|value},...,{0x80|value},{0x80|value},{0x80|value},{0x00|value},{0x00|value},{0x00|value},...,{0x00|value},{0x00|value}]

Затем вы считываете первый и последний байт, и если старший бит равен, вы берете последнее значение.

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

,

0

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

Для каждых 16 бит я бы использовал 13 для счетчика и 3 для значения. Счетчик, будучи 13 битами, может считать от 0 до 2^13-1 или от 0 до 8191. 3 бита значения могут хранить 0 - 2^3-1 или от 0 до 7, что вполне подходит для вашего значения 0-4.

Размер счетчика важен, так как он более чем вдвое превышает количество 16-битных пар в EEPROM. Если предположить, что EEPROM объемом 1 кБ содержит 512 16-битных значений, то вам нужно, чтобы в вашем счетчике было доступно более 1024 значений (если вы хотите изменить разделение для хранения большего числа...).

Алгоритм прост:

  1. Прочитать EEPROM, просматривая следующее значение счетчика. Если счет увеличивается более чем на 1, то последнее прочитанное значение является текущим.
  2. Если счет идет от 8191 до 0, то продолжайте, вы просто зациклились, вот и все.
  3. Увеличьте счетчик на 1 и запишите в EEPROM адреса, где счетчик увеличился более чем на 1.

Например, если у вас есть:

78 1
79 2
80 3
8191 7
8191 7
8191 7

Вы знаете, что пространство после 80 не используется (0xFFFF разделено на 0x1FFF и 0x7), поэтому вы записываете в него «81 4».

Другой:

8190 2
8191 3
0 4
1 0
2 1
7283 3
7284 4
7285 0

Переход от 8191 к 0 — это просто циклический переход, который можно считать последовательным. Однако переход от 2 к 7283 не является последовательным, поэтому вы можете перезаписать запись 7283 на «3 2».

Если при записи вы выходите за пределы области памяти EEPROM, вы просто снова возвращаетесь к началу.

Это дает вам 512 * 100 000 записей или 51,2 млн записей.

,

0

Также проверьте, что значения, которые вы хотите записать, действительно меняются. Нет смысла стирать и записывать значение, которое уже есть. И вы экономите 3,3 мс, не выполняя запись.

,