TinyOS 0312006003 浅川 和久 2017/4/7 TinyOS
TinyOS 外部状態の測定 表示装置はない 測定データは別の場所に送信する 資源(CPU/メモリ/エネルギー)が限られている オープンソース マルチホップ無線ネットワークノード向けのOS 米国バークレイ大学 外部状態の測定 表示装置はない 測定データは別の場所に送信する 資源(CPU/メモリ/エネルギー)が限られている 多様な環境で利用する 同時並行的に進む様々な処理→資源を有効活用(①②) 機能削減(③①) 利用シーン合わせたモジュールの組み換え(④) 2017/4/7 TinyOS
TinyOS 計算モデル モジュール Wait Door StdControl Leds ▼ △ ▼ ▼ △ ▼ コマンド インターフェース ▼ △ ▼ ▼ △ ▼ コマンド 利用者モジュールからの呼び出し インターフェース モジュール間の接続 双方向 イベント 逆方向からの呼び出し StdControl Door Sensor Leds LedsM ハードウェア割り込み LEDハードウェア 2017/4/7 TinyOS
タスク モジュール内実行とそれによって引き起こされるコマンド実行という一連の処理 複数のタスクを並行して実行できる 実行を始めたら終わるまで走り切る(run-to-completion) サスペンドするシステムコール(sleep() read())が存在しない 並行実行の単位ではなく、一連の意味ある仕事の固まり 優先度の高いタスクに横取りされない(no-preemption) 実行時間が長いタスクを実行すると、他のタスクの実行は長い間待たされる 2017/4/7 TinyOS
タスク サスペンドや緊急に処理するプログラムはイベントを用いる(割り込み) モジュールグラフの最下層にはハードウェア ハードウェア 条件が成立したときに割り込みを起こす グラフ上で下位から上位にイベントが伝播していく イベントもrun-to-completion 時間のかかる処理を実行する必要がでたとき、新しいタスクを生成する イベントの実行が終わると、イベント発生直前に実行していたタスクが継続実行される タスクの実行が終わると、新たに生成されたタスクを実行 2017/4/7 TinyOS
ドアの開閉をセンスする Wait Door StdControl Leds StdControl Door Sensor Leds LedsM ハードウェア割り込み LEDハードウェア WaitDoorモジュールからDoor Sendorモジュールのコマンドstart()を呼び出す。センサの監視を始めるように指示。自分の実行は終了。 ドアセンサがONになると割込みが発生。DoorSensorモジュールのイベントが実行。 WaitDoorモジュールのイベントfired()を呼び出す。 WaitDoorモジュールはイベントfired()が呼ばれたので、ドアスイッチがONになったと判断。LEDモジュールのredOn()を呼び出す。 2017/4/7 TinyOS
イベント駆動型計算 イベント呼び出しを設定して自分は終了する イベントが起点となって連鎖的に処理が進んでいく イベント駆動型計算 センサからの割り込みを中心とした並行的な処理→イベント駆動型が有利 メモリが少なくて済む 「待つ」という処理はOSの実装上のメモリ量やCPU負荷が高い 2017/4/7 TinyOS
競合回避機能 モジュール間共有変数の競合回避機能 ある変数に1を加えるという作業中に割り込みが発生し その変数に別の値が書き込まれた場合に発生する 割り込みから戻っても元の加算が継続 割り込み処理の中で書き込まれた値が上書きされてしまう コンパイラが検出して警告 プログラムの割り込みを一時的に禁止する
TinyOSの通信方式(1) address (16bit) type (8bit) group length data Tiny Active Message 隣接ノード間の通信方式とパケット方式だけが決められている address (16bit) type (8bit) group length data CRC(16bit) address 決められたノードのアドレス group ノードはグループに所属している type typeの値ごとにイベントを定義できる パケットを受信するとイベントが呼び出される
TinyOSの通信方式(2) クライアントサーバシステム TinyOS Active Message サーバはクライアントからの要求を待つ必要がある TinyOS Active Message パケットの中にそれを処理をするための情報(type)が入っている 受信者が待っている必要がない パケットが到着すると、それに対応するイベントが実行される
NesC 1: module WaitDoor{ 2: provides{ 3: interface StdControl; 4: } 4: } 5: uses{ 6: interface SensorControl; 7: interface Leds; 8: } 9: }implementation{ 10: command result_t StdControl.start(){ 11: call SensorControl.start(){ 12: return SUCCESS; 13: } 14: event result_t SensorControl.fired(){ 15: call Leds.redOn(); 16: return SUCCESS; 17: } 18: } 2017/4/7 TinyOS
NesC このモジュールが提供するインターフェース このモジュールが利用するインターフェース 1: module WaitDoor{ 2: provides{ 3: interface StdControl; 4: } 5: uses{ 6: interface SensorControl; 7: interface Leds; 8: } 9: }implementation{ 10: command result_t StdControl.start(){ 11: call SensorControl.start(){ 12: return SUCCESS; 13: } 14: event result_t SensorControl.fired(){ 15: call Leds.redOn(); 16: return SUCCESS; 17: } 18: } このモジュールが提供するインターフェース このモジュールが利用するインターフェース 2017/4/7 TinyOS
NesC StdControlの中のstart()というコマンド を定義する 1: module WaitDoor{ 2: provides{ 3: interface StdControl; 4: } 5: uses{ 6: interface SensorControl; 7: interface Leds; 8: } 9: }implementation{ 10: command result_t StdControl.start(){ 11: call SensorControl.start(){ 12: return SUCCESS; 13: } 14: event result_t SensorControl.fired(){ 15: call Leds.redOn(); 16: return SUCCESS; 17: } 18: } StdControlの中のstart()というコマンド を定義する 2017/4/7 TinyOS
NesC イベントはインターフェースを利用する側が 定義する SensorControlの中のfired()というコマンド を定義する 1: module WaitDoor{ 2: provides{ 3: interface StdControl; 4: } 5: uses{ 6: interface SensorControl; 7: interface Leds; 8: } 9: }implementation{ 10: command result_t StdControl.start(){ 11: call SensorControl.start(){ 12: return SUCCESS; 13: } 14: event result_t SensorControl.fired(){ 15: call Leds.redOn(); 16: return SUCCESS; 17: } 18: } イベントはインターフェースを利用する側が 定義する SensorControlの中のfired()というコマンド を定義する redOn()が呼び出され、LEDが点灯する 2017/4/7 TinyOS
参考文献 安藤 繁,田村 陽介,戸辺義人,南 正輝,センサネットワーク技術,東京電機大学出版局,2005