ChibiOS: легковесная RTOS

в 7:22, , рубрики: ChibiOS, embedded systems, rtos, операционные системы, Песочница, Программинг микроконтроллеров, метки: , ,

ChibiOS: легковесная RTOS
В этой статье я хочу представить и вкратце описать члена семейства ОС реального времени — 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

Источник

Поделиться

* - обязательные к заполнению поля