リアルタイムOSとは

リアルタイムOSの概要

コンピュータという言葉から何を想像しますか?パーソナルコンピュータ、サーバ、スーパーコンピュータなどは、まさにコンピュータらしいコンピュータと言えるでしょう。これらは、汎用な目的に使用できる情報処理型のコンピュータです。しかし、コンピュータはこのようなものばかりではありません。

例えば、携帯電話、ビデオカメラ、デジタルカメラ、コピー機、ファックス、自動車、カーナビ、携帯音楽プレーヤ、HDDレコーダ、自動販売機など、身の回りの多くのものにコンピュータが入っています。これらのコンピュータは、実世界の動きに合わせてセンサやアクチュエータなど他の機械システム等と協調して動作し、目的に応じたサービスを提供します。このようなコンピュータシステムは組み込みシステムと呼ばれています。

組み込みシステムは特定の機能を実現するための専用化されたシステムです。いまや私達の生活には欠かせません。一方、システムによっては誤動作が発生すると重大な問題を引き起こしかねないものもあります。自動車の制御システムなどは人命に関わることが容易に考えられます。そのため、正常に機能することが重要であり、組み込みシステムには非常に高い信頼性が求められます。また、身の回りのあらゆるモノにコンピュータが組み込まれるようになったことで、低コスト化が一つの重要な課題になっています。コストを極限まで下げたため、組み込みシステムは一般的に処理速度が遅かったりメモリサイズが小さかったり、利用できる資源(リソース)に厳しい制約があります。さらに、システムの改修にも多大なコストがかかるため、長期間安定して動作できることも求められます。

そして何より、組み込みシステムは実世界に合わせて動作することが求められます。情報処理型のコンピュータとは異なり、単なる計算処理を行うのでなく機器を制御するための入出力処理や通信処理が中心となります。実世界は常に状況が変化し続けているので、実世界の動きに合わせて処理を行うためには、高い応答性能が求められます。

さて、組み込みシステムが求める高い応答性能を実現するには、コンピュータが速ければ十分でしょうか?実はそれだけでは不十分です。たとえ処理を短時間に完了できたとしても、常にその処理を短時間で完了できない限り、期待した機能を提供することはできません。例えば、パソコンを使っている時に、突然何かの処理が動いて、キーボードを受け付けなくなったことを経験したことがある人も少なくはないと思います。これは、音楽プレーヤであれば音が途切れることになりますし、自動車であれば突然パワステが効かなくなるということです。高い応答性を実現するためには、常に処理を短時間で完了できるように、時間制約を守ることが重要となります。

時間制約を守るためには、処理時間を予測できることが不可欠であり、これをリアルタイム性といいます。処理時間が予測できれば、処理の順番を調整することで、時間制約を守る戦略(アルゴリズム)が立てられます。このようなリアルタイム性の実現に役立つ機能を提供するオペレーティングシステムを、リアルタイムオペレーティングシステム(Real Time Operating System)といいます。

リアルタイムOSと情報系OSの違い

リアルタイムOSは、タスクと呼ばれる処理のまとまりを切り替えるための時間や、リアルタイムOSが提供する機能に要する時間があらかじめ予測できたり、発生したイベントに対して高速に応答できたりします。リアルタイム性が必要な処理を実現するには、処理を実行する時の優先度を高くすることができるなど、他の処理に邪魔されないようにできることが必要です。こうすることで実行時間が予測しやすくなります。他の処理に邪魔されると、いつ処理が終わるか予測が困難となります。そのため、リアルタイムOSのタスクを実行する順序の決め方(タスクスケジューリング)には以下のような特徴があります。

  • ●処理(タスク)に優先度が付けられること
  • ●優先度の高い処理(タスク)は、より優先度の低い処理(タスク)には邪魔されないこと
  • ●優先度の高い処理(タスク)は、低い優先度の処理(タスク)の実行権を横取りできること(preemption)

このような優先度ベーススケジューリングのおかげで、リアルタイム性が要求される処理に対して高い優先度を割り当てることができ、システムの応答性を向上させることが可能になっています。

一方、従来の情報系OSは、一定時間ごとに処理を切り替えるような方式(ラウンドロビンスケジューリング)を採用していました。ラウンドロビンスケジューリングでは、すぐに処理をしたい場合でも、他の処理の時間が完了するまで待たなければならず、リアルタイムOSのタスクスケジューリングのように、高い優先度の処理が優先的に実行されることはありません。最近の情報系OSでは優先度を扱えるスケジューリングを採用するようになってきましたが、処理の実行時間などに従い自動的に優先度が変更されることがあります。そのため、依然として処理時間を予測することは困難です。ユーザインタフェースを中心とした数ミリ秒の応答を扱う世界であれば情報系OSを利用していても問題はありませんが、機械制御や通信制御を目的としたマイクロ秒を争う応答性能が要求される世界では情報系OSには技術的限界があり、リアルタイムOSが必要となります。

図1

【情報系OSとリアルタイムOSのスケジューリングの違い】

リアルタイムOSを利用するメリットとデメリット

リアルタイムOSを利用することで、リアルタイム性をもつプログラムの作成が容易になります。機器に要求される機能ごとにタスクとして実装し、それぞれが意図したタイミングで実行されるように優先度を割り当てます。実際には、複数タスクを並行処理する場合、タスク間でタイミングを合わせて動作させるための機能(同期)やタスク間で情報交換するための機能(タスク間通信)も必要になります。それらは、以下のようなリアルタイムOSが提供する機能を利用することで、容易に実現することができます。

  • ●タスク管理機能
  • ●タスク同期管理機能能
  • ●同期・通信機能能
  • ●メモリ管理機能能
  • ●時間管理機能能
  • ●割り込み管理機能

また、プログラムの再利用性も高くなります。例えば、ハードウェアAで動作していたアプリケーションをハードウェアBに移植するものとします。この時、ハードウェアBでハードウェアAと同じリアルタイムOSが動くのであれば、アプリケーション本体はほとんど修正することなく、動作させることができます。万が一ハードウェアBで動作するリアルタイムOSがない場合でも、リアルタイムOSさえ移植すれば同じアプリケーションを動作させることができます。リアルタイムOSの移植は一見大変そうに思えるかもしれませんが、リアルタイムOS全体を改修する必要はなく、ハードウェアに依存する部分のみを移植すれば動作させることができます。

さらに、リアルタイムOSを利用することで保守性・拡張性も向上します。システム全体のモジュール性が向上してモジュール単位で保守できるようになるので、アプリケーション開発者はアプリケーションにのみ集中することができます。さらに、ミドルウェアや各種ソフトウェア資産、開発支援ツールなどの関連製品も利用できます。ところがリアルタイムOSを用いない場合は、タスク管理やハードウェア制御などリアルタイムOSが担当する箇所もアプリケーション開発者が責任を持たなければなりません。

一方、リアルタイムOSを利用することでメモリ消費量が増加するという欠点もあります。非常に単純なアプリケーションならばリアルタイムOSがなくても問題ないかもしれません。しかし、組み込みシステムは複数の処理を並行して実行することが多く、各処理が決められた時間内で正常に処理できるように実装しなければなりません。例えば、音楽プレーヤは、記憶媒体から音楽データを読み込むこと、読み込んだ音楽データをサウンドデバイスに出力すること、ユーザの操作の入力を受け付けること、画面の表示を切り替えることなど、他にもいろいろな処理が必要となります。結局、各処理を管理する機能が必要になり、リアルタイムOSと同等の機能を自作で追加することになります。それでは元も子もありません。また、元々リアルタイムOSはリソースが限られている環境で動作することを前提に設計されているので、非常にコンパクトです。そのため、リアルタイムOSによるメモリ消費は、構築するシステム全体で考えると、それほど気にする必要はありません。

組み込みシステムの未来とリアルタイムOS

ここまでの説明で、組み込み機器においてリアルタイムOSが非常に重要な意味を持っていることをご理解いただけたと思います。一方で、最近の組み込み機器を見てみると、大幅にシステムの情報化・大規模化が進んでいるという事情も抱えています。例を挙げればきりがないですが、例えば以下のような例が挙げられるでしょう:

テレビ

PCと同じようなウェブブラウザを備えていたり、YouTubeの動画を再生したりする機能を持っている製品もあります。

調理機器(電子レンジや冷蔵庫)

レシピを提案して表示する機能や、そのレシピに従って自動的に調理時間や温度等の設定を行うことで、調理をある程度自動化してくれる製品もあります。

ヘルスケア機器

体重や体脂肪の情報などをクラウドサービスへアップロードし、記録してくれるものもあります。

このような例を考えると、組み込み機器においてリアルタイムOSから情報系OSへの移行がどんどん進んでいくのではないか、と思えてきます。ハイエンドな情報家電や情報機器については、実際にそのような方向性でこれからも発展が続いていくことは間違いありません。ただ、ここで注意しなければならないのが、これらの組み込み機器は単純な情報システムではなく、組み込みシステムでもあるため、機器制御においてはリアルタイムOSの考え方を無視する事はできません。例えば、洗濯機を例に考えてみると、機能を高度化する目的で情報系OSを用いたためにモータの制御がリアルタイムに行えず、結果として本来の用途を実現できないようでは本末転倒です。つまり、ここで求められるのは情報系OSとリアルタイムOSの「いいとこ取り」を出来るようなプラットフォームであるということが分かります。

一方で、全ての組み込み機器が上記のような高度化の方向性をたどるということはないでしょう。近年、ユビキタス・コンピューティングやM2M(machine-to machine)、IoT(Internet of Things)といった新しいパラダイムが次々と登場していますが、これらの根本的なアイディアとなっているのは、機器間の機能分散です。つまり、一つの機器をどんどんパワフルにして何でも出来るようにする代わりに、複数の機器がそれぞれ別の仕事を協調してこなすことで、全体としてよりよいサービスを提供しよう、ということです。

具体的な例として、スマートハウス(電脳住宅)を考えると分かりやすいと思います。例えば、コンロで調理を行っている時に換気を行うために窓や換気扇を自動で開いたり、外気温が寒くなったり暑くなったりした時に窓を自動で閉めて空調をつけてくれたりするようなシステムを考えてみましょう。この例では、少なくとも窓や換気扇と、空調、コンロといった調理機器が何らかの形でお互いに連携して動作する必要があります。当然、一つの機器だけですべてをこなす、という今までのタイプの機器とは大きく異なっています。

図2

【スマートハウス(TRONプロジェクト)】

このように組み込み機器の機能分散が進んでいくと、何でもかんでも出来るように機器を高性能化するということは必ずしも必要ではなくなってきます。高度な処理は、高性能な機械に任せてしまって、その機器が行うべき仕事だけをしっかりこなすようにすれば良いわけです。例えば、先程の窓の開閉の例についても、開閉の判断ロジックは例えばクラウド上のサーバに置いてしまって、窓側は要求に従って単純に開閉を行うだけにしてしまうこともできます。全ての機器を高性能化してしまうより、このように適切に機能分散を行うほうが、機器の消費電力を抑える観点からも機器のコストを安くする観点からも有利になります。つまり、機能分散を前提としたシステムでは個々の機器を高機能化するのとは正反対の方向性で発展が進むことになります。

組み込み機器は現在も発展し続けており、それに伴いリアルタイムOSにおいても高機能化・高性能化・機能分散化といった、新たな要求への対応が求められています。

T-EngineプロジェクトとT-Kernelのシリーズ

T-Engineプロジェクトは、21世紀に現れた新しい応用に対応するために2002年に開始されました。TRONの生みの親である坂村健・東京大学教授により、組み込み分野で20年以上の実績を持つTRONプロジェクトの実績をベースとし、これまでの成果を集大成するプロジェクトになっています。

T-Engineプロジェクトは、主に組み込み分野のためのオペレーティングシステムを中心としたプラットフォームの実現を進めるプロジェクトであり、以下のような特徴を持っています。

オープンアーキテクチャとオープンソース

  • ●技術情報やソースコードを公開(オープン)しています。
  • ●これにより、多くの企業が自由に参加できるため、新しい技術を創造する速度が速くなります。

商業利用に適したライセンス

  • ●組み込みシステムでは、製品のハードウェアの詳細に関する情報を秘密としたい場合や、商用ミドルウェアとの組み合わせが必要となるケースが多数みられます。そこでT-Engineプロジェクトでは、T-Licenseというライセンス規約を策定し、自由な複製・改変を認めながら、改変部分を秘密にすることができるライセンスを用意しました。

国際標準化

  • ●T-Engineプロジェクトでは、ITUやISOなどの国際標準化団体に積極的に標準仕様を提案し、基盤技術の国際標準化に貢献しています。
  • ●2012年には、ucode(*1)を中心としたユビキタス・コンピューティングに関する標準仕様がITUの国際標準規格(H.642)として成立しました。

T-Engineプロジェクトでは組み込み向けリアルタイムOSのみならず、ユビキタス・コンピューティングを含む幅広い活動を進めていますが、本稿ではT-Engineプロジェクトの目玉であるリアルタイムOSシリーズ「T-Kernel」を中心に紹介していきます。T-Kernelは、TRONプロジェクトにおける組み込みリアルタイムOS「ITRON」の成果をベースに、組み込みシステムにおける新しい応用に対応するために作られたリアルタイムOSのシリーズです。T-Kernelファミリでは、多様な応用に適した構成のT-Kernelがそれぞれ提供され、多くの要求に応えることができるようになっています。

図3

【T-Kernelファミリ】

ARMコアのプロセッサでも多くの種類が存在し、それぞれ適切な応用が想定されています。CPUとの対応としては、下図のようなイメージでT-KernelファミリとARMプロセッサとを対応付けると分かりやすいでしょう。今回は、T-Kernelファミリのうち、μT-Kernel、T-Kernel 2.0、そしてT2EXを紹介したいと思います。(T-Kernel Standard ExtensionやMP T-Kernelを含むT-Kernelファミリの詳細情報については、T-Engineフォーラムのウェブサイトをご覧ください。)

図4

【CPUに対応するターゲットレンジ】

  • (*1)ucodeは現実世界のさまざまな「モノ」や「場所」などを識別するための固有識別番号です。詳細については uID Centerの説明を参照してください。

μT-Kernel

μT-Kernelは、小規模組み込みシステムをターゲットとしたリアルタイムOSです。ARMのプロセッサで言えば、Cortex-Mがターゲットとする応用分野に適したOSです。非常にコンパクトなOSであり、たとえばROMが8KB、RAMが4KB程度しかないハードウェアでも動作するように作られています。一般的に組み込みLinuxと呼ばれているものでは、どんなに小さく設定しても数MB以上のRAMを使用しますが、これと比較してもいかにコンパクトなOSであるかがよく解ると思います。

これだけコンパクトなOSではありますが、他のリアルタイムOSと比較してもかなり充実したAPIを備えています。特に、タスク関連のAPIや、タスク間同期・通信関連のAPIについては、他のリアルタイムOS(例えばFreeリアルタイムOSやμC/OS-II)と比べてもかなり充実しています。これは、リアルタイムOSの本質がCPUの計算時間を実行したい処理に最適に割り当てることにあるために非常に重要なことです。μT-Kernelを動作させるような小規模な組み込みシステムでは、一般的に省電力・省コストのローエンドなプロセッサが用いられる想定ですが、この時間の割り当てに関する制御が効率良くプログラムから行えるようにするためには、それ相応のAPI群が必要だからです。(この点についての詳細な議論は、第三者が論文で客観的に示していますので、興味のある方はhttp://dx.doi.org/10.1109/MM.2009.86をご覧ください。)

具体的に、μT-Kernelでは以下のような機能を提供しています。使わない機能については、ROMおよびRAMの節約のために、機能を個別に取り外すことも可能になっています。

  • ●タスク管理機能
  • ●タスク付属同期機能
  • ●同期・通信機能
  • ●拡張同期・通信機能
  • ●メモリプール管理機能
  • ●時間管理機能
  • ●割り込み管理機能
  • ●サブシステム管理機能
  • ●デバイス管理機能
  • ●デバッガサポート機能

これらの機能の具体的な利用方法については、次回以降の記事で順次紹介していきたいと思います。

T-Kernel 2.0

T-Kernel 2.0を一言で表すと、高性能・高機能な組み込みシステムのためのリアルタイムOSといって良いでしょう。ARMのプロセッサで言えば、Cortex-Aがターゲットとする応用分野に適しています。ちょうど、リアルタイムOSと情報系OSの「いいとこ取り」をしたような設計となっており、μT-Kernelと同様なリアルタイムOSの機能を基本とした上で、情報系OSの機能をサポートできるように設計・実装がなされたものです。

情報系OSとの「いいとこ取り」という観点から重要なのが「サブシステム管理機能」です。これは、T-Kernel 2.0というリアルタイムOSの上にOSの機能を追加するためのメカニズムで、これを用いることでリアルタイムOSをベースとして、例えばファイル管理機能やネットワーク通信機能といった情報系の機能を、OS機能として追加することが可能となります。さらには完全な情報系OSの機能をOS機能として追加することすら可能で、実際にT-Kernel Standard Extensionは完全な情報系OSの機能を実現したOS拡張ですし、その他にも会員企業によってPOSIX拡張等が開発された例もあります。

なお、前節で説明したμT-Kernelにも実は「サブシステム管理」という機能が列挙されていますが、T-Kernel 2.0とは異なりこれはあくまで簡易的なもので、互換性のために提供されるものです。このように、T-Kernelファミリでは、実現方法や内部的な動作、構成等がいずれも大幅に異なっていますが、それぞれの間でのAPIの互換性が考慮されて設計されています。これにより、「T-Kernel」という共通のAPIを、小さな組み込みシステムから大規模なものにまで、スケーラブルに利用することができるようになっています。

現在のμT-Kernelは、T-Kernel 2.0の前身であるT-Kernel 1.0を、互換性を保ちながら軽量かつ簡易な構成とする形で設計されたもので、ほぼT-Kernelと共通になっています。ただし、T-Kernel 2.0は情報系OSの機能を必要とするような比較的大きな構成での利用を想定しているため、μT-Kernelに対して以下のような機能を追加したものとなっています。

マイクロ秒単位の時間管理

  • ●組み込みシステムにおけるデバイスの制御においては、マイクロ秒単位のきめ細かい時間管理が必要となることも多く、これを実現するためにマイクロ秒単位の時間管理をサポートした。
  • ●Cortex-A系のCPUにみられるような処理の高速化に伴い、マイクロ秒単位の制御が実用化できる環境が整った。

大容量デバイスのサポート

  • ●SDカード等を始めとして、組み込み機器においても大容量のデバイスを利用するケースが増えており、これらの大容量デバイスを扱うための機能を追加した。

標準化範囲の拡大

  • ●物理タイマやキャッシュ制御等、T-Kernel 2.0の仕様で規定される機能範囲を拡張した。
  • ●これにより、これらの機能を利用する際のAPIが共通化され、ミドルウェアの流通性が向上する。

T2EX

T2EXはT-Kernel 2.0 Extensionの略で、直訳すると「T-Kernel 2.0(の)拡張」です。その名が示す通り、T2EXはT-Kernel 2.0のためのOS拡張機能であり、リアルタイムOSに情報系OSのいいところを持ってこられるようにするための、OSのアドオン(拡張機能)のコレクションです。

「T-EngineプロジェクトとT-Kernelのシリーズ」の節では、組み込みシステムが高機能化・高性能化、あるいは機能分散化しているという話に触れましたが、ちょうどそのあたりを狙った設計となっています。高度なOS機能を情報系OSよりも軽量な形で追加することで組み込みシステムの高機能化・高性能化をサポートしつつ、ネットワーク通信機能により機能分散化をOSレベルからサポートできるようになっています。

T2EXの主な特徴は以下のとおりです。

高度な組み込みシステムのための情報系OS機能の追加

  • ●ファイル管理機能やネットワーク通信機能といった、情報系OSの機能を追加。これによって、高機能な組み込みシステムの開発を強力にサポートする。

アドオン・アーキテクチャ

  • ●限られたROM/RAMの中で高度な組み込みシステムを実現するため、OS機能を独立させる。
  • ●ビルド時のコンフィギュレーションにより、必要なものだけを取捨選択して開発可能。たとえば、T-Kernel 2.0にネットワーク通信機能だけ追加した構成で開発したい、といったように、拡張機能をそれぞれ独立して付け加えたり取り外したりしてシステムを構築し、コンパクトな組み込みシステムを効率的に開発することが可能である。

メモリ保護機能のサポート

  • ●高機能な組み込みシステムの開発では、OSをアプリケーションから保護する機能が不可欠となる。
  • ●情報系OSとは異なる単一空間上のメモリ保護を実現し、効率的かつ安全なシステムの開発を可能にした。

コンパクト

  • ●情報系OSの機能を実現しながらも、非常にコンパクトな組み込みシステムが開発可能である。
  • ●例えば、100KB以内のRAMでファイルシステムを含む機器(デジタルカメラなど)を開発することも可能である。Linux等では少なくとも数MBは消費するため、同じ処理を実現する上で極めてコンパクト性が高いと言える。

T2EXの主な機能を列挙すると以下の通りです。これらはT-Kernel 2.0のAPIと混在させて利用することが可能であり、高いリアルタイム性を実現しながらも高度な処理を実現できます。

  • ●ネットワーク通信機能
  • ●ファイル管理機能
  • ●標準C互換ライブラリ(標準入出力機能を含む)
  • ●カレンダ機能
  • ●プログラムロード機能
  • ●メモリ保護機能

なお、T2EXのアーキテクチャは以下に示す通りで、図に示される機能間の依存関係を満たす範囲で前述の各機能を付け加えたり取り外したりといったことが可能になっています。

図5

【T2EXアーキテクチャ】