14.2. Поставка приложения

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

14.2.1. Контрольный список перед запуском

Прежде чем камера покинет стенд, вот краткий список того, что должно быть верным:

  • Код приложения находится в сборке, а не в файловой системе. Замороженные модули и образ ROMFS покрывают код и ресурсы. Хранилище флеш-памяти и SD-карты предназначено только для состояния времени выполнения и файлов журналов. Конечный пользователь не может редактировать, удалять или заменять приложение без перепрошивки.

  • Сторожевой таймер работает непрерывно. machine.WDT запускается в начале main.py и подкармливается один раз за итерацию основного цикла. Любое зависание дольше настроенного тайм-аута вызывает аппаратный сброс, и камера снова запускается.

  • Приложение ведёт журнал в восстанавливаемое место назначения. Библиотека logging записывает записи с уровнем, отметкой времени и местом назначения, которое в полевых условиях можно восстановить с SD-карты. print() предназначен только для времени разработки – его место назначения по умолчанию – стандартный вывод USB, который не читает ни один готовый к поставке продукт.

  • Флеш-память и SD рассматриваются как способные дать сбой. Внутренняя флеш-память хранит небольшие записи фиксированного размера (конфигурацию, последнюю известную калибровку); SD хранит объёмные файлы переменного размера (захваченные изображения, файлы журналов); операции с любым из них обёрнуты в обработку ошибок, и приложение имеет определённый запасной вариант, когда любое из них недоступно.

14.2.2. Встраивание приложения в сборку

Два взаимодополняющих механизма помещают файлы в образ прошивки: