
この記事では、リアルタイムOSファミリーのメンバーであるChibiOSを紹介し、簡単に説明します。
免許
まず第一に、ライセンスについて。 ChibiOSは無料のRTOSであり、いくつかのライセンスオプションがあります-GPL 3.0、リンク時の一部の例外と商用ライセンス。
ほとんどの場合、ドライバーコードはApache-2.0でライセンスされています。
すべてのライセンスオプションは、プロジェクトのWebサイトで見つけることができます。 提示されたオプションは、アマチュアだけでなく、このオペレーティングシステムの使用に対して支払いを希望しない企業を完全に満足させるものでなければなりません。
構造
プロジェクトは、論理的にいくつかのサブシステムに分割されています。
- さまざまなデバイスのドライバーを実装したHALレイヤー、
- 特定のアーキテクチャ(割り込みサービス、コンテキストスイッチングなど)の基本的なカーネル機能、
- オペレーティングシステム自体のカーネルのコード。
すべてに加えて、この全体にいくつかのアドオンがあります。
ChibiOS自体はCおよびアセンブラーで実装されていますが、C ++のラッパーもあります。
コア
ChibiOSは、他の自尊心のあるRTOSと同様に、押し出しをサポートするタスクスケジューラを備えており、現在2つの機能オプションがあります。
- 優先順位が1つのタスク間の協調的な時間共有
- タスクのタイムスライスを示す同じ優先度のラウンドロビンタスクスケジューリング
この時点で、スケジューラオプションはコンパイル時にグローバルに設定されます。
コンテキストを切り替えるために、カーネルスケジューラはシステムカウンターを使用します。これは仮想タイマーにも使用されます。
当然、中断すると、必要に応じてコンテキストが切り替えられる可能性があります。
現在のバージョンのChibiOS(2.x)では、システムタイマーの期間は(アセンブリ段階で)固定されています。
将来のバージョン(3.0)では、開発者は定期的な中断(ティックレススケジューラ)なしでカーネルの機能に移行する予定です。
カーネル自体は、同期(mutex、セマフォ)、メモリ管理(ヒープ、mempool)、さまざまなキュー管理プリミティブ(mboxおよびイベントを含む)、そしてもちろんタスク管理ツールの基本要素を提供します。
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(特定のMr. ChaNからの実装)を接続する機能を区別できます。
使用するのにかなり便利なシェルもあります-些細なことですが、素晴らしいです。
ほとんどのサブシステムのAPIは非常にシンプルで読みやすい(特にカーネル)ですが、場合によっては例が不可欠です。
一部のドライバーのAPI依存関係は、ドライバーが最初に開発されたプラットフォームを混乱させることがありますが、私が理解するように、ドライバーはOSの主要な優先事項ではなく、現在のタスクのために人為的に開発されています。 重複したコードの密集したクラスターが所々に出くわします。
HAL全体を別のリポジトリに移動することが計画されているようです。 また、ChibiOS HALの将来のバージョンでC ++で書き直される可能性もあります。
特に弱点があるのは、マクロ(ドライバーのセット、サブシステムの機能の特徴など)を使用したシステムの構成です。 これにより、特定のオプションをメインストリームに削除または追加する際のツリー外プロジェクトのサポートが複雑になります。
好きではない設計上の決定がいくつかありますが、個人的な好みかもしれません。
例
まず、システムの初期化とシェル作成の小さな例があります。 コードは、コメントなしで意図的に提示されています。
#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); }
私はプロジェクトの責任者であり独裁者がジョバンニ・ディ・シリオ氏であることをほとんど忘れていました。
そしてもちろん、サイトへのリンク: ChibiOs 。
ご清聴ありがとうございました。