トロンフォーラム

第6回 ミドルウェア

T2EXとは?

組込みシステムの世界は進化し続けています。ARMコアのプロセッサをみても、Cortexファミリの 登場はもちろん、最近ではbig.LITTLE処理や仮想化のための機能(virtualization extension) など多くの新しい機能や実装が次々と登場しています。なぜこのように組込み向けのプラットフォームが 進化するかといえば、実際の組込みシステムがどんどん進化しているからです。

近年の組込みシステムにおいては、情報処理の高度化と大規模化の進行が顕著です。例として電子レンジを とってみても、最近ではターンテーブルの代わりにセンサを用いて均等に調理を行う仕組みになっていたり、 様々な調理メニューを持っていたりするものが多くなっています。さらには、レシピを提案して表示する機能や、 そのレシピに従って調理時間や温度等の設定を行い、ある程度自動的に調理を進めてくれるような製品も出ています。

そこで、リアルタイム性や省メモリといった組込み独自の要求を満たしつつも、情報系OSに 見られるような高度な情報処理機能を持ったソフトウェアが必要になってきます。これを 実現するのが、ここで紹介する T2EX です。第1回の特集でも概要を紹介しましたが、T2EX は T-Kernel 2.0 Extension の略で、直訳すると「T-Kernel 2.0(の)拡張」です。 その名が示す通り、T2EXは、T-Kernel 2.0 というRTOSに情報系OSの高度な機能を 追加するための拡張機能のコレクションとなっています。

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

T2EX は T-Kernel 2.0 上で動作するサブシステムと、それを補完するライブラリの集合体として 実現されています。T-Kernel 2.0 には OS の機能拡張を行う仕組みとして「サブシステム管理機能」 という機能が搭載されており、T2EX ではこの機能を使って、機能モジュール単位に分割されたOS拡張機能が 提供されています。T2EXが提供する機能は以下の通りです。

  • File management (ファイル管理機能)
  • Network communication (ネットワーク通信機能)
  • Memory protection (メモリ保護機能)
  • Calendar (カレンダ機能)
  • Program load (プログラムロード機能)
  • Standard C compatible library (標準C互換ライブラリ(標準入出力を除く))
  • Standard input/output (標準入出力機能)

図5 は T2EX アーキテクチャの全体構造を示したものです。「T2EX」と書かれた灰色の囲みが T2EX全体を、その中に入っている赤色のブロックが T2EX に含まれる各モジュールを表します。

図5 T2EXアーキテクチャ

図5 T2EXアーキテクチャ

T2EXに含まれるモジュールは、図5の中のブロックの上下関係により示された依存関係を満たす範囲で、 追加したり取り外したりすることが可能です。使用しない機能を取り外すことでROM/RAMの使用量を 減らすことができますし、起動時間を短縮することも可能です。

たとえば、デジタルカメラを例に考えてみましょう。このデジタルカメラでは、撮影した写真データを SDカードに保存するためにファイル管理機能を使用し、撮影日時の表示や記録のためにカレンダ機能を 使用しますが、ネットワーク通信機能やプログラムロード機能は使用しないものとします。 この場合は、システムの構成を 図6 のように軽量化することができます。

図6 使用しない機能を省いたT2EXの構成例

図6 使用しない機能を省いたT2EXの構成例

このように、モジュール単位で機能を追加したり取り外したりできるように設計されているのが、 T2EX のアドオンアーキテクチャの特徴です。これに対して、Linux等の情報系OSでは、 ファイルやネットワークなどの機能がOSの基本的な機能(スケジューリングなど動作の根幹に関わる部分)と 深く絡み合っており、機能の取り外しが簡単ではありません。そのため、組込みLinuxと言われる 製品でも 一般には数MB以上のROM/RAMを必要とします。 一方、T2EXでは各モジュールのプログラムサイズが小さいことに加えて(たとえばファイル管理機能は100KB以下)、 使用しない機能モジュールの取り外しができますので、前述のデジタルカメラのようなシステムでも 数百KB程度のROM/RAM容量で済む場合が多いでしょう。

デジタルフォトフレームを作ってみよう

T2EXを用いた組込みアプリケーションの具体例として、以下のような動作をする デジタルフォトフレームを作成してみましょう。

  1. 本体に差し込まれたSDカードの中のJPEGファイルを一つ読み出す。
  2. 読み出したJPEGファイルの画像を画面に表示する。(スクリーンドライバを利用)
  3. 一定時間そのままの状態を保持する。
  4. 1.に戻る
必要なT2EXモジュールの選択

まず、本システムで使用するT2EXのモジュールを選択します。ここでは、ファイル管理機能、 標準入出力機能のほか、外部データを扱うことから、メモリ保護機能も使用することにします。 これら3つのモジュールのみを使用するため、kernel/sysmain/build_t2ex/tef_em1d/Makefile を編集し、使用しないモジュールの指定行の先頭に '#' を追加してコメントアウトします。具体的には

のような指定がある部分を

と書き換えることで、ネットワーク通信機能、カレンダ機能、プログラムロード機能を取り外すことができます。

ドライバやライブラリについても、kernel/usermain_t2ex/Makefile.usermain を 編集し、 使用しないものをコメントアウトすることで、システムから外すことができます。今回はネットワークドライバ (netdrv.o)は使用しないので、以下の行をコメントアウトします。

T2EXを用いたプログラミング

T2EXはT-Kernel 2.0の拡張機能ですので、T2EXを用いたシステムのプログラミングの基本スタイルは、 T-Kernel 2.0のみを用いたシステムと同じです。T-Kernel 2.0では usermain 関数がユーザプログラムの 本体となっていますので、その中身を書き換える形でアプリケーションを作成します。

usermain 関数の中では、T-Kernel 2.0 の API と T2EX の API を混在してプログラミングすることが 可能です。T-Kernel 2.0 の API については、すでにタスク管理や同期・通信の基本機能をご紹介していますが、 それらの機能と T2EX の機能を組み合わせることで、リアルタイムな処理を行いながらもファイルシステムや TCP/IP などの高度な機能を用いたアプリケーションを作ることが出来るようになります。

なお、T2EX の API は POSIX の API に似ていますが、以下のような相違点もありますので、注意が必要です。

  • T2EXのAPIの名称には、T2EXのモジュール名の短縮名がプレフィックスとして付いています。 たとえば、ファイル管理機能のAPIには fs_、ネットワーク通信機能のAPIには so_ のプレフィックスが付いています。
  • T2EXのAPIの戻り値は、T-Kernel 2.0 の API との混在を考え、原則として0以上の場合が成功(正常終了)、 負の値の場合がエラーコードを表します。また、エラーコードは、エラーの意味に応じていろいろな値をとります。 一方、POSIXの多くの関数では、エラーの場合の戻り値として (-1) のみを使用します。

以下のPOSIXのプログラムを例として考えてみましょう。

T2EX でこれと同じ処理を行うプログラムは、以下のようになります。

このプログラムは、これまで紹介してきたT-Kernel 2.0用のプログラムの中に混在して記述することができます。

プログラミング例

あとは、前述のデジタルフォトフレームの動作に対応する処理を、usermain 関数の中に一つ一つ実装していきます。

デジタルフォトフレームのサンプルプログラムは こちら からダウンロードできます。

このサンプルプログラムには、T-Kernel 2.0のデバイス管理機能、 スクリーンドライバ、T2EXのファイル管理機能の利用例が含まれていますので、 T-Kernelのデバイスドライバを利用したプログラムを開発する際の参考になる点が多いと思います。

なお、このサンプルプログラムは、T2EXの環境にコピーすることで、デジタルフォトフレームを ビルドできるようになっていますので、ぜひ確認してみてください。 (詳細は同梱のReadMe.txtを参照してください。)

第5回 タスク間同期・通信機能3第7回 タスク間同期・通信機能4


※1 ドライバはアプリケーションからだけでなく、他のミドルウェアからも呼び出されますが、考え方は同じですので、ここではアプリケーションから呼び出される場合を例として説明します。

※2 LANやディスクなどの標準的なデバイスに対しては、それぞれのデバイスに依存した仕様も定められています。トロンフォーラムから公開している「T-Engine標準デバイスドライバ仕様書」をご覧ください。

※3 SDI で実装したドライバに対して、"s" のつかない tk_rea_dev や tk_wri_dev を使うことも可能ですが、その場合でも読み書き終了までアプリケーションは中断し、同期型で動作します。

Return Top