Операционная система реального времени ChibiOS

ChibiOS/RT — компактная многозадачная операционная система реального времени (ОСРВ) для встроенных систем. Распространяется под модифицированной лицензией GPLv3.

Краткое описание системы на домашней странице проекта гласит:

ChibiOS/RT предназначена для встраиваемых систем реального времени и где важное требование для выполняемых приложений — это эффективность и компактный код. Данная ОС РВ характеризуется высокой мобильностью, маленьким объёмом и, в основном, по своей архитектуре оптимизирована для чрезвычайно эффективного переключения между задачами.

Лицензия

В первую очередь про лицензирование. ChibiOS является свободной RTOS и имеет несколько вариантов лицензирования — GPL 3.0, GPL 3.0 c некоторыми исключениями при линковке и коммерческую лицензию.
Код драйверов в большинстве случаев идет под лицензией Apache-2.0.
Со всеми вариантами лицензирования можно ознакомиться на сайте проекта. Представленные варианты должны полностью удовлетворить любителей, а также компании, которые не хотят платить за использование данной операционной системы.

Структура

Проект логически разделен на несколько подсистем:

  • HAL прослойка с реализацией драйверов под различные устройства,
  • базовые функции ядра под определенную архитектуру(обслуживание прерываний, переключение контекста и т.д.),
  • код самого ядра операционной системы.

В приложение ко всему есть несколько надстроек над этим всем делом.
Сама ChibiOS реализована на C и ассемблере но есть также обертки для C++.

Ядро

ChibiOS, как и любая другая уважающая себя RTOS имеет планировщик задач с поддержкой вытеснения и на данный момент имеет два варианта функционирования:

  • кооперативное распределение времени между задачами с одним приоритетом
  • Round-Robin планирование задач с одинаковым приоритетом с указанием кванта времени на задачу

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

В текущей версии ChibiOS(2.x) период системного таймера фиксирован(на этапе сборки).
В будущей версии(3.0) разработчики планируют перейти к функционированию ядра без периодических прерываний(tickless scheduler).

Само ядро предоставляет базовые элементы синхронизации(mutex, semaphore), управления памятью(heap, mempool), разнообразные примитивы управления очередями(включая mbox и events) и конечно средства управления задачами.
В ChibiOS есть возможность создавать задачи как статически, так и динамически.

Устройства и архитектуры

Примечательной особенностью ChibiOS можно назвать поддержку достаточно широкого спектра архитектур.
Официально поддерживаемые архитектуры: ARMv6(LPC1x, STM32), ARMv7(LPC2x), STM8, PPC, MSP430, MegaAVR.
Из неофициальных можно отметить Mips32(qemu, pic32mx), AVR32, Coldfire и NiosII.
В базовый набор драйверов из HAL входит достаточно широкий спектр периферии: ADC, CAN, DMA, TMR, I2C, I2S, ICU, GPIO, PWM, RTC, SPI, UART, USB. В общем, практически все общераспространенные компоненты современных SoC.
В HAL дополнительно присутствует несколько надстроек над вышеперечисленными компонентами(USB ACM, MMC/SPI и другие), которые я бы вынес за пределы этого слоя. Но так, видимо, сложилось исторически.

Мелочи

Из «плюшек» можно выделить возможность подключение uIP, lwIP и FATFS(реализация от некоего г-на ChaN).
Так же есть достаточно удобный в использовании shell — мелочь, а приятно.

API большинства подсистем достаточно прост и читабелен(особенно ядра), хотя в некоторых случаях без примера не обойтись.
Иногда расстраивает зависимость API некоторых драйверов от платформы под которую изначально разрабатывался драйвер, но насколько я понял, драйвера не являются главным приоритетом ОС и разрабатываются кустарно под текущую задачу. Местами попадаются плотные скопления дублированного кода.
Из особо слабых сторон я бы отметил конфигурирование системы макросами(набор драйверов, особенности функционирования подсистем и т.д.). Это достаточно усложняет поддержку out-of-tree проектов при удалении или добавлении тех или иных опций в mainstream.