




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第九章物聯(lián)網(wǎng)中的常用嵌入式系統(tǒng)
第九章物聯(lián)網(wǎng)中的常用嵌入式系統(tǒng)1本章主要內(nèi)容9.1TinyOS簡介9.2安裝TinyOS9.3nesC簡介9.4TinyOS內(nèi)部機(jī)制簡介思考與習(xí)題本章主要內(nèi)容29.1TinyOS簡介9.1.1TinyOS概述9.1.2TinyOS的特點9.1.3TinyOS開發(fā)平臺9.1.4TinyOS開發(fā)案例9.1.5TinyOS的基本概念回本章目錄9.1TinyOS簡介9.1.1TinyOS概述9.1.39.1.1TinyOS概述TinyOS操作系統(tǒng)采用了組件的結(jié)構(gòu)。系統(tǒng)本身提供了一系列的組件供用戶調(diào)用,其中包括主組件、應(yīng)用組件、執(zhí)行組件、傳感組件、通信組件和硬件抽象組件,如下圖9-1所示。組件由下到上可分為3類:硬件抽象組件、綜合硬件組件和高層軟件組件。①硬件抽象組件將物理硬件映射到TinyOS的組件模型;②綜合硬件組件模擬高級的硬件行為,如感知組件、通信組件等;③高層次的軟件組件實現(xiàn)控制、路由以及數(shù)據(jù)傳輸?shù)葢?yīng)用層的功能。圖9-1TinyOS的組件結(jié)構(gòu)回本章目錄9.1.1TinyOS概述圖9-1TinyOS的組件結(jié)4每個TinyOS程序應(yīng)當(dāng)具有至少一個應(yīng)用組件,即用戶組件。該應(yīng)用組件通過接口調(diào)用下層組件提供的服務(wù),實現(xiàn)針對特定應(yīng)用的具體邏輯功能,如數(shù)據(jù)采集、數(shù)據(jù)處理、數(shù)據(jù)收發(fā)等。一個完整的應(yīng)用系統(tǒng)由一個內(nèi)核調(diào)度器(簡稱調(diào)度器)和許多功能獨立且相互聯(lián)系的組件構(gòu)成,可以把TinyOS系統(tǒng)和在其上運行的應(yīng)用程序看成是一個大的“執(zhí)行程序”?,F(xiàn)有的TinyOS系統(tǒng)提供了大多數(shù)傳感網(wǎng)硬件平臺和應(yīng)用領(lǐng)域里都可用到的組件,例如定時器組件、傳感器組件、消息收發(fā)組件、電源管理組件等,從而把用戶和底層硬件隔離開來。在此基礎(chǔ)上,用戶只需開發(fā)針對特殊硬件和特殊應(yīng)用需求的少量組件,大大提高了應(yīng)用的開發(fā)效率。TinyOS設(shè)計之初的目的是制作一個專屬嵌入式無線傳感器網(wǎng)絡(luò)的操作系統(tǒng)。但事實上,由于良好的可擴(kuò)展性和足夠小的代碼尺寸,TinyOS在物聯(lián)網(wǎng)的應(yīng)用領(lǐng)域中也占有非常重要的地位。每個TinyOS程序應(yīng)當(dāng)具有至少一個應(yīng)用組件,即用戶組件。該5由于無線傳感器網(wǎng)絡(luò)的特殊性,研究人員在設(shè)計TinyOS系統(tǒng)時就提出以下幾個原則:①能在有限的資源上運行:要求執(zhí)行模式允許在單一的協(xié)議棧上運行;②允許高度的并發(fā)性:要求執(zhí)行模式能對事件作出快速的直接響應(yīng);③適應(yīng)硬件升級:要求組件和執(zhí)行模式能夠應(yīng)對硬件/軟件的替換;④支持多樣化的應(yīng)用程序:要求能夠根據(jù)實際需要,裁減操作系統(tǒng)的服務(wù);⑤魯棒性強(qiáng):要求通過組件間有限的交互渠道,就能應(yīng)對各種復(fù)雜情況;⑥支持一系列平臺:要求操作系統(tǒng)的服務(wù)具有可移植性。由于無線傳感器網(wǎng)絡(luò)的特殊性,研究人員在設(shè)計TinyOS系統(tǒng)時6TinyOS操作系統(tǒng)采用的輕量級線程技術(shù)、兩層調(diào)度方式、事件驅(qū)動模式、主動消息通信技術(shù)及組件化編程等有效地提高了傳感器節(jié)點cpu的使用率,有助于省電操作并簡化了應(yīng)用的開發(fā)。TinyOS系統(tǒng)、庫和基于TinyOS的應(yīng)用基本上都是用nesC語言開發(fā)的,在TinyOS中采用nesC語言進(jìn)行應(yīng)用程序開發(fā)。在TinyOS中,應(yīng)用程序開發(fā)人員可以通過nesC語言表達(dá)組件以及組件之間的事件/命令接口。組件分為配置文件和模塊,程序的流程是通過配置文件中接口的連接實現(xiàn)而構(gòu)建起來的,而具體實現(xiàn)的邏輯功能是通過模塊完成的。每個模塊由一組命令和事件組成,這些命令和事件成為該模塊的接口。一般來說,上層組件對下層組件發(fā)命令,下層組件發(fā)信號通知事件的發(fā)生,最底層的組件直接和硬件交互,從而自上到下形成一種樹狀結(jié)構(gòu)。TinyOS操作系統(tǒng)采用的輕量級線程技術(shù)、兩層調(diào)度方式、事件7TinyOS的并行處理能力通過任務(wù)(task)和中斷處理事件(interrupthanderevent)來體現(xiàn)。任務(wù)會加入一個FIFO隊列中,在執(zhí)行過程中,任務(wù)間沒有競爭;但中斷處理程序可以打斷任務(wù)執(zhí)行。TinyOS采用二級調(diào)度機(jī)制來滿足無線傳感網(wǎng)絡(luò)運行特點,整個程序調(diào)度過程如圖9-2所示。組件中完成任務(wù)提交,由操作系統(tǒng)完成調(diào)度。一個節(jié)點上應(yīng)用程序的框圖如圖9-3所示,操作系統(tǒng)只是在后臺提供隊列服務(wù)。圖9-2TinyOS程序調(diào)度
圖9-3一個節(jié)點上應(yīng)用程序的框圖TinyOS的并行處理能力通過任務(wù)(task)和中斷處理事件8與uCOS-II相比,Tiny-OS基于事件驅(qū)動的機(jī)制就決定了其實時性不高,編程復(fù)雜,但其內(nèi)核占用空間極小,而uCOS-II是基于線程模式的,編程簡單,實時性高,但相對帶來的開銷也大。表9-2比較了Tiny-OS與uCOS-II。操作系統(tǒng)TinyOSuCOS-II運行模式事件線程搶占式內(nèi)核否是時間可確定性否是支持動態(tài)編程否否(最小)內(nèi)核RAM:47B,ROM:473BRAM:300B,ROM:2kB低功耗是否表9-2Tiny-OS與uCOS-II的比較與uCOS-II相比,Tiny-OS基于事件驅(qū)動的機(jī)制就決定99.1.2TinyOS的特點回本章目錄9.1.2TinyOS的特點回本章目錄10commandvoidtaskLoop();interfaceBoot{/opt/TinyOS-2.形象的稱為命令,即為接口提供的可供調(diào)用的命令。系統(tǒng)本身提供了一系列的組件供用戶調(diào)用,其中包括主組件、應(yīng)用組件、執(zhí)行組件、傳感組件、通信組件和硬件抽象組件,如下圖9-1所示。moduleM2{一個組件使用了一個接口,它可以調(diào)用這個接口的命令,但必須實現(xiàn)其事件。本章主要內(nèi)容usesinterfaceA1;③一個module可以同時提供一組相同的接口,又稱參數(shù)化接口,表明該Module可提供多份同類資源,能夠同時給多個組件分享。配件(configuration)是一個完整的配置列表,配件可以像模塊一樣使用外部的接口并且對外提供接口。eventvoidA1.nx_uint8_tdata[TOSH_DATA_LENGTH];//有效載荷區(qū)事件處理字階級組件傳遞的解碼數(shù)據(jù),主要是通過Post一個任務(wù)進(jìn)行CRC檢查。配件(configuration)是一個完整的配置列表,配件可以像模塊一樣使用外部的接口并且對外提供接口。表9-3環(huán)境變量的配置連接的箭頭是也可以對稱反過來,如“BlinkC.nesC的組件模型如圖9-10。一個nesC語言編寫的程序由一個或多個組件(component)構(gòu)成或連接而成。④通過任務(wù)和事件來管理并發(fā)進(jìn)程TinyOS的應(yīng)用程序都是基于事件驅(qū)動模式的,采用事件觸發(fā)去喚醒傳感器工作。事件相當(dāng)于不同組件之間傳遞狀態(tài)信息的信號。當(dāng)事件對應(yīng)的硬件中斷發(fā)生時,系統(tǒng)能夠快速地調(diào)用相關(guān)的事件處理程序。任務(wù):一般用在對于時間要求不是很高的應(yīng)用中,且任務(wù)之間是平等的,即在執(zhí)行時是按順序先后來得,而不能互相占先執(zhí)行,一般為了減少任務(wù)的運行時間,要求每一個任務(wù)都很短小,能夠使系統(tǒng)的負(fù)擔(dān)較輕;支持網(wǎng)絡(luò)協(xié)議的替換。事件:一般用在對于時間的要求很嚴(yán)格的應(yīng)用中,而且它可以占先優(yōu)于任務(wù)和其他事件執(zhí)行,它可以被一個操作的完成或是來自外部環(huán)境的事件觸發(fā),在TinyOS中一般由硬件中斷處理來驅(qū)動事件。⑤支持網(wǎng)絡(luò)協(xié)議組件的替換除了默認(rèn)的協(xié)議之外,還提供其他協(xié)議供用戶替換,并且支持客戶自定義協(xié)議,這對于通信協(xié)議分析,非常適用于通信協(xié)議的研究工作。commandvoidtaskLoop();④通過任務(wù)11⑥代碼短小精悍TinyOS的程序采用的是模塊化設(shè)計,所以它的程序核心往往都很小,一般來說核心代碼和數(shù)據(jù)大概在400Bytes左右;能夠突破傳感器存儲資源少的限制,這能夠讓TinyOS很有效的運行在無線傳感器網(wǎng)絡(luò)上并去執(zhí)行相應(yīng)的管理工作等。⑥代碼短小精悍129.1.3TinyOS開發(fā)平臺國內(nèi)目前可以買到的TinyOS開發(fā)平臺主要有兩種,一種是Crossbow公司W(wǎng)SN開發(fā)套件,一種億道電子的XSBase-WSN開發(fā)套件;Crossbow本身就是TinyOS聯(lián)盟的成員之一,其所有產(chǎn)品都在TinyOS源碼的Platform目錄下可以找到,可以算得上是TinyOS技術(shù)商用化的代表;在國內(nèi)有一家代理,開發(fā)平臺的做工非常不錯,產(chǎn)品覆蓋面也比較廣,主要的缺點就是產(chǎn)品太貴,而且中文的資料較少。億道電子的WSN套件使用的是較先進(jìn)CC2430芯片,同時支持TinyOS和Z-stack兩種開發(fā)方式,并且包含大量的中文教材和使用手冊,硬件移植的也非常穩(wěn)定,所有的TinyOS測試用例都能正常運行,而且還帶了大量的中文教材、使用手冊和實驗用例,其中值得一提的是,該產(chǎn)品搭建了一整套的解決方案框架,實現(xiàn)了異構(gòu)網(wǎng)絡(luò)之間的互聯(lián)互通,可以在任何一地通過GPRS手機(jī)上網(wǎng),訪問節(jié)點上的物理數(shù)據(jù),開發(fā)者可以迅速的在這個框架下做二次開發(fā)?;乇菊履夸?.1.3TinyOS開發(fā)平臺國內(nèi)目前可以買到的TinyO139.1.4TinyOS開發(fā)案例目前有多個采用TinyOS的研究項目,如UCLA(加州大學(xué)洛杉磯分校)的ShahinFarshchi在進(jìn)行一項以TinyOS為基礎(chǔ)的無線神經(jīng)界面研究。這樣的系統(tǒng)在100Hz/頻道的采樣頻率下可傳感、放大、傳輸神經(jīng)信號,系統(tǒng)小巧、成本低、重量輕、功率小。系統(tǒng)要求一個接收器接收、解調(diào)、顯示傳輸?shù)纳窠?jīng)信號。在采樣精度為8bit時,系統(tǒng)的速度可達(dá)5600。該速度可保證8個EEG頻道、或1個速度為每秒采樣頻道的可靠傳輸。研究者目前的奮斗目標(biāo)是提高該基于TinyOS的傳感網(wǎng)絡(luò)的數(shù)據(jù)傳輸速度,設(shè)計與被測對象連接的前端神經(jīng)放大電路。
路易斯安娜州立大學(xué)和位于BatonRouge的南方大學(xué)的Nian-FengTzeng博士正在研究應(yīng)用于石油/氣體開發(fā)和管理的UcoMS(UbiquitousComputingandMonitoringSystem,泛計算和監(jiān)控系統(tǒng))。該系統(tǒng)適用于傳感網(wǎng)絡(luò)、無線通信和網(wǎng)格計算,主要功能包括幫助鉆孔、操作數(shù)據(jù)記錄和處理、在線平臺信息發(fā)布和顯示、設(shè)備監(jiān)控/入侵檢測、地震處理、復(fù)雜表面設(shè)備和管道的管理。也可使用UCoMS監(jiān)控、維護(hù)淘汰的平臺。
另外,F(xiàn)reescale正在其Zigbee開發(fā)板上測試TinyOS和TinyDB,波士頓大學(xué)的WeiLi將其用于傳感網(wǎng)絡(luò)的控制和優(yōu)化?;乇菊履夸?.1.4TinyOS開發(fā)案例目前有多個采用TinyOS的149.1.5TinyOS的基本概念TinyOS系統(tǒng)、庫及應(yīng)用程序都是用nesC語言寫的語言寫的,這時一種新的用于編寫結(jié)構(gòu)化的基于組件的應(yīng)用程序的語言。nesC語言主要用于諸如傳感器網(wǎng)絡(luò)等嵌入式系統(tǒng)。nesC具有類似于C語言的語法,但支持TinyOS的并發(fā)模型,同時具有結(jié)構(gòu)化機(jī)制、命名機(jī)制,能夠與其他軟組件鏈接在一起從而形成一個魯棒的網(wǎng)絡(luò)嵌入式系統(tǒng)。其主要目標(biāo)是幫助應(yīng)用程序設(shè)計者建立可易于組合成完整、并發(fā)式系統(tǒng)的組件,并能夠在編譯時執(zhí)行廣泛的檢查。TinyOS定義了許多在nesC中所表達(dá)的重要概念。首先,nesC應(yīng)用程序要建立在定義良好、具有雙向接口的組件之上。其次,nesC定義了并發(fā)模型,該模型是基于任務(wù)(task)及硬件事件句柄(hardwareeventhandler)的,在編譯時會檢測數(shù)據(jù)爭用(datarace)。回本章目錄9.1.5TinyOS的基本概念TinyOS系統(tǒng)、庫及15⑴組件任何一個nesC應(yīng)用程序都是有一個或多個組件鏈接起來,從而形成一個完整的可執(zhí)行程序的。組件提供(provide)并使用(use)接口。這些接口是組件的唯一訪問點并且它們是雙向的。接口聲明了一組函數(shù),稱為命令(command),接口的提供者必須實現(xiàn)它們;還聲明了另外一組函數(shù),稱為事件(event),接口的使用者必須實現(xiàn)它們。對于一個組件而言,如果它要使用某個接口中的命令,它必須實現(xiàn)這個接口的事件。一個組件可以使用或提供多個接口以及同一個接口的多個實例。在nesC中有兩種類型的組件,分別稱為模塊(module)和配件(configuration)。模塊提供應(yīng)用程序代碼,實現(xiàn)一個或多個接口;配件則是用來將其它組件裝配起來的組件,將各個組件所使用的接口與其它組件提供的接口連接在一起。這種行為稱為導(dǎo)通(wiring)。每個nesC應(yīng)用程序都由一個頂級配置所描述,其內(nèi)容就是將該應(yīng)用程序所用到的所有組件導(dǎo)通起來,形成一個有機(jī)整體。
⑴組件16⑵并發(fā)模型TinyOS一次僅執(zhí)行一個程序。組成程序的組件來自于兩個方面,一部分是系統(tǒng)提供的組件,另一部分是為特定應(yīng)用用戶自定義的組件。程序運行時,有兩個執(zhí)行線程:一個稱為任務(wù)(task),另一個稱為硬件事件句柄(hardwareeventhandler)。任務(wù)是被延期執(zhí)行的函數(shù),它們一旦被調(diào)度,就會運行直至結(jié)束,并且在運行過程中不準(zhǔn)相互搶占。硬件事件句柄是用來相應(yīng)和處理硬件中斷的,雖然也要運行完畢,但它們可能會搶占任務(wù)或其他硬件事件句柄的執(zhí)行。命令和事件要作為硬件事件句柄的一部分而執(zhí)行必須使用關(guān)鍵字async來聲明。
因為任務(wù)和硬件事件句柄可能被其他異步代碼所搶占,所以nesC程序易于受到特定競爭條件的影響,導(dǎo)致產(chǎn)生不一致或不正確的數(shù)據(jù)。避免競爭的辦法通常是在任務(wù)內(nèi)排他地訪問共享數(shù)據(jù),或訪問所有數(shù)據(jù)都使用原子語句。nesC編譯器會在編譯時向程序員報告潛在的數(shù)據(jù)爭用,這里面可能包含事實上并不可能發(fā)生的沖突。如果程序員確實可以擔(dān)保對某個數(shù)據(jù)的訪問不會導(dǎo)致麻煩,可以將該變量使用關(guān)鍵字norace來聲明,但使用這個關(guān)鍵字一定要格外小心。⑵并發(fā)模型179.2安裝TinyOS回本章目錄9.2安裝TinyOS回本章目錄18圖9-4設(shè)置JAVA_HOME環(huán)境變量②新建系統(tǒng)變量CLASSPATH:設(shè)置類的路徑CLASSPATH=.;%JAVA_HOME%\jre\lib\rt.jar;%JAVA_HOME%\lib\tools.jar;%JAVA_HOME%\lib\dt.jar最前面加上”.”和”;”,意為首先在當(dāng)前目錄中查找,如圖9-5所示。圖9-5設(shè)置CLASSPATH環(huán)境變量圖9-4設(shè)置JAVA_HOME環(huán)境變量②新建系統(tǒng)變量C19③在系統(tǒng)變量中找到Path:將%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;添加到最前面即可。至此JDK安裝過程結(jié)束,可以自行編寫一個測試程序。在D盤根目錄下新建文件夾javatest,然后創(chuàng)建文本文件,將下面的代碼拷入并保存成文件,注意文件名要與類名相一致。publicclassTest{ publicstaticvoidmain(String[]args) { System.out.println("HelloWorld!"); }}然后再使用cmd命令進(jìn)入命令行,并進(jìn)入該目錄下,嘗試使用如下命令編譯并執(zhí)行該java程序,如果然后屏幕上會打印出”HelloWorld!”,則表示JDK安裝成功。javaTest③在系統(tǒng)變量中找到Path:將%JAVA_HOME%\bi20圖9-6選擇安裝類型圖9-6選擇安裝類型21①硬件抽象組件將物理硬件映射到TinyOS的組件模型;interfaceScheduler{一個組件可以使用(use)或提供(provide)多個接口或者同一接口的多個實例?;乇菊履夸沬nclude$(MAKERULES)該內(nèi)容要放在中,SendMsg接口類型提供者必須實現(xiàn)send,而使用者必須實現(xiàn)sendDone事件。componentsM2;commandboolrunNextTask(boolsleep);implementation{TOSSIM模擬器提供運行時調(diào)試輸出信息,允許用戶從不同角度分析和觀察程序的執(zhí)行過程。大致看來,在TinyOS的通訊經(jīng)歷的組件流程如圖9-13所示usesinterfaceA1;usesinterfaceB1;/opt/TinyOS-2.TOSHruntask();語法結(jié)構(gòu)類似于C語言,只是在最前面增加event關(guān)鍵字。硬件事件句柄是用來相應(yīng)和處理硬件中斷的,雖然也要運行完畢,但它們可能會搶占任務(wù)或其他硬件事件句柄的執(zhí)行。接口SendMsg中包含commandssend和eventssenddone。c-otest就可以編譯該程序。8位無符號數(shù):uint8_t⑶TinyOS的程序運行機(jī)制③選擇安裝目錄時,在DefaultTextFileType中要選擇Unix/binary,如圖9-7。圖9-7選擇安裝目錄①硬件抽象組件將物理硬件映射到TinyOS的組件模型;③22④然后在選擇需要安裝的工具時,全部選中,用鼠標(biāo)點擊“default”變成“install”。⑤最后點擊安裝來開始安裝,整個過程需要較長時間。⑶安裝單片機(jī)工具可以選擇AVR或MSP430等,根據(jù)自己的需要安裝。如果選擇AVR,則需要下面幾個包:avr-binutils、avr-gcc、avr-libc、avarice、insight(avr-gdb)、avrdude,這幾個包的下載地址在本節(jié)開始提到的網(wǎng)站中可以找到,需要注意的是,在cygwin和Linux下下載的包是不一樣的。⑷安裝nesC和TinyOS_tool這一步需要安裝NesC、Deputy、TinyOS-tools三個包,這幾個包的下載地址在本節(jié)開始提到的網(wǎng)站中可以找到,這里同樣需要需要在cygwin和Linux下下載的包是不一樣的,使用Linux的rpm命令來安裝這些包。④然后在選擇需要安裝的工具時,全部選中,用鼠標(biāo)點擊“def23環(huán)境變量cygwin下的配置Linux下的配置TOSROOT/opt/TinyOS-2.x同cygwin下的配置TOSDIR$TOSROOT/tos同cygwin下的配置CLASSPATHC:\cygwin\opt\TinyOS-2.x\support\sdk\java\TinyOS.jar;.$TOSROOT/support/sdk/java/TinyOS.jar:.MAKERULES$TOSROOT/support/make/Makerules同cygwin下的配置PATH/opt/msp430/bin:/opt/jflashmm:$PATH同cygwin下的配置表9-3環(huán)境變量的配置環(huán)境變量cygwin下的配置Linux下的配置TOSROOT24⑹安裝Graphviz⑹安裝Graphviz259.3nesC簡介9.3.1nesC概述9.3.2nesC基本概念9.3.3一個簡單的nesC編程示例9.3.4TOSSIM仿真回本章目錄9.3nesC簡介9.3.1nesC概述9.3.2ne269.3.1nesC概述nesC語言是一種在C基礎(chǔ)上擴(kuò)展的編程語言,主要用于傳感器網(wǎng)絡(luò)的編程開發(fā),這類系統(tǒng)的特點是內(nèi)存有限,存在任務(wù)和中斷兩類操作。nesC語言由加州大學(xué)伯克利分校研發(fā)人員開發(fā)。TinyOS最初是用匯編和C語言編寫的,后來改用支持組件化編程的nesC語言。該語言把組件化/模塊化思想和基于事件驅(qū)動的執(zhí)行模型結(jié)合起來。nesC使用C作為其基礎(chǔ)語言,支持所有的C語言詞法和語法,其獨有的特色如下:①增加了組件(component)和接口(interface)的關(guān)鍵字定義;②定義了接口及如何使用接口表達(dá)組件之間關(guān)系的方法;③目前只支持組件的靜態(tài)連接,不能實現(xiàn)動態(tài)連接和配置?;乇菊履夸?.3.1nesC概述回本章目錄27圖9-8所示是nesC語言的一般程序框架。該系統(tǒng)中的一個組件一般會提供一些接口(假定組件名為ComA),接口可以被認(rèn)為是這個軟件組件實現(xiàn)的一組函數(shù)的聲明,是單獨定義的一組命令和事件,其他組件通過引用相同接口聲明來使用這個組件(ComA)的函數(shù),從而實現(xiàn)組件間功能的相互調(diào)用,即組件的接口是實現(xiàn)組件間互連的通道。但若組件中實現(xiàn)的函數(shù)并未被它在接口中說明,就不能被其他組件所使用。nesC語言的定義中存在兩種不同功能的組件:其中組件接口中的函數(shù)功能專門在模塊的組件文件中實現(xiàn),而不同組件之間的關(guān)系則是專門通過稱為配件的組件文件來描述的。圖9-8基于nesC語言的一般程序框架圖圖9-8所示是nesC語言的一般程序框架。該系統(tǒng)中的一個組件28
為了跨平臺使用,變量的類型和標(biāo)準(zhǔn)C語言的int、long和char不一樣。TinyOS代碼使用的是更清楚直接的類型,直接聲明字節(jié)大小。事實上,這些能映射到基本的C類型,在不同的平臺上是不同的映射,大多數(shù)平臺支持浮點數(shù)運算,double可能不行。對于整形,nesC的定義如下:8位帶符號數(shù):int8_t8位無符號數(shù):uint8_t16位帶符號數(shù):int16_t16位無符號數(shù):uint16_t32位帶符號數(shù):int32_t32位無符號數(shù):uint32_t雖然可以給應(yīng)用程序中的模塊和配件取任意的名稱,但為了簡便,建議在編寫代碼時使用如表9-4所示的統(tǒng)一的命名格式。為了跨平臺使用,變量的類型和標(biāo)準(zhǔn)C語言的int、long29表9-4nesC程序的命名最后簡單介紹一下使用nesC編程的流程,nesC語言開發(fā)應(yīng)用程序的一般步驟如圖9-9所示。圖9-9使用nesC編程的流程表9-4nesC程序的命名最后簡單介紹一下使用nesC編309.3.2nesC基本概念⑴組件一個nesC語言編寫的程序由一個或多個組件(component)構(gòu)成或連接而成。一個組件由兩部分組成:第一個部分是規(guī)范說明,包含要用接口的名字;另一部分是它們的實現(xiàn)。一個組件可以提供接口(provides),也可以使用接口(uses),提供的接口描述了該組件提供給上一層調(diào)用者的功能,而使用的接口則表示了該組件本身工作時需要的功能。組件分兩種:Module組件(模塊)用于實現(xiàn)某種邏輯功能;Configuration組件(配件)用于將各個組件連接起來成為一個整體。組件特征的特征是組件內(nèi)變量、函數(shù)可以自由訪問,但組件之間不能訪問和調(diào)用。nesC的組件模型如圖9-10?;乇菊履夸?.3.2nesC基本概念⑴組件回本章目錄31⑵接口接口是一組相關(guān)函數(shù)的集合,它是雙向的并且是組件間的唯一訪問點。由于大多數(shù)的節(jié)點平臺沒有基于硬件的內(nèi)存保護(hù)措施,也沒有將用戶地址空間和系統(tǒng)地址空間分離開,只有一個所有組件都能共享的地址空間。最好的辦法就是保持內(nèi)存盡可能少的共享。組件聲明的任何狀態(tài)變量都是私有的:沒有任何其他組件可以對它進(jìn)行命名或者直接訪問它。兩個組件直接交互的唯一方式是通過接口。接口聲明了兩種函數(shù):圖9-10TinyOS的組件模型⑵接口圖9-10TinyOS的組件模型32在中,SchedulerBasicP是主要的TinyOS調(diào)度器,提供帶參數(shù)的TaskBasic接口。$TOSROOT/support/make/Makerules連接的箭頭是也可以對稱反過來,如“BlinkC.接口SendMsg和ReceiveMsg都是參數(shù)化接口,參數(shù)id就是前面說的handlerid。在采樣精度為8bit時,系統(tǒng)的速度可達(dá)5600。①provides未必一定有組件使用,但uses一定要有人提供,否則編譯會提示出錯。⑶TinyOS的程序運行機(jī)制與uCOS-II相比,Tiny-OS基于事件驅(qū)動的機(jī)制就決定了其實時性不高,編程復(fù)雜,但其內(nèi)核占用空間極小,而uCOS-II是基于線程模式的,編程簡單,實時性高,但相對帶來的開銷也大。nesC使用箭頭“->”來綁定一個接口到另一個接口,但一定要是同一類接口。TinyOS在某些場合因?qū)崟r性比較差,會出現(xiàn)任務(wù)過載、任務(wù)阻塞、任務(wù)隊列溢出、通信吞吐量下降等一系列問題,從而導(dǎo)致系統(tǒng)崩潰,在這種情況下,需進(jìn)一步改進(jìn)TinyOS實時性、并發(fā)性及移植性,并通過完善其整體架構(gòu)來提高其綜合性能。硬件事件句柄是用來相應(yīng)和處理硬件中斷的,雖然也要運行完畢,但它們可能會搶占任務(wù)或其他硬件事件句柄的執(zhí)行。消息的發(fā)送涉及組件、接口和事件三方面,當(dāng)上層組件有消息發(fā)送時通過接口調(diào)用下層組件來實現(xiàn)。這里需要將頂層的配置放到COMPONENT中。$TOSROOT/support/make/Makerules3一個簡單的nesC編程示例此確認(rèn)消息是在主動消息層的最底層生成,其內(nèi)容是一個特殊立即序列,發(fā)送方可迅速確定是否需重發(fā)消息。若任務(wù)隊列為空,CPU進(jìn)入休眠狀態(tài)以降低功耗。providesinterfaceA1;路易斯安娜州立大學(xué)和位于BatonRouge的南方大學(xué)的Nian-FengTzeng博士正在研究應(yīng)用于石油/氣體開發(fā)和管理的UcoMS(UbiquitousComputingandMonitoringSystem,泛計算和監(jiān)控系統(tǒng))。cmd1(0x11);①命令(command):接口的提供者必須實現(xiàn)它們;②事件(event):接口的使用者必須實現(xiàn)它們。也就是說,提供了接口的組件必須實現(xiàn)該接口的命令函數(shù);而使用了某接口的組件必須實現(xiàn)該接口的事件函數(shù)。函數(shù)調(diào)用時,命令用call,事件用signal,在一個組件中,provides的接口中的command函數(shù)必須被實現(xiàn)(在implementation中定義),uses的接口中的event函數(shù)必須被實現(xiàn)。async指出這個command或者event可以在有中斷時使用。如果一個組件調(diào)用了(call)的一個接口命令,必須實現(xiàn)該接口的事件。一個組件可以使用(use)或提供(provide)多個接口或者同一接口的多個實例。在中,SchedulerBasicP是主要的TinyOS調(diào)度33接口的特點是:①provides未必一定有組件使用,但uses一定要有人提供,否則編譯會提示出錯。在動態(tài)組件配置語言中uses也可以動態(tài)配置。②接口可以連接多個同樣的接口,叫做多扇入/扇出。③一個module可以同時提供一組相同的接口,又稱參數(shù)化接口,表明該Module可提供多份同類資源,能夠同時給多個組件分享。可以按照下面的方法定義接口:①接口放在一個單獨的文件中*.nc②接口的名稱應(yīng)與文件名對應(yīng),例如interface1的接口必須對應(yīng)于文件名。③接口定義描述了一系列函數(shù)原型(command和event)接口的特點是:34一個簡單地接口如下:interfaceSendMsg{commandresult_tsend(uint16_taddress,uint8_tlength,TOS_MsgPtrmsg);eventresult_tsendDone(TOS_MsgPtrmsg,result_tsuccess);}該內(nèi)容要放在中,SendMsg接口類型提供者必須實現(xiàn)send,而使用者必須實現(xiàn)sendDone事件。nesC使用箭頭“->”來綁定一個接口到另一個接口,但一定要是同一類接口。例如“A->B”意為A連接到B,A是接口的使用者(user),而B是接口的提供者(provider)。完整的表達(dá)式應(yīng)該為:A.a->B.b,這意味著,組件A的接口a連接到組件B的接口b。當(dāng)一個組件使用或者提供同一個接口的多個不同實例時,設(shè)置別名就非常有必要了。當(dāng)一個組件只含有一個接口的時候,就可以省略接口的名字了。連接的箭頭是也可以對稱反過來,如“BlinkC.Timer0->Timer0”同“Timer0<-BlinkC.Timer0;”等價,但為了方便閱讀,大多數(shù)連接的箭頭還是從左到右的。一個組件使用了一個接口,它可以調(diào)用這個接口的命令,但必須實現(xiàn)其事件。調(diào)用接口命令需要關(guān)鍵字“call”,調(diào)用接口事件需要關(guān)鍵字“signal”。一個簡單地接口如下:35⑶模塊模塊(module)提供一個或多個接口的實現(xiàn)。模塊是接口的實現(xiàn)者和使用者,模塊名也必須與文件名同名,模塊包含兩部分內(nèi)容:①模塊使用和提供的接口描述②模塊內(nèi)部的實現(xiàn)代碼下面是一個模塊的示例,該模塊要放置到中。moduleM1{/*聲明部分*/providesinterfaceA1;usesinterfaceB1;}implementation{/*實現(xiàn)部分,C代碼*/commandvoidA1.cmd1(){callB1.cmd2();}eventvoidA1.event1(){…}}⑶模塊36⑷配件配件(configuration)是一個完整的配置列表,配件可以像模塊一樣使用外部的接口并且對外提供接口。組件名也必須與文件名同名,同模塊一樣,配件也包含兩部分內(nèi)容:①組件使用和提供的接口描述②組件內(nèi)部的實現(xiàn)代碼(配置列表)配件(configuration)把其他的組件裝配起來,連接組件使用的接口到其提供者。每個nesC應(yīng)用程序都必須有且只有一個頂層配件(top-levelconfiguration)連接內(nèi)部組件。之所以區(qū)別設(shè)計模塊與配件,是為了讓系統(tǒng)設(shè)計者在構(gòu)建應(yīng)用程序的時候可以脫離現(xiàn)有的實現(xiàn)。例如:設(shè)計者可以提供配件,只是簡單地把一個或多個模塊連接起來,而不涉及其中具體的工作。同樣地,另一個開發(fā)者負(fù)責(zé)提供一組模塊庫,這些模塊可以普遍使用到眾多應(yīng)用中。下面是一個組件的示例,該示例要保存到文件中。configurationC1{providesinterfaceA1;}implementation{componentsM1;componentsM2;A1=M1.A1;M1.B1->M2.B1;}⑷配件37⑸命令命令是在接口中的一種函數(shù),這種函數(shù)要求接口的提供者實現(xiàn),而接口的使用者則會調(diào)用這種函數(shù)。形象的稱為命令,即為接口提供的可供調(diào)用的命令。語法結(jié)構(gòu)類似于C語言,只是在最前面增加command關(guān)鍵字。①命令定義下面給出一個命令的定義。interfaceA1{commandintcmd1(intarg);…}②命令實現(xiàn)下面給出一個命令的實現(xiàn)moduleM1{providesinterfaceA1;…}implementation{commandintA1.cmd1(intarg){……}}⑸命令38③命令使用下面給出一個命令的使用,調(diào)用命令時一定要用call命令,否則編譯會出錯。moduleM2{usesinterfaceA1;}implementation{…intret=callA1.cmd1(0x11);…}⑹事件事件也是在接口中的一種函數(shù),這種函數(shù)要求接口的提供者調(diào)用,而接口的使用者則會實現(xiàn)這種函數(shù)。形象的稱為event,即為接口使用者所實現(xiàn)的事件處理函數(shù)。語法結(jié)構(gòu)類似于C語言,只是在最前面增加event關(guān)鍵字。①事件定義下面給出一個事件的定義,它可以擁有參數(shù)和返回值。interfaceA1{…eventvoidevent1(intarg1,intarg2);}③命令使用⑹事件39②事件實現(xiàn)下面給出的是事件的實現(xiàn),接口的提供者在發(fā)出事件時,必須使用關(guān)鍵字post,否則編譯會出錯。moduleM1{providesinterfaceA1;}implementation{…postA1.event1(0x1,0x2);/*發(fā)出對應(yīng)的事件,實際上類同于調(diào)用事件處理函數(shù)*/…}③事件使用下面給出使用事件的方法,接口使用者必須實現(xiàn)事件的具體內(nèi)容,如同事件處理函數(shù)一樣。moduleM2{usesinterfaceA1;}implementation{eventvoidA1.event1(intarg1,intarg2){…}}②事件實現(xiàn)40⑺任務(wù)任務(wù)是TinyOS系統(tǒng)提供的一種特殊的機(jī)制,類同于線程。在大多數(shù)情況下,因為同步代碼是非搶占的,這種編程方式行之有效。但是,這種做法并不適合大規(guī)模計算。當(dāng)一個組件需要做什么且此時還有寬裕的時間,最好給TinyOS延遲計算的能力,即處理完之前已在等待的事情后再執(zhí)行。任務(wù)是一個函數(shù),組件告訴TinyOS稍后再運行而不是立即運行。任務(wù)一般為一個函數(shù),無參數(shù),無返回值。任務(wù)可以在一般的TinyOS程序中發(fā)出,而任務(wù)的執(zhí)行是由TinyOS系統(tǒng)內(nèi)核來實現(xiàn)的。并且任務(wù)的執(zhí)行是不影響調(diào)用者的,將會在發(fā)出任務(wù)后的某一個時刻被調(diào)度運行。任務(wù)具有如下特點:①無參數(shù)、無返回值②系統(tǒng)會按特定的順序調(diào)度這些任務(wù)③任務(wù)執(zhí)行期間不能搶占,但是可以被中斷所搶占④在任務(wù)未執(zhí)行時,發(fā)出多少個任務(wù),都將只運行一次這個任務(wù)系統(tǒng)執(zhí)行完一個任務(wù)后才會去執(zhí)行其它任務(wù),所以任務(wù)一般要求短小,不至于影響其它任務(wù)。⑺任務(wù)41任務(wù)的定義一般也是放在module中的,下面給出一個任務(wù)示例:moduleM1{}implementation{…taskvoidtask1(){…}
voidf1(){posttask1();}}為了協(xié)調(diào)任務(wù)和中斷的執(zhí)行,nesC使用“atomic”指出該段代碼“不可被打斷”。另外定義了“task”封裝一些代碼來完成一個任務(wù),系統(tǒng)有FIFO的任務(wù)隊列。不同的任務(wù)之間沒有優(yōu)先級,但任務(wù)可以被interrupthandler打斷。為防止全局變量等公用數(shù)據(jù)被非正常修改,nesC規(guī)定只在任務(wù)中進(jìn)入公共的數(shù)據(jù)部分。任務(wù)的定義一般也是放在module中的,下面給出一個任務(wù)示例429.3.3一個簡單的nesC編程示例下面是一個最簡單的C程序,在Linux上,你只要使用命令gcctest.c-otest就可以編譯該程序。intmain(){ return0;}在TinyOS中,要完成同樣的事,你需要三個文件。讀者可以參考以下步驟來建立這個最簡單地程序:⑴創(chuàng)建一個文件夾,如simple,來保存這三文件。⑵為我們的程序創(chuàng)建一個配置文件,內(nèi)容如下:configurationSimpleAppC{}implementation{ componentsSimpleC,MainC;
SimpleC.Boot->MainC.Boot;}在這個程序中有兩個組件:Main組件和SimpleC組件,其中,Main組件提供了實際上是程序入口點的信號。
回本章目錄9.3.3一個簡單的nesC編程示例下面是一個最簡單的C程43⑶創(chuàng)建組件文件,這里包含SimpleC的定義(接口),內(nèi)容如下:moduleSimpleC{ usesinterfaceBoot;}
implementation{ eventvoidBoot.booted() {//Theentrypointoftheprogram }}⑷創(chuàng)建Makefile文件,Makefile文件用來控制該程序的編譯,Makefile文件內(nèi)容如下:COMPONENT=SimpleAppCinclude$(MAKERULES)這里需要將頂層的配置放到COMPONENT中。⑸使用如下命令來編譯該程序$makemicaz如果環(huán)境變量等都已經(jīng)配置好,這里就可以成功編譯。⑶創(chuàng)建組件文件,這里包含SimpleC的定義(接口),內(nèi)容449.3.4TOSSIM仿真TOSSIM是一個支持基于TinyOS的應(yīng)用在PC機(jī)上運行的模擬器,TOSSIM將TinyOS環(huán)境下的nesC代碼直接編譯為可在PC機(jī)環(huán)境下運行的可執(zhí)行文件,提供了不用將程序下載到真實的節(jié)點上就可以對程序進(jìn)行測試的一個平臺。TOSSIM模擬器提供運行時調(diào)試輸出信息,允許用戶從不同角度分析和觀察程序的執(zhí)行過程。TOSSIM提供了用于顯示仿真情況的用戶界面TINYVIZ,它是一個基于java的gui應(yīng)用程序,它允許用戶以可視化方式控制程序的模擬過程。TINYVIZ提供了圖形調(diào)試接口,它能可視化地和TinyOS應(yīng)用程序交互,能使用戶方便地跟蹤應(yīng)用的執(zhí)行,可以設(shè)置斷點,查看變量,同時可以模擬多個節(jié)點的執(zhí)行,并能夠根據(jù)一定的模擬設(shè)置網(wǎng)絡(luò)屬性?;乇菊履夸?.3.4TOSSIM仿真TOSSIM是一個支持基于Ti45commandvoidinit();callInterrupt.publicstaticvoidmain(String[]args)完整的表達(dá)式應(yīng)該為:A.2TinyOS的調(diào)度機(jī)制由于無線傳感器網(wǎng)絡(luò)的特殊性,研究人員在設(shè)計TinyOS系統(tǒng)時就提出以下幾個原則:5TinyOS的基本概念同cygwin下的配置componentsSchedulerBasicPasSched;但是,這種做法并不適合大規(guī)模計算。cmd1(0x11);一個完整的應(yīng)用系統(tǒng)由一個內(nèi)核調(diào)度器(簡稱調(diào)度器)和許多功能獨立且相互聯(lián)系的組件構(gòu)成,可以把TinyOS系統(tǒng)和在其上運行的應(yīng)用程序看成是一個大的“執(zhí)行程序”。interfaceA1{系統(tǒng)執(zhí)行完一個任務(wù)后才會去執(zhí)行其它任務(wù),所以任務(wù)一般要求短小,不至于影響其它任務(wù)。使用了三種機(jī)制來管理和控制能量狀態(tài)。當(dāng)沒有中斷發(fā)生時,調(diào)度器會從隊列中取出一個任務(wù)執(zhí)行,任務(wù)執(zhí)行過程中可以被打斷。⑤支持網(wǎng)絡(luò)協(xié)議組件的替換①硬件抽象組件將物理硬件映射到TinyOS的組件模型;現(xiàn)有的TinyOS系統(tǒng)提供了大多數(shù)傳感網(wǎng)硬件平臺和應(yīng)用領(lǐng)域里都可用到的組件,例如定時器組件、傳感器組件、消息收發(fā)組件、電源管理組件等,從而把用戶和底層硬件隔離開來。TOSSIM模擬器提供運行時調(diào)試輸出信息,允許用戶從不同角度分析和觀察程序的執(zhí)行過程。下面介紹利用TOSSIM模擬TINYVIZ程序的具體方法。①進(jìn)入cygwin應(yīng)用程序,進(jìn)入應(yīng)用程序所在目錄,其中最后一級的目錄為應(yīng)用程序。②運行命令:makepc,該命令的作用是將應(yīng)用程序編譯為pc機(jī)能執(zhí)行的二進(jìn)制文件;③然后運行命令:exportdbg=usr1,此處dbg模式設(shè)置為usr1;④最后運行:build/pc/main.exe-gui20,此處,20為傳感器節(jié)點數(shù)目,可人為設(shè)定。此時打開另外一個cygwin應(yīng)用程序,注意不要關(guān)閉原來的cygwin應(yīng)用程序。①進(jìn)入目錄:…②運行命令:make③然后再運行命令:④此時就可以運行仿真了,20個節(jié)點情形的仿真過程如圖9-11所示,其中被箭頭指向的節(jié)點為接收到信息的節(jié)點。commandvoidinit();下面介紹利用TOSS46圖9-1120個節(jié)點的仿真圖9-1120個節(jié)點的仿真479.4TinyOS內(nèi)部機(jī)制簡介9.4.1TinyOS程序運行機(jī)制分析9.4.2TinyOS的調(diào)度機(jī)制9.4.3TinyOS的通信模型9.4.4TinyOS的能量管理回本章目錄9.4TinyOS內(nèi)部機(jī)制簡介9.4.1TinyOS程序489.4.1TinyOS程序運行機(jī)制分析⑴的啟動接口的啟動接口包含如下三個內(nèi)容:①Init:初始化組件和硬件狀態(tài);interfaceInit{commanderror_tinit();}②Scheduler:初始化和運行任務(wù);interfaceScheduler{commandvoidinit();commandboolrunNextTask(boolsleep);commandvoidtaskLoop();}③Boot:通知系統(tǒng)已經(jīng)成功地啟動interfaceBoot{eventvoidbooted();}回本章目錄9.4.1TinyOS程序運行機(jī)制分析⑴的啟動接口回本章目49⑵TinyOS的啟動順序TinyOS的啟動順序有以下4步:①調(diào)度程序初始化;②組件初始化;③發(fā)送啟動boot過程完成的信號;④運行調(diào)度程序。⑶TinyOS的程序運行機(jī)制TinyOS程序通過并口導(dǎo)入到節(jié)點之上,節(jié)點一旦加電程序就會運行。實際上在ROM空間的零地址上是一個跳轉(zhuǎn)指令,加電之后的程序首先運行這個跳轉(zhuǎn)指令,將控制轉(zhuǎn)向程序的真正的代碼處,這之后程序才真正開始執(zhí)行。TinyOS的所有組件都需要一個通用的主要組件即Main組件,在程序的配置文件中將該組件進(jìn)行綁定。Main組件提供了一個初始化和運行TinyOS組件的接口StdControl,但是真正實現(xiàn)這個接口的組件應(yīng)當(dāng)是應(yīng)用程序組件。下面看看Main組件究竟完成哪些功能。⑵TinyOS的啟動順序50Main組件本身的實現(xiàn)是另外一個組件RealMain,它才是真正的Main,我們先不關(guān)心其它的代碼,看看RealMain做了什么。intmain()attribute((C,spontaneous)){callhardwareInit();callPot.init(10);TOSHschedinit();callStdControl.init();callStdControl.start();callInterrupt.enable();while(1){TOSHruntask();}}Main組件本身的實現(xiàn)是另外一個組件RealMain,它才是51從代碼上我們看到RealMain完成了硬件初始化、電位器的初始化、調(diào)度器的初始化,并且調(diào)用了接口StdControl中的函數(shù),這些函數(shù)完成了應(yīng)用程序組件的初始化任務(wù),此外還要打開中斷。從這里我們也就明白了程序執(zhí)行后會先進(jìn)行硬件的初始化,然后初始化組件。至于組件的初始化如何完成則取決于用戶編寫的組件初始化函數(shù),因為Main組件使用的StdControl接口需要在用戶編寫的組件里綁定到其初始化函數(shù)中。最后RealMain組件開始運行隊列中的任務(wù)。TinyOS的調(diào)度隊列是個先進(jìn)先出的循環(huán)隊列,整個隊列中至少有一個空閑位置,應(yīng)用程序可以調(diào)用PostTask將一個新的任務(wù)加到隊列中。當(dāng)沒有中斷發(fā)生時,調(diào)度器會從隊列中取出一個任務(wù)執(zhí)行,任務(wù)執(zhí)行過程中可以被打斷。如果隊列中沒有了任務(wù),處理器會進(jìn)入睡眠狀態(tài),等待被其它事件激活。從代碼上我們看到RealMain完成了硬件初始化、電位器的初529.4.2TinyOS的調(diào)度機(jī)制TinyOS調(diào)度是任務(wù)和事件的二級調(diào)度。任務(wù)是單線程運行至完畢,不可相互搶占,但事件可搶占正在運行的任務(wù)或低優(yōu)先級事件。任務(wù)用于實時要求不高的應(yīng)用中,所有任務(wù)只分配單個任務(wù)棧,默認(rèn)是簡單的FIFO調(diào)度。若任務(wù)隊列為空,CPU進(jìn)入休眠狀態(tài)以降低功耗。其中任務(wù)數(shù)默認(rèn)是8個,最大任務(wù)數(shù)是255。還采用了分段操作來減少任務(wù)的運行時間,即分為程序啟動硬件操作后迅速返回和硬件完成操作后通知程序兩個階段。事件用于實時性有要求的應(yīng)用中,可分為硬件事件和軟件事件。硬件事件就是由底層硬件發(fā)出的中斷,隨后進(jìn)入中斷處理函數(shù);軟件事件則是帶有async關(guān)鍵字的命令或事件函數(shù),以通知相應(yīng)組件作出適當(dāng)?shù)奶幚?。在中,SchedulerBasicP是主要的TinyOS調(diào)度器,提供帶參數(shù)的TaskBasic接口。Tiny-SchedulerC是默認(rèn)的調(diào)度器配件(configuration),可連接到SchedulerBasicP。回本章目錄9.4.2TinyOS的調(diào)度機(jī)制TinyOS調(diào)度是任務(wù)和事53configurationTinySchedulerC{providesinterfaceScheduler;providesinterfaceTaskBasic[uint8_tid];}implementation{componentsSchedulerBasicPasSched;componentsMcuSleepCasSleep;Scheduler=Sched;TaskBasic=Sched;Sched.McuSleep->Sleep;}configurationTinySchedulerC{549.4.3TinyOS的通信模型TinyOS的通信模型基于主動消息(ActiveMessage),是一種高性能并行通信方式。在每次發(fā)送消息后,接收方需返回一個同步的確認(rèn)消息。此確認(rèn)消息是在主動消息層的最底層生成,其內(nèi)容是一個特殊立即序列,發(fā)送方可迅速確定是否需重發(fā)消息。在中,消息結(jié)構(gòu)是TOS_Msg,包含消息地址、消息類型、消息所屬群號及消息處理函數(shù)ID等信息。在中,消息結(jié)構(gòu)是message_t,相對TOS_Msg代表明確的主動消息數(shù)據(jù)包不同,message_t兼容性更高,能使data域置于固定偏移位置,方便不同鏈路層間的通信,其結(jié)構(gòu)定義如下:typedefnx_structmessage_t{nx_uint8_theader[sizeof(message_header_t)];nx_uint8_tdata[TOSH_DATA_LENGTH];//有效載荷區(qū)nx_uint8_tfooter[sizeof(message_footer_t)];nx_uint8_tmetadata[sizeof(message_metadata_t)];}message_t;回本章目錄9.4.3TinyOS的通信模型TinyOS的通信模型基于55需要注意的是header、footer、metadata都是不透明的,不能直接訪問。要訪問message_t必須通過Packet、AMPacket和其他的一些接口。每個鏈路層定義了其headerfootermetadata,這些結(jié)構(gòu)必須是外部結(jié)構(gòu)體(nx_struct),其所有域必須是外部類型(nx_*)。因為外部類型可保證平臺間兼容,可使結(jié)構(gòu)體以字節(jié)對齊,從而避免數(shù)據(jù)包緩沖對齊和域偏移的問題。當(dāng)數(shù)據(jù)轉(zhuǎn)發(fā)到無線傳感器節(jié)點時,先存儲在緩存中,然后由主動消息分發(fā)層交給上層應(yīng)用組件對應(yīng)的消息處理函數(shù)完成消息的解包操作。計算處理或發(fā)送相應(yīng)消息等工作TinyOS要求每個應(yīng)用程序在消息被釋放后,能返回一塊未用的消息緩存,以接收下個未到的消息。通訊的實現(xiàn)也是通過各層組件通訊實現(xiàn)的,其結(jié)構(gòu)如圖9-12所示。圖9-12TinyOS的通信需要注意的是header、footer、metadata都是56大致看來,在TinyOS的通訊經(jīng)歷的組件流程如圖9-13所示圖9-13TinyOS通訊組件流程圖大致看來,在TinyOS的通訊經(jīng)歷的組件流程如圖9-13所示57
應(yīng)用程序直接使用的組件是GenericComm,數(shù)據(jù)將依次經(jīng)過AMStandard、RadioCRCPacket和SecDedRadioByteSignal等組件的處理與編碼之后通過硬件發(fā)送出去。接受的過程恰好與之相反。應(yīng)用程序組件要發(fā)送數(shù)據(jù)需要引用系統(tǒng)組件GenericComm。GenericComm組件是TinyOS的最基本的網(wǎng)絡(luò)通訊棧,它是一個配置(configuration)文件,可以在中找到它的綁定實現(xiàn)。該組件提供的接口中有兩個最重要的接口即SendMsg和ReceiveMsg,分別供用戶調(diào)用來發(fā)送和接受消息,并且使用了很多底層的接口來實現(xiàn)通訊。從這個文件中我們可以看到真正實現(xiàn)這些接口的組件由AMStandard來完成ActiveMessage的發(fā)送和接收、UARTNoCRCPacket來實現(xiàn)了通過串口進(jìn)行通訊、RadioCRCPacket來實現(xiàn)了通過無線進(jìn)行通訊等等。接口SendMsg和ReceiveMsg都是參數(shù)化接口,參數(shù)id就是前面說的handlerid。接口SendMsg中包含commandssend和eventssenddone。應(yīng)用程序直接使用的組件是GenericComm,數(shù)58通過語句SendMsg=AMStandard.SendMsg;ReceiveMsg=AMStandard.ReceiveMsg;來說明它們的真正實現(xiàn)是由組件AMStandard中相應(yīng)接口來完成的。
消息的發(fā)送涉及組件、接口和事件三方面,當(dāng)上層組件有消息發(fā)送時通過接口調(diào)用下層組件來實現(xiàn)。下層組件完成發(fā)送后也通過接口向上層組件回送消息。消息的接收主要是以事件的逐層向上傳遞來進(jìn)行的。當(dāng)硬件接到一個消息時它會發(fā)生中斷,在中斷的處理程序中觸發(fā)事件,在該事件的處理函數(shù)中又觸發(fā)了事件,這個事件的處理函數(shù)接收Radio的采樣數(shù)據(jù)并試圖找到開始標(biāo)志,一旦找到了消息的開始標(biāo)志,它就會Post一個任務(wù)將接收到的編碼數(shù)據(jù)進(jìn)行解碼。數(shù)據(jù)解碼之后該事件發(fā)信號給事件,表示可以接收下一字節(jié)數(shù)據(jù)。事件處理字階級組件傳遞的解碼數(shù)據(jù),主要是通過Post一個任務(wù)進(jìn)行CRC檢查。這個任務(wù)會發(fā)信號給事件,只是簡單地將其接到的消息返回。通過語句599.4.4TinyOS的能量管理使用了三種機(jī)制來管理和控制能量狀態(tài)。①MCU能量控制該方式包含dirty標(biāo)識位、低功耗狀態(tài)計算函數(shù)McuSleepC和能量狀態(tài)覆蓋函數(shù)PowerOverride。dirty標(biāo)識位通知TinyOS需計算一個新的低功耗模式只要硬件表示層組件對硬件配置進(jìn)行了改動,MCU的低功耗模式也會改變,就會調(diào)用McuPowerState.update()。接著調(diào)用McuSleepC計算出最佳低功耗模式,最后通過調(diào)用PowerOverride.lowestState()以更新MCU功耗模式。②能量管理接口每個設(shè)備都有個能量管理接口即StdControl或SplitControl或AsyncStd-Control。調(diào)用stop命令停止該設(shè)備,進(jìn)入低功耗模式。③定時器TinyOS的定時器服務(wù)可以工作在大多數(shù)處理器的極低功耗的省電模式下。TinyOS功耗低、占用空間少,滿足無線傳感器網(wǎng)絡(luò)資源極端有限的條件。但TinyOS并不能滿足實時性要求相對高的無線傳感器網(wǎng)絡(luò)。TinyOS在某些場合因?qū)崟r性比較差,會出現(xiàn)任務(wù)過載、任務(wù)阻塞、任務(wù)隊列溢出、通信吞吐量下降等一系列問題,從而導(dǎo)致系統(tǒng)崩潰,在這種情況下,需進(jìn)一步改進(jìn)TinyOS實時性、并發(fā)性及移植性,并通過完善其整體架構(gòu)來提高其綜合性能?;乇菊履夸?.4.4TinyOS的能量管理使用了三種機(jī)制來管理和控制60c-otest就可以編譯該程序。在國內(nèi)有一家代理,開發(fā)平臺的做工非常不錯,產(chǎn)品覆蓋面也比較廣,主要的缺點就是產(chǎn)品太貴,而且中文的資料較少。2TinyOS的調(diào)度機(jī)制也可使用UCoMS監(jiān)控、維護(hù)淘汰的平臺。表9-3環(huán)境變量的配置⑴創(chuàng)建一個文件夾,如simple,來保存這三文件。但是,這種做法并不適合大規(guī)模計算。圖9-9使用nesC編程的流程init(10);②運行命令:makeprovidesinterfaceScheduler;init(10);在大多數(shù)情況下,因為同步代碼是非搶占的,這種編程方式行之有效。⑵為我們的程序創(chuàng)建一個配置文件,內(nèi)容如下:下面是一個組件的示例,該示例要保存到文件中。2TinyOS的特點從這個文件中我們可以看到真正實現(xiàn)這些接口的組件由AMStandard來完成ActiveMessage的發(fā)送和接收、UARTNoCRCPacket來實現(xiàn)了通過串口進(jìn)行通訊、RadioCRCPacket來實現(xiàn)了通過無線進(jìn)行通訊等等。3一個簡單的nesC編程示例從這里我們也就明白了程序執(zhí)行后會先進(jìn)行硬件的初始化,然后初始化組件。其中任務(wù)數(shù)默認(rèn)是8個,最大任務(wù)數(shù)是255。思考與習(xí)題1.簡述TinyOS的特點。2.簡述nesC程序的特點。3.安裝TinyOS,并編寫簡單地程序。4.對照TinyOS的源程序,理解TinyOS的內(nèi)部機(jī)制。
c-otest就可以編譯該程序。思考與習(xí)題1.簡述Ti61
第九章物聯(lián)網(wǎng)中的常用嵌入式系統(tǒng)
第九章物聯(lián)網(wǎng)中的常用嵌入式系統(tǒng)62本章主要內(nèi)容9.1TinyOS簡介9.2安裝TinyOS9.3nesC簡介9.4TinyOS內(nèi)部機(jī)制簡介思考與習(xí)題本章主要內(nèi)容639.1TinyOS簡介9.1.1TinyOS概述9.1.2TinyOS的特點9.1.3TinyOS開發(fā)平臺9.1.4TinyOS開發(fā)案例9.1.5TinyOS的基本概念回本章目錄9.1TinyOS簡介9.1.1TinyOS概述9.1.649.1.1TinyOS概述TinyOS操作系統(tǒng)采用了組件的結(jié)構(gòu)。系統(tǒng)本身提供了一系列的組件供用戶調(diào)用,其中包括主組件、應(yīng)用組件、執(zhí)行組件、傳感組件、通信組件和硬件抽象組件,如下圖9-1所示。組件由下到上可分為3類:硬件抽象組件、綜合硬件組件和高層軟件組件。①硬件抽象組件將物理硬件映射到TinyOS的組件模型;②綜合硬件組件模擬高級的硬件行為,如感知組件、通信組件等;③高層次的軟件組件實現(xiàn)控制、路由以及數(shù)據(jù)傳輸?shù)葢?yīng)用層的功能。圖9-1TinyOS的組件結(jié)構(gòu)回本章目錄9.1.1TinyOS概述圖9-1TinyOS的組件結(jié)65每個TinyOS程序應(yīng)當(dāng)具有至少一個應(yīng)用組件,即用戶組件。該應(yīng)用組件通過接口調(diào)用下層組件提供的服務(wù),實現(xiàn)針對特定應(yīng)用的具體邏輯功能,如數(shù)據(jù)采集、數(shù)據(jù)處理、數(shù)據(jù)收發(fā)等。一個完整的應(yīng)用系統(tǒng)由一個內(nèi)核調(diào)度器(簡稱調(diào)度器)和許多功能獨立且相互聯(lián)系的組件構(gòu)成,可以把TinyOS系統(tǒng)和在其上運行的應(yīng)用程序看成是一個大的“執(zhí)行程序”。現(xiàn)有的TinyOS系統(tǒng)提供了大多數(shù)傳感網(wǎng)硬件平臺和應(yīng)用領(lǐng)域里都可用到的組件,例如定時器組件、傳感器組件、消息收發(fā)組件、電源管理組件等,從而把用戶和底層硬件隔離開來。在此基礎(chǔ)上,用戶只需開發(fā)針對特殊硬件和特殊應(yīng)用需求的少量組件,大大提高了應(yīng)用的開發(fā)效率。TinyOS設(shè)計之初的目的是制作一個專屬嵌入式無線傳感器網(wǎng)絡(luò)的操作系統(tǒng)。但事實上,由于良好的可擴(kuò)展性和足夠小的代碼尺寸,TinyOS在物聯(lián)網(wǎng)的應(yīng)用領(lǐng)域中也占有非常重要的地位。每個TinyOS程序應(yīng)當(dāng)具有至少一個應(yīng)用組件,即用戶組件。該66由于無線傳感器網(wǎng)絡(luò)的特殊性,研究人員在設(shè)計TinyOS系統(tǒng)時就提出以下幾個原則:①能在有限的資源上運行:要求執(zhí)行模式允許在單一的協(xié)議棧上運行;②允許高度的并發(fā)性:要求執(zhí)行模式能對事件作出快速的直接響應(yīng);③適應(yīng)硬件升級:要求組件和執(zhí)行模式能夠應(yīng)對硬件/軟件的替換;④支持多樣化的應(yīng)用程序:要求能夠根據(jù)實際需要,裁減操作系統(tǒng)的服務(wù);⑤魯棒性強(qiáng):要求通過組件間有限的交互渠道,就能應(yīng)對各種復(fù)雜情況;⑥支持一系列平臺:要求操作系統(tǒng)的服務(wù)具有可移植性。由于無線傳感器網(wǎng)絡(luò)的特殊性,研究人員在設(shè)計TinyOS系統(tǒng)時67TinyOS操作系統(tǒng)采用的輕量級線程技術(shù)、兩層調(diào)度方式、事件驅(qū)動模式、主動消息通信技術(shù)及組件化編程等有效地提高了傳感器節(jié)點cpu的使用率,有助于省電操作并簡化了應(yīng)用的開發(fā)。TinyOS系統(tǒng)、庫和基于TinyOS的應(yīng)用基本上都是用nesC語言開發(fā)的,在TinyOS中采用nesC語言進(jìn)行應(yīng)用程序開發(fā)。在TinyOS中,應(yīng)用程序開發(fā)人員可以通過nesC語言表達(dá)組件以及組件之間的事件/命令接口。組件分為配置文件和模塊,程序的流程是通過配置文件中接口的連接實現(xiàn)而構(gòu)建起來的,而具體實現(xiàn)的邏輯功能是通過模塊完成的。每個模塊由一組命令和事件組成,這些命令和事件成為該模塊的接口。一般來說,上層組件對下層組件發(fā)命令,下層組件發(fā)信號通知事件的發(fā)生,最底層的組件直接和硬件交互,從而自上到下形成一種樹狀結(jié)構(gòu)。TinyOS操作系統(tǒng)采用的輕量級線程技術(shù)、兩層調(diào)度方式、事件68TinyOS的并行處理能力通過任務(wù)(task)和中斷處理事件(interrupthanderevent)來體現(xiàn)。任務(wù)會加入一個FIFO隊列中,在執(zhí)行過程中,任務(wù)間沒有競爭;但中斷處理程序可以打斷任務(wù)執(zhí)行。TinyOS采用二級調(diào)度機(jī)制來滿足無線傳感網(wǎng)絡(luò)運行特點,整個程序調(diào)度過程如圖9-2所示。組件中完成任務(wù)提交,由操作系統(tǒng)完成調(diào)度。一個節(jié)點上應(yīng)用程序的框圖如圖9-3所示,操作系統(tǒng)只是在后臺提供隊列服務(wù)。圖9-2TinyOS程序調(diào)度
圖9-3一個節(jié)點上應(yīng)用程序的框圖TinyOS的并行處理能力通過任務(wù)(task)和中斷處理事件69與uCOS-II相比,Tiny-OS基于事件驅(qū)動的機(jī)制就決定了其實時性不高,編程復(fù)雜,但其內(nèi)核占用空間極小,而uCOS-II是基于線程模式的,編程簡單,實時性高,但相對帶來的開銷也大。表9-2比較了Tiny-OS與uCOS-II。操作系統(tǒng)TinyOSuCOS-II運行模式事件線程搶占式內(nèi)核否是時間可確定性否是支持動態(tài)編程否否(最小)內(nèi)核RAM:47B,ROM:473BRAM:300B,ROM:2kB低功耗是否表9-2Tiny-OS與uCOS-II的比較與uCOS-II相比,Tiny-OS基于事件驅(qū)動的機(jī)制就決定709.1.2TinyOS的特點回本章目錄9.1.2TinyOS的特點回本章目錄71commandvoidtaskLoop();interfaceBoot{/opt/TinyOS-2.形象的稱為命令,即為接口提供的可供調(diào)用的命令。系統(tǒng)本身提供了一系列的組件供用戶調(diào)用,其中包括主組件、應(yīng)用組件、執(zhí)行組件、傳感組件、通信組件和硬件抽象組件,如下圖9-1所示。moduleM2{一個組件使用了一個接口,它可以調(diào)用這個接口的命令,但必須實現(xiàn)其事件。本章主要內(nèi)容usesinterfaceA1;③一個module可以同時提供一組相同的接口,又稱參數(shù)化接口,表明該Module可提供多份同類資源,能夠同時給多個組件分享。配件(configuration)是一個完整的配置列表,配件可以像模塊一樣使用外部的接口并且對外提供接口。eventvoidA1.nx_uint8_tdata[TOSH_DATA_LENGTH];//有效載荷區(qū)事件處理字階級組件傳遞的解碼數(shù)據(jù),主要是通過Post一個任務(wù)進(jìn)行CRC檢查。配件(configuration)是一個完整的配置列表,配件可以像模塊一樣使用外部的接口并且對外提供接口。表9-3環(huán)境變量的配置連接的箭頭是也可以對稱反過來,如“BlinkC.nesC的組件模型如圖9-10。一個nesC語言編寫的程序由一個或多個組件(component)構(gòu)成或連接而成。④通過任務(wù)和事件來管理并發(fā)進(jìn)程TinyOS的應(yīng)用程序都是基于事件驅(qū)動模式的,采用事件觸發(fā)去喚醒傳感器工作。事件相當(dāng)于不同組件之間傳遞狀態(tài)信息的信號。當(dāng)事件對應(yīng)的硬件中斷發(fā)生時,系統(tǒng)能夠快速地調(diào)用相關(guān)的事件處理程序。任務(wù):一般用在對于時間要求不是很高的應(yīng)用中,且任務(wù)之間是平等的,即在執(zhí)行時是按順序先后來得,而不能互相占先執(zhí)行,一般為了減少任務(wù)的運行時間,要求每一個任務(wù)都很短小,能夠使系統(tǒng)的負(fù)擔(dān)較輕;支持網(wǎng)絡(luò)協(xié)議的替換。事件:一般用在對于時間的要求很嚴(yán)格的應(yīng)用中,而且它可以占先優(yōu)于任務(wù)和其他事件執(zhí)行,它可以被一個操作的完成或是來自外部環(huán)境的事件觸發(fā),在TinyOS中一般由硬件中斷處理來驅(qū)動事件。⑤支持網(wǎng)絡(luò)協(xié)議組件的替換除了默認(rèn)的協(xié)議之外,還提供其他協(xié)議供用戶替換,并且支持客戶自定義協(xié)議,這對于通信協(xié)議分析,非常適用于通信協(xié)議的研究工作。commandvoidtaskLoop();④通過任務(wù)72⑥代碼短小精悍TinyOS的程序采用的是模塊化設(shè)計,所以它的程序核心往往都很小,一般來說核心代碼和數(shù)據(jù)大概在400Bytes左右;能夠突破傳感器存儲資源少的限制,這能夠讓TinyOS很有效的運行在無線傳感器網(wǎng)絡(luò)上并去執(zhí)行相應(yīng)的管理工作等。⑥代碼短小精悍739.1.3TinyOS開發(fā)平臺國內(nèi)目前可以買到的TinyOS開發(fā)平臺主要有兩種,一種是Crossbow公司W(wǎng)SN開發(fā)套件,一種億道電子的XSBase-WSN開發(fā)套件;Crossbow本身就是TinyOS聯(lián)盟的成員之一,其所有產(chǎn)品都在TinyOS源碼的Platform目錄下可以找到,可以算得上是TinyOS技術(shù)商用化的代表;在國內(nèi)有一家代理,開發(fā)平臺的做工非常不錯,產(chǎn)品覆蓋面也比較廣,主要的缺點就是產(chǎn)品太貴,而且中文的資料較少。億道電子的WSN套件使用的是較先進(jìn)CC2430芯片,同時支持TinyOS和Z-stack兩種開發(fā)方式,并且包含大量的中文教材和使用手冊,硬件移植的也非常穩(wěn)定,所有的TinyOS測試用例都能正常運行,而且還帶了大量的中文教材、使用手冊和實驗用例,其中值得一提的是,該產(chǎn)品搭建了一整套的解決方案框架,實現(xiàn)了異構(gòu)網(wǎng)絡(luò)之間的互聯(lián)互通,可以在任何一地通過GPRS手機(jī)上網(wǎng),訪問節(jié)點上的物理數(shù)據(jù),開發(fā)者可以迅速的在這個框架下做二次開發(fā)。回本章目錄9.1.3TinyOS開發(fā)平臺國內(nèi)目前可以買到的TinyO749.1.4TinyOS開發(fā)案例目前有多個采用TinyOS的研究項目,如UCLA(加州大學(xué)洛杉磯分校)的ShahinFarshchi在進(jìn)行一項以TinyOS為基礎(chǔ)的無線神經(jīng)界面研究
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 第4章 創(chuàng)意制作-機(jī)器人入門 第2節(jié) 遙控LED燈組-認(rèn)識Linkboy軟件 教學(xué)設(shè)計 2023-2024學(xué)年河大版(2023)初中信息技術(shù)第二冊
- 古詩詞誦讀《涉江采芙蓉》教學(xué)設(shè)計 2024-2025學(xué)年統(tǒng)編版高中語文必修上冊
- 12 古詩三首 示兒教學(xué)設(shè)計-2024-2025學(xué)年五年級上冊語文統(tǒng)編版
- 高中信息技術(shù)選修1教學(xué)設(shè)計-5.1 枚舉算法的程序?qū)崿F(xiàn)-浙教版
- 第3課 中古時期的歐洲教學(xué)設(shè)計-2023-2024學(xué)年統(tǒng)編版(2019)高中歷史必修中外歷史綱要下冊
- 小學(xué)信息技術(shù)一年級上冊 3《拖拽鼠標(biāo)玩游戲》教學(xué)設(shè)計
- 天津市(事業(yè))單位勞動合同范本8篇
- 11 爸爸媽媽在我心中(教學(xué)設(shè)計)-2024-2025學(xué)年統(tǒng)編版道德與法治三年級上冊
- 11爸爸媽媽在我心中 第1課時 (教學(xué)設(shè)計)-部編版道德與法治三年級上冊
- 橡膠制品配送合同模板
- 運籌學(xué)完整版課件-002
- 2023年高考全國甲卷語文試卷真題(含答案)
- 水稻葉齡診斷栽培技術(shù)課件
- 2023年中國工商銀行蘇州分行社會招聘30人筆試備考試題及答案解析
- 中糧五常筒倉工程施工組織設(shè)計方案
- 經(jīng)纖支鏡氣道球囊擴(kuò)張術(shù)課件
- 汽車尾氣污染與治理汽車尾氣污染課件
- 河南神火興隆礦業(yè)有限責(zé)任公司泉店煤礦礦產(chǎn)資源開采與生態(tài)修復(fù)方案
- AIGC及ChatGPT保險行業(yè)應(yīng)用白皮書
- 對外漢語教學(xué)論
- 磚數(shù)量自動計算、換算表
評論
0/150
提交評論