Astra Trainer
Индустрии будущего

Программу, которую нельзя починить во вторник

Aleksandr Mikhailov
Founder, Astra Trainer
Обновлено
9 мин чтения

У прикладного ПО довольно комфортные отношения с ошибками. Что-то ломается, пишется исправление, и оно выходит уже к вечеру.

Другой набор правил

Встраиваемое ПО живёт внутри продукта. Контроллер двигателя, медицинский инфузионный насос, автомобиль, термостат, спутник, заводской датчик. Правила меняются четырьмя способами, и каждый из них определяет то, как строится работа.

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

Ресурсы ограничены и малы. Во многих продуктах — килобайты, а не гигабайты. Динамическое выделение памяти часто запрещают прямым текстом, потому что на отказ выделения нет приемлемой реакции, а фрагментация за годы непрерывной работы непредсказуема.

Дедлайны реальны. Пропустить один — значит, возможно, неверно скомандовать двигателем, дестабилизировать контур регулирования или не сработать функции безопасности.

Отказ физичен. Когда падает прикладная программа, она показывает сообщение. Когда падает встраиваемая — что-то движется, нагревается или останавливается.

Эту дисциплину определяет не язык программирования. Её определяет невозможность передумать потом.

Что входит в это направление

Охват: микроконтроллеры, разработка прошивок, операционные системы реального времени, интерфейсы между железом и ПО, драйверы устройств и встраиваемая безопасность.

Четыре области.

Взаимодействие с железом. Регистры, периферия, прерывания, шины связи и чтение документации на компоненты, которое всё это сопровождает.

Архитектура прошивки. Циклы без операционной системы, операционные системы реального времени, разбиение на задачи и решения по планированию, которые за этим стоят.

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

Жизненный цикл. Механизмы обновления, безопасность, диагностика и долгосрочное сопровождение.

«Реальное время» — это дедлайны, а не скорость

Этот термин постоянно понимают неправильно. «Реальное время» — это не утверждение о производительности. Это утверждение о предсказуемости.

Система жёсткого реального времени обязана завершить заданное действие до заданного дедлайна — каждый раз без исключения. Средняя производительность не имеет значения. Система, которая в среднем отвечает за пятьдесят микросекунд, а раз в час — за пять миллисекунд, не «в основном быстрая». Она раз в час отказывает.

Из этого следуют три понятия, которые и составляют ядро дисциплины.

Время выполнения в худшем случае. Не типичное, не измеренное на обычном прогоне. Максимально возможное время, при котором каждое ветвление пошло неудачно, каждое обращение к кэшу промахнулось, а каждое прерывание пришло в самый неподходящий момент. Проектирование ведётся именно от этого числа.

Задержка и джиттер прерываний. Сколько времени проходит, прежде чем система отреагирует на внешнее событие, и насколько это время колеблется. В задачах управления джиттер важен не меньше задержки, потому что контур регулирования рассчитывает на фиксированный интервал дискретизации и деградирует, если его не получает.

Приоритеты и планирование. Что запускается, когда готово сразу несколько задач, и что происходит, когда задача с низким приоритетом удерживает ресурс, нужный задаче с высоким приоритетом. Такая ситуация — инверсия приоритетов — становилась причиной реальных, хорошо задокументированных сбоев в поставленных системах, и механизмы, которые её предотвращают, существуют именно потому, что проблема неочевидна.

Ошибки, которые встречаются только во встраиваемой разработке

Категория сбоев, с которой прикладные разработчики почти не сталкиваются, а встраиваемые инженеры — постоянно.

Гонки состояний с прерываниями. Основной код и обработчик прерывания обращаются к одной переменной, а прерывание случается между чтением и записью. Проявляется раз на десять тысяч запусков и пропадает, стоит добавить отладочную печать.

Переполнение стека. Во многих небольших системах нет защиты памяти, так что стек тихо разрастается поверх других данных, а симптом проявляется где-то совсем в другом месте, гораздо позже.

Повреждение памяти. Ошибка указателя или переполнение буфера портит данные, принадлежащие совершенно другой подсистеме, — и место сбоя не имеет ничего общего с его причиной.

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

Гейзенбаги. Ошибки, которые исчезают под отладчиком, потому что его подключение меняет тайминг, который их и вызвал.

Практическое следствие в том, что отладка встраиваемых систем опирается на инструменты, которые наблюдают, не вмешиваясь: аппаратная трассировка, логические анализаторы, осциллографы и измерительные схемы, заложенные в сам продукт. Умение читать сигнал на осциллографе — это не ностальгия. Часто это единственный способ увидеть ошибку.

Место направления в домене

«Встраиваемые системы и компьютерное железо» — пятое из девяти направлений в домене полупроводников, электроники и квантовых технологий Astra Trainer. Оно парно связано с инженерией электроники, ведь почти на каждой плате есть прошивка, а эти две роли делят границу, через которую часто спорят, — и с проектированием чипов, где в проектах «система на кристалле» нужно одинаково свободно владеть обеими сторонами.

Оно также выходит на робототехнику, где уровень управления — встраиваемый, на передовое производство — для промышленного управления, и на медицину и медтех, где устройства несут регуляторные обязательства. Посмотреть все девять направлений можно здесь.

Выпуск продукта — это начало десятилетнего обязательства

Промышленный датчик, медицинское устройство, транспортное средство или элемент инфраструктуры здания будут находиться в эксплуатации десятилетие и дольше. Если устройство подключено к сети, весь этот период — это зона риска.

Три проблемы, которые отличают встраиваемую безопасность от серверной, и ни у одной из них нет простого решения.

Обновление — сложное и рискованное дело. Устройства могут быть недоступны по сети, работать от батареи, иметь ограниченную пропускную способность или быть физически недосягаемыми. Обновление, прервавшееся на середине, может вывести устройство из строя — для одних продуктов это выезд специалиста, для других — прямая потеря. Безопасное, возобновляемое, проверяемое обновление — это проектная задача, которую нужно решить до выпуска первого экземпляра, потому что добавить это задним числом к устройствам, уже работающим в поле, нельзя.

Криптография должна прослужить долго. Ключи и алгоритмы, выбранные сегодня, останутся в устройствах на весь срок службы. Именно здесь это направление встречается с квантовой связью, сенсорикой и безопасностью, и ответ — криптографическая гибкость: проектировать так, чтобы алгоритм можно было заменить, а не считать первый выбор постоянным.

Обязательство всё больше становится юридическим. В нескольких юрисдикциях уже введены требования к подключённым продуктам, включая запрет на универсальные пароли по умолчанию, обязательное раскрытие того, как долго будут выходить обновления безопасности, и процессы сообщения об уязвимостях. Детали различаются по рынкам и меняются, но направление движения устойчиво: поддержка безопасности превращается в заявленное обязательство с конкретным сроком, а не в вопрос доброй воли.

Роли по именам

Инженеры встраиваемого ПО. Широкая роль.

Инженеры по прошивкам. Ближе всего к железу.

Разработчики драйверов устройств.

Инженеры систем реального времени — для критичных по времени задач и задач управления.

Инженеры встраиваемого Linux — отдельная специализация, отличная от работы с микроконтроллерами.

Инженеры по интеграции железа и ПО — запускают новые платы в работу.

Инженеры встраиваемой безопасности. Безопасная загрузка, работа с ключами, инфраструктура обновлений.

Инженеры по функциональной безопасности — для автомобильных, промышленных и медицинских систем.

Инженеры по тестированию и валидации встраиваемых систем, включая испытания с аппаратурой в контуре.

Кого можно переобучить

Разработчики прикладного ПО. Самый крупный резерв. Они приносят структурность, дисциплину работы с инструментами и привычку к системам контроля версий, которых часто не хватает встраиваемым командам. Целенаправленно нужно преподать модель железа: регистры, прерывания, тайминг и то, почему к динамическому выделению памяти относятся с подозрением.

Техники и инженеры-электронщики. Переход с другой стороны — у них уже есть интуиция по железу, не хватает структурности в программировании.

Специалисты по промышленному управлению и автоматизации. Программисты программируемых логических контроллеров уже понимают поведение реального времени, детерминированное сканирование и промышленные ограничения.

Инженеры по тестированию. Переходят в валидацию и испытания с аппаратурой в контуре.

ИТ- и сетевые инженеры. Переходят в работу с подключёнными устройствами и встраиваемую безопасность, где знание протоколов переносится, а понимание ограничений ресурсов — нет.

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

Функциональная безопасность и регулируемые устройства. Встраиваемое ПО в медицинских устройствах, транспортных средствах, авиации, промышленном оборудовании и системах, связанных с безопасностью, регулируется обязательными стандартами и режимами с требованиями к процессу разработки, документации, верификации и контролю изменений. Уровни полноты безопасности присваиваются через формальную оценку, а сертификацию выдают компетентные органы. Обучение формирует инженерную компетентность и понимание того, где применяются эти обязательства. Оно не даёт сертификации, статуса эксперта по безопасности или права выпускать ПО в регулируемый продукт.

Что важно запомнить

Встраиваемую работу определяют ограничения, а не язык программирования. Неизменное железо, малая память, жёсткие дедлайны и долгий срок службы.

«Реальное время» означает соблюдение дедлайна каждый раз. Имеет значение время выполнения в худшем случае, а не среднее.

Характерные ошибки — это сбои тайминга, параллелизма и памяти, которые прячутся от отладчиков, поэтому центральную роль сохраняют инструменты аппаратного наблюдения.

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

А два лучших источника новых встраиваемых инженеров приходят с противоположных сторон: разработчики прикладного ПО, которым не хватает модели железа, и техники, которым не хватает структурности в программировании.

Часто задаваемые вопросы
Что на самом деле означает «реальное время»?

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

Почему во встраиваемых системах избегают динамического выделения памяти?

Потому что выделение может завершиться неудачей, а приемлемой реакции на этот отказ часто нет, а также потому что фрагментацию памяти за годы непрерывной работы трудно предсказать. Многие проекты вместо этого выделяют память статически при запуске.

Почему ошибки во встраиваемых системах так трудно воспроизвести?

Потому что многие из них зависят от тайминга. Гонки прерываний, переполнение стека и повреждение памяти дают симптомы, далёкие от причины, а подключение отладчика меняет тайминг, который их и создал.

Почему встраиваемую безопасность нужно проектировать заранее?

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

Могут ли разработчики прикладного ПО перейти во встраиваемую разработку?

Да, и они приносят полезную структурность и дисциплину работы с инструментами. Пробел, который нужно закрыть целенаправленным обучением, — это модель железа: регистры, прерывания, поведение во времени и ограничения ресурсов.

Закройте разрыв между платой и кодом
Девять направлений в полупроводниках, электронике и квантовых технологиях, включая встраиваемые системы и компьютерное железо наряду с инженерией электроники, проектированием чипов и квантовой безопасностью. Программа собирается вместе с вашими командами, в уроках по пять минут.