150年間使い続けられるRTOS「RODOS」はドイツの人工衛星に欠かせないリアルタイムOS列伝(33)(2/2 ページ)

» 2023年04月03日 07時00分 公開
[大原雄介MONOist]
前のページへ 1|2       

「RODOS」の設計目標は引き続き“Simplicity”

図2 「RODOS」のロゴ 図2 「RODOS」のロゴ 出所:GiLab

 さて、そんなわけでRODOSはBOSSの特徴を引き継いで、より機能を引き上げたものとなっている(図2)。RODOSの設計目標は引き続き“Simplicity”である。ただし、Simplicityを実装するに当たり、「機能を削って簡素化するわけではない」としている。具体的には、リアルタイムスケジューリング、リソース管理、同期メカニズム、ミドルウェア、スレッド間通信といった機能が全てマイクロカーネルにより「可能な限りシンプルな形で」提供される。RODOSのコアの特徴は以下の通りだ。

  • オブジェクト指向のC++インタフェース
  • 超高速ブート
  • リアルタイム優先制御のプリミティブなマルチスレッディング
  • 時間管理
  • スレッドセーフな通信/同期メカニズム
  • イベントプロパゲーション

 アプリケーションはターゲットハードウェアないしLinux上のアプリケーションとして開発可能なので、例えばある程度までLinux上で開発を進め、実機検証が必要になった段階でターゲットに移すことも容易である(再コンパイルだけで移行可能な場合もある)。

 アプリケーションは、Active Object/Passive Objectを利用できる。Active Objectはタイマー/割り込み/メッセージなどのイベントを受け取ることができ、またObjectから逆にイベントを発生させることも可能である。一方、Passive Objectは単にデータとMethodをActive Objectに提供するだけの存在である。このため、アプリケーションは通常、スレッドやイベント、あるいはInstantiate Subscriber objects(これはミドルウェアへのAPIである)を継承する形でActive Objectを生成して実行をスタートする形となる。

 ちょっと独特なのは時間管理だろうか。RODOSではコアがシステムの時間を制御するが、これは0からスタートし、150年後のEnd-of-Timeまでの間、ns単位の時間を提供する。150年、というのは衛星の運用寿命を考えると納得いく数字である。例えば、ボイジャー1号と同2号はどちらも1977年に打ち上げられ、機能停止(搭載する原子力電池を使い切る予定時期)は2025年ごろとされているから、50年弱動作することを想定している。一般的な組み込み機器よりも想定寿命が長く、しかも何かあっても簡単にはリセットすらできない(ボイジャーは既に1号と2号とも太陽系を脱出している)から、このくらいの設計寿命が必要なのは当然だろう。

 ちなみにコアそのものには多くの機能はない。周辺回路へのアクセスなどは全てミドルウェア経由となっており、これは移植性の向上につながっている。RODOSの最新バージョンは202となっているが、ここでは以下のようなターゲットが挙げられている。

  • Linux上での動作
  • POSIX環境での動作
  • STMicroelectronics STM32F4
  • Microchip SmartFusion 2
  • Raspberry Pi 3

 また、過去にはベアメタルで以下のプロセッサをサポートしている。

  • arm_cortex(Armv8-A汎用)
  • arm-cortexA8(Cortex-A8汎用)
  • arm-cortexA9(Cortex-A9汎用)
  • arm-cortexA9_zinq(Cortex-A9コア内蔵のXilinx Zynq)
  • arm_v4(Armv4汎用)
  • avr32(AtmelのAVR32)
  • bf561(ADIのBlackfin BF501)
  • imx(NXP Semiconductosのi.MX)
  • leon(SPARCv8ベースのLEONプロセッサ)
  • microblaze(XilinxのMicroBlaze)
  • raspberrypi(Raspberry Pi)
  • smatfusion(Microchip SmartFusion)
  • virtex4(Xilinx Virtex-II搭載のPowerPC 405)

 これらの他、FreeRTOS、RTEMS、Windowsなどの環境上でも動作するとしている。

 RODOSで「Hello, World」を記述するとリスト1のようになる。

#include "rodos.h"
static Application appHW("HelloWorld");
class HelloWorld : public Thread {
public:
  HelloWorld() : Thread("HelloWorld") { }
  void init() {
    PRINTF("Printing Hello World");
  }
  void run(){
    PRINTF("Hello World!\n");
  }
}
static HelloWorld helloworld;
リスト1 RODOSにおける「Hello, World」の記述

 スレッドを作るHelloWorld()と、初期化のinit()、実際にHello, Worldを出力するrun()の2つのメソッドを生成し、あとは一番下でHelloWorldを呼び出すことで実行されるというわけだ。C++としてはごく標準的な記述でコーディングできているのが分かる。

 RODOSは現在もKamaro EngineeringWuSpaceなどで人工衛星のシステム構築に利用されている。日本ではあまりなじみがないが、主にドイツの人工衛星構築では欠かせないRTOSである。

前のページへ 1|2       

Copyright © ITmedia, Inc. All Rights Reserved.