В этой статья я бы хотел перечислить и обсудить некоторые общие системные поведенческие атрибуты хорошего firmware (прошивки) для микроконтроллерных проектов, которые не зависят от конкретного приложения или проекта. Некоторые атрибуты могут показаться очевидными однако в 9 из 10 российских embedded компаний нет ни одного из перечисленных атрибутов.
1. Сторожевой таймер
Прошивка может зависнуть при некорректных входных данных. Сторожевой таймер позволяет автоматически перезагрузиться и устройство не останется тыквой.
2. Загрузчик
Программатор есть не всегда. Программатор часто не видит микроконтроллер из-за статического электричества или из-за длинного шлейфа. Часто программатор в одном единственном экземпляре на всю компанию. Загрузка программатором это чисто developer(ская) прерогатива. У Customer нет и не будет отладчика и особого шлейфа для него. Загрузчик по UART позволит записать новый артефакт на дешевом переходнике USB-UART. Также загрузчик позволит наладить DevOps и авто-тесты внутри компании. В идеале загрузчик должен уметь загрузить бинарь по всем доступным интерфейсам которые только есть на плате (PCB).
3. Файловая система NorFlashFs
Энергонезависимая Key-Value Map(ка). Есть десятки способов ее реализовать. Файловая система для хранения многочисленных параметров: IPадреса, TCP порты, счетчик загрузок, наработки на отказ, настройки трансиверов, серийные номера и прочее. Это позволит не настраивать устройство заново каждый раз после пропадания питания и не плодить зоопарк прошивок с разными параметрами. Устройство всегда можно будет до-программировать уже в run-time(е).
4. Модульные тесты
Тесты позволяют делать безопасный рефакторинг, локализовать причины сбоев. Код тестов должен быть встроен прямо внутрь кода прошивки. По крайней мере для Debug сборок. Тесты можно запускать как при старте питания так и по команде из CLI.
5. Health Monitor (HM)
Это отдельная задача, поток или периодическая функция, которая просто периодически проверяет все компоненты, счетчики ошибок и в случае, если возникли какие-то ошибки , HM как-то сообщает об этом пользователю. HM должен работать непрерывно. Например при ошибке посылает красный текст в UART-CLI а при предупреждении -желтый текст. Health монитор повысит надежность изделия в целом и позволит найти ошибки, которые пропустили модульные тесты.
6. Full-Duplex Command Line Interface (CLIшка)
Наверное самое полезное. Это интерфейс командной строки поверх UART. Как в Linux только в случае с микроконтроллером. Это чтобы общаться с устройством на человеческом языке. Запрос-ответ. С помощью CLI можно запускать модульные тесты софта и железа, просматривать куски памяти, отображать диагностические страницы, управлять GPIO, пулять пакеты в SPI, UART, I2C, 1Wire, I2S, SDIO, CAN, испускать PWM ки, включать/выключать таймеры. CLI для тотального управления гаджетом.
С помощью CLI вы сможете до-программировать поведение устройства уже после записи самой прошивки во Flash. Можно хранить CLI-скрипты на SD карте и запускать из как *.bat файлы. Подобно тому как в OS устанавливает и запускает утилиты. Просто подключившись к UART через TeraTerm/Putty и отправив несколько команд. А без этого вам бы пришлось варить еще кучу сборок с какой-то специфической функцией на 1 раз. А потом поддерживать зоопарк проектов. Когда есть CLI(шка) и команды установки уровней логирования и чтения памяти по адресу, то отпадает даже необходимость в пошаговой отладке по JTAG.
7. Диагностика
У каждого компонента есть внутренние состояния: Black-Box Recorder, режимы микросхем, драйверов, какие-то конкретные переменные: up-time счетчики, дата, время сборки артефакта, версия, ветка, последний коммит. Всё это надо просматривать через CLIшку. Для этого и нужна подробная диагностика.
8 Аутентификация бинаря
Рано или поздно придется защищать гаджет от того чтобы на него не накатили чужеродный софт и не превратили его в BotNet. Можно поставить внешний сторожевой таймер и он будет сбрасывать прошивки, которые не догадываются о реальной схемотехнике. А можно добавить в загрузчик Decrypter, который будет записывать только тот артефакт, который после расшифровки содержит валидную контрольную сумму и подпись.
9 Black-Box Recorder
У него много имен: черный ящик. LogBook, BlackBox, Прошивка может записывать логи не только в UART(который может никто не смотреть) но и в NorFrash или SD карту. Если организовать циклический массив-строк на N-записей, то можно записывать, например, последние M минут работы. Лог сообщения с TimeStamp(ами). А затем можно делать post-processing логов для расследования инцидентов.
Вывод
Как по мне эти 9 атрибутов являются просто джентльменским набором любого разработчика. Своего рода коробочка в которую можно положить любой функционал. Если вам есть что добавить к изложенному списку, то предлагаю обсудить этот в комментариях.
Автор:
aabzel