ОПЕРАЦИОННЫЕ СИСТЕМЫ РЕАЛЬНОГО ВРЕМЕНИ И BARE-METAL ПРОГРАММИРОВАНИЕ
ОПЕРАЦИОННЫЕ СИСТЕМЫ РЕАЛЬНОГО ВРЕМЕНИ И BARE-METAL ПРОГРАММИРОВАНИЕ
Смыслов Сергей Михайлович
инженер-программист, АО”766 УПТК”,
РФ, г. Красногорск
REAL-TIME OPERATION SYSTEM AND BARE-METAL PROGRAMMING
Sergei Smyslov
Software engineer, JSC "766 UPTK",
Russia, Krasnogorsk
АННОТАЦИЯ
В данной статье дается описание принципов работы операционных систем реального времени и сравнение подходов с bare-metal программированием.
ABSTRACT
This article describes the principles of real-time operating systems and compares approaches with bare-metal programming.
Ключевые слова: микроконтроллеры, операционные системы реального времени, ОСРВ, программирование, время выполнения, объем памяти, программное обеспечение.
Keywords: microcontrollers, real-time operating systems, RTOS, programming, execution time, memory capacity, software.
Введение
При программировании микроконтроллеров существует 2 основных подхода к программированию - bare-metal также называемое программированием на голом железе и подход с использованием операционных систем реального времени (ОСРВ) (на английском real-time operating systems (RTOS)).
В настоящее время в связи с появлением мощных микроконтроллеров, которые все больше становятся похожими на одноплатные компьютеры крайне популярными становятся ОСРВ, но к сожалению данный подход таит в себе некоторые минусы, в рамках данной статьи постараюсь дать описание, сравнение и рекомендации по выбору архитектуры ПО.
Прежде чем перейдем к описанию принципов работы следует сделать уточнение - в настоящее время существует 2 типа ОСРВ:
1- ОСРВ “жесткого реального времени”, в данных системах применяются дополнительные механизмы для квантования по времени и разделению ресурсов, данные системы применяются обычно в авиации/космических аппаратах/военной технике.
2- ОСРВ “мягкого времени”, большая часть из них используется в коммерческих проектах например FreeRTOS.
В рамках статьи рассматриваются операционные системы “мягкого времени” как наиболее массовые, со свободным доступом.
Описание принципов работы:
Рассмотрим традиционное программирование (bare-metal) - в рамках данного подхода контроллер представляет собой единое адресное пространство и единую (непрерывную) программу с четко выраженной структурой и предсказуемым результатом.
Если рассматривать изначальный подход, то это был 1 файл и функция main в которой вызывались другие функции/методы.
Со временем в связи с развитием электроники и появления огромного количества периферии (таймеры, контроллеры прямого доступа к памяти и вектора прерываний) код стал "активно" ветвиться, появилась возможность обработки событий “независимо” от течения основной программы, на самом деле происходит прерывание основной программы и выполнения фрагмента кода из обработчика прерывания и как таковой параллельности кода нет, но главный принцип в виде основной функции и единого адресного пространства и предсказуемости кода остался.
Дальнейшее развитие идеи параллелизма кода привело к созданию операционных систем реального времени, в рамках которых отказались от использования одной функции main и перешли к нескольким функциям, переключаемым по таймеру. Стоит отметить, что функции могут выполнять длительные действия, и не уложится во время отведенное таймером на задачу, поэтому используется планировщик (scheduler) который сохраняет при выходе и подгружает при входе в задачу адрес текущей инструкции и переменные.
Отдельной особенностью стоит отметить легкое создание дополнительных копий параллельных задач.
На основе на основе описания принципов работы сформируем описание - сравнение особенностей для каждого из них.
Традиционное (bare-metal) программирование
Минусы – большие исполняемые функции (функция main), отсутствие (традиционными) способами создать обработчик для нового события.
Плюсы – максимальное быстродействие и минимальный объем кода.
Операционные системы реального времени:
Минусы – затраты на планировщик, выделение таймера, плохо предсказуемый код (мы не можем гарантировать время между вызовами задач), т.к. задачи асинхронны – необходимы механизмы передачи информации между задачами.
Плюсы – более простой код в рамках одного потока/задачи, возможность простого увеличения числа задач за счет использования копий в динамической памяти.
Рекомендации по выбору подхода:
Я не являюсь рьяным приверженцем какого-либо подхода и в работе мне приходилось использовать оба из них, на основе накопленной статистики и практики у меня появились следующие рекомендации:
Традиционное (bare-metal) программирование разумнее использовать для:
1-”маленьких” микроконтроллеров (старые AVR, STM8, STM32F0/STM32F1)
2-для критичных ко времени приложений, только в bare-metal программирование можно получать время обработки и отклика в микро/милли секунды, в ОСРВ это сделать намного сложнее
3-для критичных к предсказуемости приложений (например вооружение/безопасность), за счет единого адресного пространства и последовательного кода шанс неопределенного поведения снижен.
4-при наличии аппаратных ограничений (переход от ОСРВ к bare-metal освобождает немалое количество памяти и таймер)
Операционные системы реального времени разумнее использовать для:
1-систем с пониженным энергопотреблением (можно отслеживать число задач и погружать микроконтроллер в сон)
2-при использовании с системами умного дома/wifi т.к. число датчиков→число задач может изменяться и чаще всего они не критичны ко времени
3-для распределённых систем, когда мощный микроконтроллер по ряду причин (из-за периферии например) выполняет функции одноплатного компьютера/сервера в этом случае использование ОСРВ сэкономит время на разработку кода.
Список литературы:
- Электронный ресурс посвященный ОСРВ FreeRTOS URL: https://www.freertos.org/
- Б.В. Керниган, Д.М. Ритчи. : “Язык программирования C”, Вильямс, 2019г.