Комментарии 33
А на С++ можно сделать, чтобы запись была очень юзерфрендли, без знания секторов и адресов EEPROM
myCounter.Set(newValue);
тут вот описал https://habr.com/ru/post/561678/
EEPROM (раньше по крайней мере) ещё жрала при записи много, да и экзотика это в эпоху ARM.
Еще можно записывать накопленные данные в EEPROM по приходу power down event, технически обеспечив достаточное для записи время работы контроллера после выключения питания. Делал так в одном любительском проекте.
иногда можно писать побитно. т.е. 0xFF -> 0xFE -> 0xFC -> 0xF8 -> 0xF0 -> ..., и 4096 байт превращяются в 32768 бит. раз в минуту -> 32768 минут = почти 23 дня. * 10000...
Попробуйте. При записи в ячейку возможно обнулять биты. (в единички - только стиранием).
на самом деле, первые 2-4 байта можно использовать как счетчик перезаписей (+KC), или еще один сектор использовать для записи битов количеств перезаписей основного сектора. Или чередовать секторы - на что хватит фантазии.
Согласно Миландру данный контроллер аналог STM32F103X, который имеет backup domain. Так и чухаем его регистры и по прерыванию питания сливаем в энергонезависимую. Так будет кошернее. К стати, бекап домен имеет свое питание, соответственно проблема стремится к нулю.
Надо будет опробовать ваше решение. Только батареечное питание ставить не вариант, но можно ионистор прикрутить.
Не думаю что стоит всерьез надеятся на них если требуется целостность данных больше чем несколько часов.
Внешняя микросхема eeprom или даже более дешевая serial-flash будет лучше и дешевле.
На самом то деле, что мешает держать счётчик в ОЗУ и при событии снижения питания (детектирование любым удобным способом) или просто с более длительным периодом записывать в ПЗУ?
Переменную можно разместить в неинициализируемой области (настраиваем скрипт для линкера) и перезагрузки не страшны.
Нужна лишь ёмкость по питанию чуть больше чем обычно. Можно сказать почти бесплатное решение.
Да, мы пробовали всякие супервизоры питания. В диапазоне температур -50 +50 и термоциклировании и утечек отечественных электролитов сложно говорить о надёжности супервизоров. В итоге решение периодически записывать в энергонезависимую память, тем более, что она доступна непосредственно в МК оказалось самым надёжным.
Что будет, когда счетчик переполнится?
То есть, в память уже попало максимальное значение, после включения питания вы его нашли, затем счетчик обнулился, но с этого момента прошло менее 1024 минут, требуемых на перезапись всех страниц, и аппаратуру выключили.
Пока не преодолеем 1024 минуты непрерывной работы после достижения максимального значения, учет времени вестись не будет?
Это произойдет лишь через 12 лет :)
12 лет ничто для электронной техники ИМХО. У меня дома комп 2010 года трудится, как раз 12 лет. Я бы очень опечалился, если он внезапно из-за такой мелочи превратился в тыкву.
Но всё таки нельзя исключать, что такие есть. Правда смартфоны слегка не корректное сравнение, тк на старые просто не ставятся новые приложухи и юзеры вынужденны их менять из-за этого обстоятельства.
ЗЫ айфон шесть, с которого я пишу выпускался с 14го года, у товарища есть в пользовании пятый и брал он его новым один из первых, ему уже девять лет и менять он его ни на что не хочет, говорит это последний из телефонов, следующие - одни лопаты. ))
Что касается описываемого Вами случая со счетчиком, то если даже по прошествии 12 лет работы он 10 раз подряд будет включаться на время, меньшее, чем 1024 минуты (около 17 часов), то это все равно будет слишком несущественно на фоне общего времени наработки. Если это какой-то не супер критический прибор, то я, например, считаю допустимым это.
Это не про смартфоны. Это все больше про войну.
Ага, понятно )))
- так, ребята... "науке" больше не наливать... топлива...
Немножко не понял вопроса. Страница разбита на 4 сектора по 256 4-х байтных слов. И каждый из этих секторов стирается отдельно. Т.е. для перехода на запись в следующий сектор его предварительно очищают. Когда у вас все 4 сектора заполнены происходит стирание первого сектора и переход от четвертого сектора к первому. При этом предыдущие данные сохраняются в четвертом секторе.
У вас наступает момент, когда в память записывается последнее число, которое является максимальным. После него через минуту счетчик переполняется и принимает нулевое значение, которое тоже записывается в память. Затем, допустим, оборудование до истечения (256*3+1) минут - согласен, не 1023, - выключают. Таким образом, у нас в памяти присутствует максимально возможное значение и куча всяких других.
После включения вы ищете по всем страницам наибольшее значение и оно оказывается равным максимально возможному. Через минуту снова записывается нулевое значение и т.д.. И, если после включения оборудование проработало менее (256*3+1) минут и его выключили, то максимально возможное значение осталось незатертым.
Если бы вы при переполнении (обнуления) счетчика произвели бы стирание всех страниц, то такого зазора в (256*3+1) минут, в котором не происходит подсчет моточасов, не было бы.
Может глупый вопрос, но для чего объединение включать в отдельную структуру?
typedef struct
{
union
{
...
};
} counter_value_t;
Это такой стиль или в этом есть скрытый смысл?
Реализация счетчика наработки на микроконтроллере 1986BE92QI