В этой статье я хочу представить и вкратце описать члена семейства ОС реального времени — 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 можно назвать поддержку достаточно широкого спектра архитектур.
Официально поддерживаемые архитектуры: ARMv6(LPC1x, STM32), ARMv7(LPC2x), 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 suiten");
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.
Спасибо за внимание.
Автор: niamster