特性
Tiny OS的如下特性決定了其在感測器網路中的廣泛套用,使其在物聯網中占據了舉足輕重的地位。
相對於主流作業系統成百上千MB的龐大體積來說,Tiny OS顯得十分迷你,只需要幾KB的記憶體空間和幾十KB的編碼空間就可以運行的起來,而且功耗較低,特別適合感測器這種受記憶體、功耗限制的設備。
Tiny OS本身提供了一系列的組件,包括:網路協定、分散式伺服器、感測器驅動及數據識別工具等,使用者可以通過簡單方便的編製程序將多個組件連線起來,用來獲取和處理感測器的數據並通過無線電來傳輸信息。
Tiny OS在構建無線感測器網路時,通過一個基地控制台控制各個感測器子節點,聚集和處理各子節點採集到的信息。Tiny OS只要在控制台發出管理信息,然後由各個節點通過無線網路互相傳遞,最後達到協同一致的目的。
套用
Tiny OS是一個
開源的作業系統,所有人都可查看和修改Tiny OS的原始碼,參與到Tiny OS及配套軟體的開發,並套用到商業和工業領域中。在眾多參與者的協作下,Tiny OS於2012年發布了的V2.1.2版本,並在2013年將Tiny OS上線到Github,供全球的參與者下載,平均下載量已經高達3.5萬次/年。
Tiny OS已經有很多產品,例如:用於神經信號接收、調解、顯示的接收器、用於能源領域中的石油和氣體監控、用於感測網路的控制和最佳化、用於無線感測網路進行健康監測等。
組成
TinyOS的構件包括網路協定、分散式伺服器、感測器驅動及數據識別工具。其良好的
電源管理源於
事件驅動執行模型,該模型也允許時序安排具有靈活性。TinyOS已被套用於多個平台和感應板中。
◆TinyOS作業系統、庫和程式服務程式是用nesC寫的
◆nesC是一種開發組件式結構程式的語言
◆nesC是一種C語法風格的語言,但是支持TinyOS的並發模型,以及組織、命名和連線組件成為健壯的嵌入式網路系統的機制
◇nesC
應用程式是由有良好定義的雙向接口的組件構建的
◇nesC定義了一個基於任務和硬體事件處理的並發模型,並能在編譯時檢測數據流組件
規範
◇nesC應用程式由一個或多個組件連線而成
◇一個組件可以提供或使用接口
●組件中command接口由組件本身實現
●組件中event接口由調用者實現
●接口是雙向的,調用command接口必須實現其event接口
實現
◇modules
●包含應用程式代碼,實現接口
◇configurations
●裝配模組,連線模組使用的接口到其提供者
●每個nesC應用程式都有一個頂級configuration連線內部模組
模型
◆TinyOS只能運行單個由所需的
系統模組和自定義模組構成的應用程式
◆兩個執行緒
◇任務
●一次運行完成,非搶占式
◇硬體事件處理
●處理硬體中斷
●一次運行完成,搶占式
●用於硬體中斷處理的command和event必須用async關鍵字聲明
流程
(race conditions)
◇nesC要避免任務排他性訪問共享數據
◇nesC要避免所有共享數據訪問都通過原子語句
◇nesC在編譯過程中要檢測數據流,但可能誤報,可用norace關鍵字聲明不檢測,但對其使用
應格外小心
Module of Sense Application
SenseM. nc
------------------------------------------------
|module SenseM {
| provides {
| interface StdControl;
| }
| uses {
| interface Timer;
| interface ADC;
| interface StdControl as ADCControl;
| interface Leds;
| }
|}
◆提供StdControl接口
◆使用Timer、ADC、StdControl、Leds接口
◇nesC程式中可以使用同一個接口的多個實例
●interface StdControl as ADCControl
●ADCControl是StdControl的實例
◇不提供實例名,則實例名與接口名相同
●interface ADC相當於interface ADC as ADC
Configuration of Sense Application
Sense. nc
|configuration Sense {
| // this module does not provide any interface
|}
|implementation
|{
| components Main, SenseM, LedsC, TimerC, Photo;
|
| Main.StdControl -> SenseM;
| Main.StdControl -> TimerC;
|
| SenseM.ADC -> Photo;
| SenseM.ADCControl -> Photo;
| SenseM.Leds -> LedsC;
| SenseM.Timer -> TimerC.Timer[unique("Timer")];
|}
◆不提供任何接口
◆使用Main、SenseM、LedsC、TimerC、Photo模組
◆連線Main.StdControl接口到SenseM.StdControl和TimerC.StdControl
◆連線SenseM.ADC接口到Photo.ADC
◆連線SenseM.ADCControl到Photo.StdControl
◆參數化接口
◇組件可以使用相同接口的不同實例,並分別為其命名
provides {
interface StdControl as fooControl;
interface StdControl as barControl;
}
◇參數化接口允許組件通過運行時或編譯時參數值使用多個該接口的實例
provides interface Timer[uint8_t id];
◇每個Timer可以有256實例,每個實例對應一個8位數字
◇unique、uniqueCount函式
●產生一個唯一的8位數字與參數關聯。
●unique("Timer")是產生一個唯一的數字與Timer串關聯;unique("Timer")與unique("MyTimer")可能產生相同的數;
●uniqueCount返回與參數關聯的數的個數
執行應用程式通用
後台進程 任務的建立和調度 TinyOS提供任務和硬體事件處理兩級調度體系 async關鍵字聲明硬體事件處理的command和event 可以在任意時刻運行 做少量工作,要快速完成 任務用於處理複雜操作,比如後台數據處理,可以被硬體事件處理程式搶占 任務的定義語法 task void taskname() {
... }
taskname是給任務取的符號名字 任務不能有參數,必須返回void 分派任務語法 post taskname();
可以在command中提交任務 可以在event中提交任務 可以在Task中提交任務 post後的任務被放到一個內部FIFO任務佇列 TinyOS學習筆記(4)
CntToLedsAndRfm configuration
CntToLedsAndRfm. nc
----------------------------------------------------------
|configuration CntToLedsAndRfm {
|}
|implementation {
| components Main, Counter, IntToLeds, IntToRfm, TimerC;
|
| Main.StdControl -> Counter.StdControl;
| Main.StdControl -> IntToLeds.StdControl;
| Main.StdControl -> IntToRfm.StdControl;
| Main.StdControl -> TimerC.StdControl;
| Counter.Timer -> TimerC.Timer[unique("Timer")];
| IntToLeds <- Counter.IntOutput;
| Counter.IntOutput -> IntToRfm;
|}
----------------------------------------------------------
◆使用模組Main、Counter、IntToLeds、IntToRfm和TimerC
◆在Main中初始化Counter、IntToLeds、IntToRfm和TimerC
◆都是標準庫
◆Counter處理Timer.fire()事件
◆IntOutput接口
◇output() Command:有一個16位的參數
◇outputComplete() Event:返回一個result_t
◆IntToLeds:在LED上顯示值的低三位
◆IntToRrm:通過Radio廣播
◆Counter使用IntToLeds和IntToRfm的IntOutput接口
◆箭頭總是由使用者指向提供者
傳送訊息
◆TinyOS中的radio通信採用Active Message(AM)模型,網路中的每個包都有一個handler ID,接收結點 會觸發這個ID對應的事件,可以認為這個ID是“連線埠號”,不同的結點可以把不同的事件關聯到相同的handler ID。
◆在訊息傳遞層,成功的通信涉及5個方面
◇標明傳送數據
◇標明接收結點
◇回收與傳送數據相關聯的記憶體
◇快取接收數據
◇處理訊息
IntToRfm configuration
IntToRfm. nc
----------------------------------------------
|configuration IntToRfm
|{
| provides interface IntOutput;
| provides interface StdControl;
|}
|implementation
|{
| components IntToRfmM, GenericComm as Comm;
|
| IntOutput = IntToRfmM;
| StdControl = IntToRfmM;
|
| IntToRfmM.Send -> Comm.SendMsg[AM_INTMSG];
| IntToRfmM.StdControl -> Comm;
|}
----------------------------------------------
◆IntToRfm configuration提供了兩個接口IntOputput和StdControl
◆提供了接口的configuration也成為了組件,可以被其它configuartion使用
◆組件別名
◇使用了GenericComm組件
◇取別名(local name)Comm
◇為了能方便地使用其它通信組件替換GenericComm而不用修改每一處作用該組件的代碼
◆=(equal sign)
◇IntOutput = IntToRfmM
◇StdControl = IntToRfmM
◇模組中左面接口的實現等價於右邊模組中接口的實現
◆AM_INTMSG是定義在tos/lib/Counters/IntMsg.h中的全局常量
IntToRfm module
IntToRfmM. nc
----------------------------------------------------------------
|bool pending;
|struct TOS_Msg data;
|
|
|command result_t IntOutput.output(uint16_t value) {
| IntMsg *message = (IntMsg *)data.data;
|
| if (!pending) {
| pending = TRUE;
|
| message->val = value;
| atomic {
| message->src = TOS_LOCAL_ADDRESS;
| }
|
| if (call Send.send(TOS_BCAST_ADDR, sizeof(IntMsg), &data))
| return SUCCESS;
|
| pending = FALSE;
| }
| return FAIL;
|}
----------------------------------------------------------------
◆IntMsg結構(tos/lib/Counters/IntMsg.h)
◇Field: val
◇Field: src
◆TOS_LOCAL_ADDRESS
◇全局常量
◇代表local source address
◆TOS_BCAST_ADDR
◇全局常量
◇代表radio廣播地址
◆TOS_Msg(tos/system/AM.h)
◇send函式所使用的訊息結構
◇IntMsg是對TOS_Msg的封裝
◆調用Send.send()傳送數據
◇數據分段
◇數據傳完觸發SendMsg.sendDone()事件
◇傳送成功才接收下一個分段訊息佇列
◇傳送不成功就不接受傳輸訊息
◆TinyOS Active Message快取管理
◇允許並發操作
◇遵守嚴格的可選所有者協定,避免太大
記憶體管理開銷
◇message layer接受send()後,管理快取,傳輸完成前不允許請求者再修改快取
◆pending flag
◇跟蹤快取狀態
◇前面的訊息沒發完,則放棄output(),返回FAIL
◇快取可用,則傳送訊息
◆GenericComm網路棧(tos/system/GenericComm. nc)
◇TinyOS generic網路棧的實現
◇使用低級接口實現通信
◇AMStandard實現Active Message的接收與傳送
◇UARTNoCRCPacket實現mote的串口通信
◇RadioCRCPacket實現radio通信
◆RfmToLeds
◇ReceiveMsg接口(tos/interfaces/ReceiveMsg. nc)只定義了一個事件: receive()
◇接收訊息的記憶體管理是動態繼承的
◇Active Message層解碼handler type並進行分派
◇快取被傳遞給程式(通過ReceiveMsg.receive()事件),但關鍵的是,程式必須在處理完後返回指向快取的指針
◇若是要保存訊息內容以後處理,那么應複製訊息內容到新的快取,或向網路棧返回一個新快取的指針
◆底層細節
◇訊息頭中包含group ID,使得多個mote組可以共享同一個radio channel
◇group ID是一個8位數
◇默認group ID是0x7D
◇使用DEFAULT_LOCAL_GROUP改變默認group ID
●DEFAULT_LOCAL_GROUP = 0x42 # for example...
◇使用MakeLocal檔案改變所有程式胡group ID
◇訊息頭帶有16位的目的結點地址
◇組中的每個通信結點在編譯時都分配有惟一一個16位地址
◇TOS_BCAST_ADDR (0xfff)廣播通用地址
◇TOS_UART_ADDR (0x007e)串口通用地址
TOSSIM
◆TOSSIM是直接從TinyOS代碼中編譯而來的TinyOS模擬器
◆可同時模擬上千個運行相同程式的結點
◆可在運行時配置調試輸出信息
Building and Running an Application
◆make pc編譯得到TOSSIM
◆control-C停止模擬
◆默認輸出所有調試信息
◆TOSSIM的最高頻率為40KHZ
增加調試語句
◆Application components和調試的四種保留模式:usr1、usr2、 usr3、和temp
◆調試信息命令
◇語法
●dbg(<mode>, const char* format,
...);
◇<mode>指出以那種DBG模式輸出調試信息
◇tos/types/dbg_modes.h包含全部可用模式
◇其它參數與printf()的參數同語義
特點
Componented-Based Architecture
TinyOS提供一系列可重用的組件,一個應用程式可以通過連線配置檔案(A Wiring Specification)將各種組件連線起來,以完成它所需要的功能。
Event-Driven Architecture
TinyOS的應用程式都是基於事件驅動模式的,採用事件觸發去喚醒感測器工作。
Tasks And Events Concurrency Model
tasks一般用在對於時間要求不是很高的套用中,且tasks之間是平等的,即在執行時是按順序先後來得,而不能互相占先執行,一般為了減少tasks的運行時間,要求每一個task都很短小,能夠使系統的負擔較輕;
events一般用在對於時間的要求很嚴格的套用中,而且它可以占先優於tasks和其他events執行,它可以被一個操作的完成或是來自外部環境的事件觸發,在TinyOS中一般由硬體中斷處理來驅動事件。
Split-Phase Operations
在TinyOS中由於tasks 之間不能互相占先執行,所以TinyOS沒有提供任何阻塞操作,為了讓一個耗時較長的操作儘快完成,一般來說都是將對這個操作的需求和這個操作的完成分開來實現,以便獲得較高的執行效率。
相關圖書
基本信息
書 名:無線感測器網路作業系統TinyOS
作 者:潘浩、董齊芬、張貴軍、俞立等編著
出版時間:2011-8-5
版 次: 1
頁 數: 380
I S B N :9787302257271
包 裝: 平裝
所屬分
類: 圖書 >> 計算機/網路 >> 網路與數據通信
本書首先介紹TinyOS作業系統的相關概念,然後深入解析該作業系統的核心機制,使得有一定基礎的讀者也能得到進一步提高。本書的第1章概述了
無線感測器網路的特徵與現狀,並介紹了TinyOS的體系特點及其發展歷史;第2章指導讀者安裝TinyOS系統並編譯和下載程式到硬體節點上;第3章介紹了nesC程式語言的語法規範以及系統的運行機制;第4~5章介紹並演示了如何使用TinyOS作業系統的主要功能模組;第6~8章介紹了如何進行套用開發,包括平台的移植、仿真、網路協定以及低功耗實現;第9章通過3個基於TinyOS的套用實例,深入講解了如何開發類似的應用程式。
本書語言簡練、淺顯易懂、圖文並茂、脈絡清晰。以實際操作為主導,圍繞TinyOS作業系統的實際套用進行取材謀篇,著重於技術精華的剖析和操作技巧的指點。
本書適用於高等院校信息類專業的本科生、研究生和教師,也可供國內相關研究機構和公司的研發人員參考使用。
目錄
第1章 緒論
第2章 開發環境
第3章 nesC程式語言
第4章 基本操作
第5章 系統核心
第6章 平台與仿真
第7章 網路協定
第8章 高級套用技術
第9章 基於TinyOS的套用開發實例
附錄A nesC語言基本語法
附錄B TinyOS編程技巧
附錄C 英漢對照術語表