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