エッジコンピューティングの逆襲 特集

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

» 2024年02月06日 07時00分 公開
[大原雄介MONOist]
前のページへ 1|2|3       

インプリメントは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と非常に相性の良いライブラリ、といえるだろう。

前のページへ 1|2|3       

Copyright © ITmedia, Inc. All Rights Reserved.