TinyOS 學習筆記
上一篇 / 下一篇 2008-02-28 17:18:33 / 个人分类:學習資料
- 文件版本: V1.0
- 开发商: 来源网络
- 文件来源: 本地
- 界面语言: 繁体中文
- 授权方式: 免费
- 运行平台: Win9X/Win2000/WinXP
轉自 http://www.cnblogs.com/TinyOS.mice/archive/2005/02/21/106780.html
TinyOS 學習筆記(1)
概述
◆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關鍵字聲明不檢測,但對其使用應格外小心
TinyOS學習筆記(2)
Module of Sense Application Module of Sense Application
◆ SenseM.nc SenseM.nc
◆提供StdControl接口
◆使用Timer、ADC、StdControl、Leds接口
◇nesC程序中可以使用同一個接口的多個實例
●interface StdControl as ADCControl
●ADCControl是StdControl的實例
◇不提供實例名,則實例名與接口名相同
●interface ADC相當於interface ADC as ADC
Configuration of Sense Application Configuration of Sense Application
◆Sense.nc Sense.nc
◆不提供任何接口
◆使用Main、SenseM、LedsC、TimerC、Photo模塊
◆連接Main.StdControl接口到SenseM.StdControl和TimerC.StdControl
◆連接SenseM.ADC接口到Photo.ADC
◆連接SenseM.ADCControl到Photo.StdControl
◆參數化接口
◇組件可以使用相同接口的不同實例,並分別為其命名
◇參數化接口允許組件通過運行時或編譯時參數值使用多個該接口的實例
provides interface Timer[uint8_t id];
◇每個Timer可以有256實例,每個實例對應一個8位數字
◇unique、uniqueCount函數
●產生一個唯一的8位數字與參數關聯。
●unique("Timer")是產生一個唯一的數字與Timer串關聯;unique("Timer")與unique("MyTimer")可能產生相同的數;
●uniqueCount返回與參數關聯的數的個數
TinyOS學習筆記(3)
任務
◆執行應用程序通用後台進程
◆任務的建立和調度
◇TinyOS提供任務和硬件事件處理兩級調度體系
◇async關鍵字聲明硬件事件處理的command和event
◇可以在任意時刻運行
◇做少量工作,要快速完成
◆任務用於處理複雜操作,比如後台數據處理,可以被硬件事件處理程序搶占
◆任務的定義語法
task void taskname() { ... }
taskname是給任務取的符號名字
◆任務不能有參數,必須返回void
◆分派任務語法
post taskname();
◇可以在command中提交任務
◇可以在event中提交任務
◇可以在Task中提交任務
◇post後的任務被放到一個內部FIFO任務隊列
TinyOS學習筆記(4)
CntToLedsAndRfm configuration
CntToLedsAndRfm.nc
◆使用模塊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 configuration
IntToRfm.nc IntToRfm.nc
◆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 IntToRfm module
IntToRfmM.nc IntToRfmM.nc
◆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)串口通用地址
TinyOS學習筆記(5)
TOSSIM
◆TOSSIM是直接從TinyOS代碼中編譯而來的TinyOS模擬器
◆運行於桌面電腦和筆記本上
◆可同時模擬上千個運行相同程序的結點
◆可在運行時配置調試輸出信息
Building and Running an Application
◆make pc編譯得到TOSSIM
◆TOSSIM可執行文件是build/pc/main.exe
◆control-C停止模擬
◆默認輸出所有調試信息
◆TOSSIM的最高頻率為40KHZ
增加調試語句
◆Application components和調試的四種保留模式:usr1、usr2、 usr3、和temp
◆調試信息命令
◇語法
●dbg(<mode>, const char* format, ...);
◇<mode>指出以那種DBG模式輸出調試信息
◇tos/types/dbg_modes.h包含全部可用模式
◇其它參數與printf()的參數同語義
TinyOS 學習筆記(1)
概述
◆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關鍵字聲明不檢測,但對其使用應格外小心
TinyOS學習筆記(2)
Module of Sense Application Module of Sense Application
◆ SenseM.nc SenseM.nc
| 代碼: |
| ------------------------------------------------ |module SenseM{ |provides{ | interfaceStdControl; |} |uses{ | interfaceTimer; | interfaceADC; | interface StdControl as ADCControl; | interfaceLeds; |} |} ------------------------------------------------ |
◆提供StdControl接口
◆使用Timer、ADC、StdControl、Leds接口
◇nesC程序中可以使用同一個接口的多個實例
●interface StdControl as ADCControl
●ADCControl是StdControl的實例
◇不提供實例名,則實例名與接口名相同
●interface ADC相當於interface ADC as ADC
Configuration of Sense Application Configuration of Sense Application
◆Sense.nc 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學習筆記(3)
任務
◆執行應用程序通用後台進程
◆任務的建立和調度
◇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 configuration
IntToRfm.nc IntToRfm.nc
| 代碼: |
| ---------------------------------------------- |configurationIntToRfm |{ | provides interfaceIntOutput; | 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 IntToRfm module
IntToRfmM.nc IntToRfmM.nc
| 代碼: |
| -------------------------------------------------- -------------- |boolpending; |struct TOS_Msgdata; | |/* ...*/ | |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)) | returnSUCCESS; | | pending =FALSE; |} | returnFAIL; |} -------------------------------------------------- -------------- |
◆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)串口通用地址
TinyOS學習筆記(5)
TOSSIM
◆TOSSIM是直接從TinyOS代碼中編譯而來的TinyOS模擬器
◆運行於桌面電腦和筆記本上
◆可同時模擬上千個運行相同程序的結點
◆可在運行時配置調試輸出信息
Building and Running an Application
◆make pc編譯得到TOSSIM
◆TOSSIM可執行文件是build/pc/main.exe
◆control-C停止模擬
◆默認輸出所有調試信息
◆TOSSIM的最高頻率為40KHZ
增加調試語句
◆Application components和調試的四種保留模式:usr1、usr2、 usr3、和temp
◆調試信息命令
◇語法
●dbg(<mode>, const char* format, ...);
◇<mode>指出以那種DBG模式輸出調試信息
◇tos/types/dbg_modes.h包含全部可用模式
◇其它參數與printf()的參數同語義
TAG:

