検索
連載

Fiberもどきの「Protothreads」は既存RTOSとの組み合わせで力を発揮するリアルタイムOS列伝(43)(3/3 ページ)

IoT(モノのインターネット)市場が拡大する中で、エッジ側の機器制御で重要な役割を果たすことが期待されているリアルタイムOS(RTOS)について解説する本連載。第43回は、実装がFiberの一種のようになっている「Protothreads」を取り上げる。

Share
Tweet
LINE
Hatena
前のページへ |       

インプリメントは6行、コードの可読性が大幅に向上

 では、Protothreadsはこれをどうやって実現しているのか。その種明かしが図7になる。「インプリメントは6行」などと自慢しているが、実際にProtothreadsの全体はpt.hの中に格納されており、しかも本当に6行である。もっとも図7のコードはやや古いバージョンのもので、最新バージョンだともう少し複雑だしAPIも増えている(PT_SPAWN()やPT_RESTART()なども追加されており、関数(?)は全部で13個になっている)が、基本は同じである。

図7
図7 要するに全部マクロである。PT_BEGIN()とPT_END()で挟まないとうまくいかない理由がこれで分かる[クリックで拡大] 出所:Adam Dunkels氏の論文

 これは全部C言語のマクロだから、プリプロセッサを通すと図8のように展開される。最初に「Fiberもどき」と書いたのは、要するにこれはPreemptiveもへったくれもなく、実際にはSingle Task/Process/Threadで動作しているにもかかわらず、あたかもMulti Task/Process/Threadで動いているかのように見せかけているわけである。

図8
図8 赤枠のLine numberのところ、マクロの方は“__LINE__”とされている。要するにソースの行番号はユニークに定まるので、その行番号を使って識別を掛けているわけだ[クリックで拡大] 出所:Adam Dunkels氏の論文

 ではこれにどんなメリットがあるのか。例えば、ワイヤレスでの通信の後に一定期間スリープすることで消費電力を削減するという、よくあるコードを普通に書くと図9のようになるが、Protothreadsを使うと図10のレベルまでシンプル化できる。可読性が上がるし、メンテナンスもしやすい。もちろんこれ、デバッガを使ってステップ動作で追っかけている時にはちょっと「?」になりそうだが、慣れればそれほど苦にはならないだろう。

図9
図9 もう少し簡素化できそうな気はしなくもないが、大幅に簡略化するのはまぁ無理だろう[クリックで拡大] 出所:Adam Dunkels氏の論文
図10
図10 コードそのものはほとんど変わらないが、確かに見やすい[クリックで拡大] 出所:Adam Dunkels氏の論文

 この可読性が向上する(=複雑性が減る)というのはばかにならない効果であって、実際いろいろなドライバ類やコードにProtothreadsを使った際の効果も出ている(図11)。

図11
図11 バグがあってもTR1001のドライバが動作していた、というのは確かに発見しにくい類だ(いっそ動かなければはるかに早く発見されていただろう)[クリックで拡大] 出所:Adam Dunkels氏の論文

 コード数だけでなく、StateやTransitionの数も減らすことができており、効果は大きい。代償は、若干のコードサイズ増加(図12)と処理サイクル増加(図13)である。

図12
図12 [そりゃまぁcase文で行番号を使っての分岐にしているから、普通はメモリサイズが増える。なのにContiki codepropのコードサイズが減っているのはどうしてだろう[クリックで拡大] 出所:Adam Dunkels氏の論文
図13
図13 見た目はともかく、実際にはSwitchなりGotoなりが入るから、その分若干遅くなるのは致し方ない[クリックで拡大] 出所:Adam Dunkels氏の論文

 200バイトも増えるのは問題では? と思うかもしれないが、これはコードサイズ(つまりROM側)であってRAM側の増加ではない。RAM側の方は、PT_BEGIN()を呼び出す際にunsigned shortの領域を1つ使うから、PT_BEGIN()を複数並行して使うようなケースではその数×2バイトの増加だが、これは大きな問題にならない範囲だし、処理サイクルのオーバーヘッドも言うほどには大きくない。メリットとデメリットを勘案すれば、許容できる範囲かと思う。

 Protothreadsの開発は2006年に終了しているが、最新版(v1.4:pt.hはv1.7)はDunkels氏のサイトから入手できる。しかもアーキテクチャ依存性もなく、ANSI Cに準拠したコンパイラを使える環境ならどこでも稼働する。実際AVR/PIC/MSP430/Arm/x86で動作するから、例えばWindowsのアプリケーションをVisual StudioでC++を使って記述するときにProtothreadsを利用することすら可能である。

 単独で利用する、というよりも既存のRTOS上での開発の際に、Protothreadsを組み合わせる、という使い方が便利そうである。ちなみにライセンスはOpen source BSD-style licenseで提供されており、ライセンス表記だけをしておけば、商用製品に使うこともできる。実装はシンプルだが、RTOSと非常に相性の良いライブラリ、といえるだろう。

Copyright © ITmedia, Inc. All Rights Reserved.

前のページへ |       
ページトップに戻る