В качестве примера разработки bare-metal прошивки приведем наш
проект графического калькулятора. Это достаточно простое устройство, в котором нет большого количества сложных и параллельных задач. Сама логика его работы отлично ложится на парадигму суперцикла. Написание встроенного ПО на RTOS было бы излишне трудозатратным и замедлило бы проект. Выбор bare metal позволил ускорить работу и облегчить отладку. В результате проект потребовал меньше переделок, что снизило стоимость разработки.
Почти весь функционал калькулятора представляет собой повторяющиеся задачи, которые реализованы в суперцикле. При запуске микроконтроллер настраивает периферию. В основном цикле устройство сбрасывает сторожевые таймеры, обновляет состояние светодиодов, опрашивает модуль измерения уровня заряда батареи. Большую часть времени микроконтроллер остается в режиме ожидания для экономии батареи. Раз в 1 мс он просыпается и повторяет основной цикл. В нем же выполняется “математическая” логика.
Две задачи в прошивке вызываются по времени, используя аппаратный таймер на микроконтроллере. Раз в 10 мс устройство опрашивает клавиатуру. При регистрации нажатия программа обновляет экран калькулятора, чтобы отобразить на нем изменения. В данном случае было проще и надежнее реализовать регистрацию нажатий через опрос: скорость МК позволяла не бояться задержек. Кроме того, раз в 33 мс микроконтроллер обновляет экран независимо от того, были ли нажаты какие-либо клавиши.
Таким способом мы разбиваем один бесконечный суперцикл на несколько логических задач, которые запускаются не каждый цикл, а лишь периодически по таймеру. При этом нет необходимости использовать настоящую RTOS.
Кроме того,
работа с USB реализована через прерывание. Когда по USB приходит пакет данных, вызывается обработчик, который складывает пакет в специальный статический буфер. Сам буфер обрабатывается в основном цикле, что позволяет быстро освободить USB для приема следующего пакета. Протокол взаимодействия с ПК синхронный, что позволяет избежать переполнения приемного буфера USB.
Если вы
обращаетесь к команде со своим проектом, важно еще на старте обсудить возможность миграции на новые аппаратные платформы. Приложения на RTOS переносить легко, но в bare-metal прошивке такую возможность необходимо предусмотреть заранее.
Так, когда проект графического калькулятора начинался, в качестве микроконтроллера мы выбрали GD32F470. На тот момент он представлял из себя наилучшее соотношение цены и качества. Однако функционал калькулятора с тех пор значительно расширился, и сейчас на нем не хватает памяти. GD32 с нужными нам характеристиками отсутствует в продаже, поэтому мы обсуждаем с заказчиком миграцию на STM32. Такую возможность мы предусмотрели еще на старте проекта, поэтому
разделили встроенное ПО устройства на две части. Одна отвечает за бизнес-логику, а другая – за работу с аппаратным обеспечением. Таким образом, для миграции на новый МК достаточно переписать лишь ту часть, которая отвечает за работу с “железом”. Такая архитектура также позволяет без проблем поддерживать обе версии прибора, а также реализовать эмулятор графического калькулятора на ПК и Web.