Может ли отключение питания повредить программное обеспечение?

При отключении источника питания устройства, которое записывает некоторые данные "A" на SD-карту, могут быть повреждены и другие данные "B". (Это подробно описано здесь.)

Что касается проектов Arduino без SD-карты, можно ли в любое время отключать источник питания микроконтроллеров Arduino, потому что память внутри них использует технологию, отличную от SD-карт (каковы названия или различия соответствующих технологий)?

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

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

, 👍2


1 ответ


Лучший ответ:

2

Сначала нам нужно рассмотреть различные технологии памяти в микроконтроллере:

  • Сначала у вас есть флэш-память. Именно здесь сохраняется программа, но ее также можно использовать для хранения пользовательских данных. На ардуино на основе AVR он может быть написан только во время программирования или с помощью загрузчика. Но платы, подобные различным ESP, также могут иметь небольшую файловую систему. Здесь вы можете столкнуться с проблемами с потерей питания во время выполнения операций записи.
  • Оперативная память содержит текущее значение всех переменных. Но он также всегда теряет все данные, когда не работает. Это нормальное поведение, потому что это изменчивая память. Потеря мощности здесь ничего не изменит.
  • Это оставляет нам EEPROM, энергонезависимый тип памяти. Вы можете повредить свои данные с потерей питания во время операций записи.

Затем нам нужно взглянуть на структуры данных. Большая часть памяти в ардуино и аналогичных платах организована в виде простого массива байтов. EEPROM обычно обрабатывается таким образом. Если вы пишете структуру данных и в течение этого времени теряете питание, вы должны рассматривать эту структуру данных как поврежденную (например, при записи строки из 20 символов, но при записи 6-го байта отключается питание). Другие данные не пострадают. С другой стороны, когда вы используете файловую систему во flash, например, SPIFFS, действие записи в файл также включает обработку таблицы файловой системы. Сбой во время обработки таблицы может привести к нарушению целостности вашей файловой системы, а следовательно, и к повреждению других файлов.

SD-карты-это особый случай, поскольку их внутренние контроллеры перемещают данные по какому-то неизвестному алгоритму для реализации выравнивания износа. Это не делается со стандартными микроконтроллерами (при необходимости вам придется реализовать это самостоятельно). Фактическая технология памяти также является просто флэш-памятью, но вы не хотите беспокоить SD-карту, пока она обрабатывает алгоритм уровня износа. Это может полностью повредить SD-карту. Также в связанном ответе говорится о SD-карте Raspberry Pi, на которой работает полная ОС. Запуск операционной системы требует гораздо большего количества изменяющихся энергонезависимых данных, чем обычно требуется микроконтроллеру. Так что у него гораздо меньше шансов столкнуться с теми же ситуациями с микроконтроллером.

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

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

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

,

TL;DR Если скетч не записывается в энергонезависимую память, его можно безопасно отключить в любой момент., @Edgar Bonet

Спасибо! Что касается "Отключения во время обработки таблицы [файловой системы]": я предполагаю, что "обработка" означает запись. Итак, если я хочу регулярно записывать некоторые данные A1, A2, A3 и избегать повреждения существующих данных "B", хорошо ли выделять один большой пустой файл "A" и регулярно записывать в него данные (что-то вроде "файловой системы в файловой системе") вместо регулярного создания нескольких небольших файлов?, @root