
В этой статье я хочу представить и вкратце описать члена семейства ОС реального времени — ChibiOS.
Лицензия
В первую очередь про лицензирование. 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 можно назвать поддержку достаточно широкого спектра архитектур.
Официально поддерживаемые архитектуры: ARMv5-7(LPC1x, LPC2x, STM32), STM8, PPC, MSP430, MegaAVR.
Из неофициальных можно отметить Mips32(qemu, pic32mx), AVR32, Coldfire и NiosII.
Конечно, этот список не может тягаться с FreeRTOS, но на личном опыте скажу, что добавлять новую архитектуру не так тяжело, как может показаться.
В базовый набор драйверов из 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 некоторых драйверов от платформы под которую изначально разрабатывался драйвер, но насколько я понял, драйвера не являются главным приоритетом ОС и разрабатываются кустарно под текущую задачу. Местами попадаются плотные скопления дублированного кода.
Вроде как планируется вынести весь HAL в отдельный репозиторий. Также есть потенциальная опасность того, что в будущих версиях ChibiOS HAL перепишут на С++.
Из особо слабых сторон я бы отметил конфигурирование системы макросами(набор драйверов, особенности функционирования подсистем и т.д.). Это достаточно усложняет поддержку out-of-tree проектов при удалении или добавлении тех или иных опций в mainstream.
Есть некоторые дизайнерские решения которые мне не по-душе, но, возможно, это личное предпочтение.
Пример
И на затравку небольшой пример инициализации системы и создания shell. Код представлен без комментариев умышленно.
#include "ch.h" #include "hal.h" #include "shell.h" #include "chprintf.h" static void oNotifySD1(GenericQueue *qp) { msg_t b; b = sdRequestDataI(&SD1); if (b != Q_EMPTY) sd_lld_putc(&SD1, b); } #define SHELL_WA_SIZE THD_WA_SIZE(1024) static void cmd_test(BaseSequentialStream *chp, int argc, char *argv[]) { chprintf(chp, "ChibiOS test suite\n"); TestThread(chp); } static const ShellCommand shCmds[] = { {"test", cmd_test}, {NULL, NULL} }; static const ShellConfig shCfg = { (BaseSequentialStream *)&SD1, shCmds }; int main(void) { Thread *sh = NULL; halInit(); chSysInit(); { const SerialConfig sc = { .sc_baud = SERIAL_DEFAULT_BITRATE, .sc_rxirq = EIC_IRQ_UART1_RX, .sc_port = _UART1_BASE_ADDRESS }; sdObjectInit(&SD1, NULL, oNotifySD1); sdStart(&SD1, &sc); } shellInit(); for (;;) { if (!sh) sh = shellCreate(&shCfg, SHELL_WA_SIZE, NORMALPRIO); else if (chThdTerminated(sh)) { chThdRelease(sh); sh = NULL; } chThdSleepMilliseconds(1000); }
Чуть не забыл упомянуть, что главой и диктатором проекта является г-н Giovanni Di Sirio.
И конечно ссылка на сайт: ChibiOs.
Спасибо за внимание.
