物聯(lián)網(wǎng)中的常用嵌入式系統(tǒng)概述完美版課件_第1頁(yè)
物聯(lián)網(wǎng)中的常用嵌入式系統(tǒng)概述完美版課件_第2頁(yè)
物聯(lián)網(wǎng)中的常用嵌入式系統(tǒng)概述完美版課件_第3頁(yè)
物聯(lián)網(wǎng)中的常用嵌入式系統(tǒng)概述完美版課件_第4頁(yè)
物聯(lián)網(wǎng)中的常用嵌入式系統(tǒng)概述完美版課件_第5頁(yè)
已閱讀5頁(yè),還剩117頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第九章物聯(lián)網(wǎng)中的常用嵌入式系統(tǒng)

第九章物聯(lián)網(wǎng)中的常用嵌入式系統(tǒng)1本章主要內(nèi)容9.1TinyOS簡(jiǎn)介9.2安裝TinyOS9.3nesC簡(jiǎn)介9.4TinyOS內(nèi)部機(jī)制簡(jiǎn)介思考與習(xí)題本章主要內(nèi)容29.1TinyOS簡(jiǎn)介9.1.1TinyOS概述9.1.2TinyOS的特點(diǎn)9.1.3TinyOS開(kāi)發(fā)平臺(tái)9.1.4TinyOS開(kāi)發(fā)案例9.1.5TinyOS的基本概念回本章目錄9.1TinyOS簡(jiǎn)介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的組件模型;②綜合硬件組件模擬高級(jí)的硬件行為,如感知組件、通信組件等;③高層次的軟件組件實(shí)現(xiàn)控制、路由以及數(shù)據(jù)傳輸?shù)葢?yīng)用層的功能。圖9-1TinyOS的組件結(jié)構(gòu)回本章目錄9.1.1TinyOS概述圖9-1TinyOS的組件結(jié)4每個(gè)TinyOS程序應(yīng)當(dāng)具有至少一個(gè)應(yīng)用組件,即用戶組件。該應(yīng)用組件通過(guò)接口調(diào)用下層組件提供的服務(wù),實(shí)現(xiàn)針對(duì)特定應(yīng)用的具體邏輯功能,如數(shù)據(jù)采集、數(shù)據(jù)處理、數(shù)據(jù)收發(fā)等。一個(gè)完整的應(yīng)用系統(tǒng)由一個(gè)內(nèi)核調(diào)度器(簡(jiǎn)稱調(diào)度器)和許多功能獨(dú)立且相互聯(lián)系的組件構(gòu)成,可以把TinyOS系統(tǒng)和在其上運(yùn)行的應(yīng)用程序看成是一個(gè)大的“執(zhí)行程序”?,F(xiàn)有的TinyOS系統(tǒng)提供了大多數(shù)傳感網(wǎng)硬件平臺(tái)和應(yīng)用領(lǐng)域里都可用到的組件,例如定時(shí)器組件、傳感器組件、消息收發(fā)組件、電源管理組件等,從而把用戶和底層硬件隔離開(kāi)來(lái)。在此基礎(chǔ)上,用戶只需開(kāi)發(fā)針對(duì)特殊硬件和特殊應(yīng)用需求的少量組件,大大提高了應(yīng)用的開(kāi)發(fā)效率。TinyOS設(shè)計(jì)之初的目的是制作一個(gè)專屬嵌入式無(wú)線傳感器網(wǎng)絡(luò)的操作系統(tǒng)。但事實(shí)上,由于良好的可擴(kuò)展性和足夠小的代碼尺寸,TinyOS在物聯(lián)網(wǎng)的應(yīng)用領(lǐng)域中也占有非常重要的地位。每個(gè)TinyOS程序應(yīng)當(dāng)具有至少一個(gè)應(yīng)用組件,即用戶組件。該5由于無(wú)線傳感器網(wǎng)絡(luò)的特殊性,研究人員在設(shè)計(jì)TinyOS系統(tǒng)時(shí)就提出以下幾個(gè)原則:①能在有限的資源上運(yùn)行:要求執(zhí)行模式允許在單一的協(xié)議棧上運(yùn)行;②允許高度的并發(fā)性:要求執(zhí)行模式能對(duì)事件作出快速的直接響應(yīng);③適應(yīng)硬件升級(jí):要求組件和執(zhí)行模式能夠應(yīng)對(duì)硬件/軟件的替換;④支持多樣化的應(yīng)用程序:要求能夠根據(jù)實(shí)際需要,裁減操作系統(tǒng)的服務(wù);⑤魯棒性強(qiáng):要求通過(guò)組件間有限的交互渠道,就能應(yīng)對(duì)各種復(fù)雜情況;⑥支持一系列平臺(tái):要求操作系統(tǒng)的服務(wù)具有可移植性。由于無(wú)線傳感器網(wǎng)絡(luò)的特殊性,研究人員在設(shè)計(jì)TinyOS系統(tǒng)時(shí)6TinyOS操作系統(tǒng)采用的輕量級(jí)線程技術(shù)、兩層調(diào)度方式、事件驅(qū)動(dòng)模式、主動(dòng)消息通信技術(shù)及組件化編程等有效地提高了傳感器節(jié)點(diǎn)cpu的使用率,有助于省電操作并簡(jiǎn)化了應(yīng)用的開(kāi)發(fā)。TinyOS系統(tǒng)、庫(kù)和基于TinyOS的應(yīng)用基本上都是用nesC語(yǔ)言開(kāi)發(fā)的,在TinyOS中采用nesC語(yǔ)言進(jìn)行應(yīng)用程序開(kāi)發(fā)。在TinyOS中,應(yīng)用程序開(kāi)發(fā)人員可以通過(guò)nesC語(yǔ)言表達(dá)組件以及組件之間的事件/命令接口。組件分為配置文件和模塊,程序的流程是通過(guò)配置文件中接口的連接實(shí)現(xiàn)而構(gòu)建起來(lái)的,而具體實(shí)現(xiàn)的邏輯功能是通過(guò)模塊完成的。每個(gè)模塊由一組命令和事件組成,這些命令和事件成為該模塊的接口。一般來(lái)說(shuō),上層組件對(duì)下層組件發(fā)命令,下層組件發(fā)信號(hào)通知事件的發(fā)生,最底層的組件直接和硬件交互,從而自上到下形成一種樹(shù)狀結(jié)構(gòu)。TinyOS操作系統(tǒng)采用的輕量級(jí)線程技術(shù)、兩層調(diào)度方式、事件7TinyOS的并行處理能力通過(guò)任務(wù)(task)和中斷處理事件(interrupthanderevent)來(lái)體現(xiàn)。任務(wù)會(huì)加入一個(gè)FIFO隊(duì)列中,在執(zhí)行過(guò)程中,任務(wù)間沒(méi)有競(jìng)爭(zhēng);但中斷處理程序可以打斷任務(wù)執(zhí)行。TinyOS采用二級(jí)調(diào)度機(jī)制來(lái)滿足無(wú)線傳感網(wǎng)絡(luò)運(yùn)行特點(diǎn),整個(gè)程序調(diào)度過(guò)程如圖9-2所示。組件中完成任務(wù)提交,由操作系統(tǒng)完成調(diào)度。一個(gè)節(jié)點(diǎn)上應(yīng)用程序的框圖如圖9-3所示,操作系統(tǒng)只是在后臺(tái)提供隊(duì)列服務(wù)。圖9-2TinyOS程序調(diào)度

圖9-3一個(gè)節(jié)點(diǎn)上應(yīng)用程序的框圖TinyOS的并行處理能力通過(guò)任務(wù)(task)和中斷處理事件8與uCOS-II相比,Tiny-OS基于事件驅(qū)動(dòng)的機(jī)制就決定了其實(shí)時(shí)性不高,編程復(fù)雜,但其內(nèi)核占用空間極小,而uCOS-II是基于線程模式的,編程簡(jiǎn)單,實(shí)時(shí)性高,但相對(duì)帶來(lái)的開(kāi)銷也大。表9-2比較了Tiny-OS與uCOS-II。操作系統(tǒng)TinyOSuCOS-II運(yùn)行模式事件線程搶占式內(nèi)核否是時(shí)間可確定性否是支持動(dòng)態(tài)編程否否(最小)內(nèi)核RAM:47B,ROM:473BRAM:300B,ROM:2kB低功耗是否表9-2Tiny-OS與uCOS-II的比較與uCOS-II相比,Tiny-OS基于事件驅(qū)動(dòng)的機(jī)制就決定99.1.2TinyOS的特點(diǎn)回本章目錄9.1.2TinyOS的特點(diǎn)回本章目錄10commandvoidtaskLoop();interfaceBoot{/opt/TinyOS-2.形象的稱為命令,即為接口提供的可供調(diào)用的命令。系統(tǒng)本身提供了一系列的組件供用戶調(diào)用,其中包括主組件、應(yīng)用組件、執(zhí)行組件、傳感組件、通信組件和硬件抽象組件,如下圖9-1所示。moduleM2{一個(gè)組件使用了一個(gè)接口,它可以調(diào)用這個(gè)接口的命令,但必須實(shí)現(xiàn)其事件。本章主要內(nèi)容usesinterfaceA1;③一個(gè)module可以同時(shí)提供一組相同的接口,又稱參數(shù)化接口,表明該Module可提供多份同類資源,能夠同時(shí)給多個(gè)組件分享。配件(configuration)是一個(gè)完整的配置列表,配件可以像模塊一樣使用外部的接口并且對(duì)外提供接口。eventvoidA1.nx_uint8_tdata[TOSH_DATA_LENGTH];//有效載荷區(qū)事件處理字階級(jí)組件傳遞的解碼數(shù)據(jù),主要是通過(guò)Post一個(gè)任務(wù)進(jìn)行CRC檢查。配件(configuration)是一個(gè)完整的配置列表,配件可以像模塊一樣使用外部的接口并且對(duì)外提供接口。表9-3環(huán)境變量的配置連接的箭頭是也可以對(duì)稱反過(guò)來(lái),如“BlinkC.nesC的組件模型如圖9-10。一個(gè)nesC語(yǔ)言編寫(xiě)的程序由一個(gè)或多個(gè)組件(component)構(gòu)成或連接而成。④通過(guò)任務(wù)和事件來(lái)管理并發(fā)進(jìn)程TinyOS的應(yīng)用程序都是基于事件驅(qū)動(dòng)模式的,采用事件觸發(fā)去喚醒傳感器工作。事件相當(dāng)于不同組件之間傳遞狀態(tài)信息的信號(hào)。當(dāng)事件對(duì)應(yīng)的硬件中斷發(fā)生時(shí),系統(tǒng)能夠快速地調(diào)用相關(guān)的事件處理程序。任務(wù):一般用在對(duì)于時(shí)間要求不是很高的應(yīng)用中,且任務(wù)之間是平等的,即在執(zhí)行時(shí)是按順序先后來(lái)得,而不能互相占先執(zhí)行,一般為了減少任務(wù)的運(yùn)行時(shí)間,要求每一個(gè)任務(wù)都很短小,能夠使系統(tǒng)的負(fù)擔(dān)較輕;支持網(wǎng)絡(luò)協(xié)議的替換。事件:一般用在對(duì)于時(shí)間的要求很嚴(yán)格的應(yīng)用中,而且它可以占先優(yōu)于任務(wù)和其他事件執(zhí)行,它可以被一個(gè)操作的完成或是來(lái)自外部環(huán)境的事件觸發(fā),在TinyOS中一般由硬件中斷處理來(lái)驅(qū)動(dòng)事件。⑤支持網(wǎng)絡(luò)協(xié)議組件的替換除了默認(rèn)的協(xié)議之外,還提供其他協(xié)議供用戶替換,并且支持客戶自定義協(xié)議,這對(duì)于通信協(xié)議分析,非常適用于通信協(xié)議的研究工作。commandvoidtaskLoop();④通過(guò)任務(wù)11⑥代碼短小精悍TinyOS的程序采用的是模塊化設(shè)計(jì),所以它的程序核心往往都很小,一般來(lái)說(shuō)核心代碼和數(shù)據(jù)大概在400Bytes左右;能夠突破傳感器存儲(chǔ)資源少的限制,這能夠讓TinyOS很有效的運(yùn)行在無(wú)線傳感器網(wǎng)絡(luò)上并去執(zhí)行相應(yīng)的管理工作等。⑥代碼短小精悍129.1.3TinyOS開(kāi)發(fā)平臺(tái)國(guó)內(nèi)目前可以買(mǎi)到的TinyOS開(kāi)發(fā)平臺(tái)主要有兩種,一種是Crossbow公司W(wǎng)SN開(kāi)發(fā)套件,一種億道電子的XSBase-WSN開(kāi)發(fā)套件;Crossbow本身就是TinyOS聯(lián)盟的成員之一,其所有產(chǎn)品都在TinyOS源碼的Platform目錄下可以找到,可以算得上是TinyOS技術(shù)商用化的代表;在國(guó)內(nèi)有一家代理,開(kāi)發(fā)平臺(tái)的做工非常不錯(cuò),產(chǎn)品覆蓋面也比較廣,主要的缺點(diǎn)就是產(chǎn)品太貴,而且中文的資料較少。億道電子的WSN套件使用的是較先進(jìn)CC2430芯片,同時(shí)支持TinyOS和Z-stack兩種開(kāi)發(fā)方式,并且包含大量的中文教材和使用手冊(cè),硬件移植的也非常穩(wěn)定,所有的TinyOS測(cè)試用例都能正常運(yùn)行,而且還帶了大量的中文教材、使用手冊(cè)和實(shí)驗(yàn)用例,其中值得一提的是,該產(chǎn)品搭建了一整套的解決方案框架,實(shí)現(xiàn)了異構(gòu)網(wǎng)絡(luò)之間的互聯(lián)互通,可以在任何一地通過(guò)GPRS手機(jī)上網(wǎng),訪問(wèn)節(jié)點(diǎn)上的物理數(shù)據(jù),開(kāi)發(fā)者可以迅速的在這個(gè)框架下做二次開(kāi)發(fā)?;乇菊履夸?.1.3TinyOS開(kāi)發(fā)平臺(tái)國(guó)內(nèi)目前可以買(mǎi)到的TinyO139.1.4TinyOS開(kāi)發(fā)案例目前有多個(gè)采用TinyOS的研究項(xiàng)目,如UCLA(加州大學(xué)洛杉磯分校)的ShahinFarshchi在進(jìn)行一項(xiàng)以TinyOS為基礎(chǔ)的無(wú)線神經(jīng)界面研究。這樣的系統(tǒng)在100Hz/頻道的采樣頻率下可傳感、放大、傳輸神經(jīng)信號(hào),系統(tǒng)小巧、成本低、重量輕、功率小。系統(tǒng)要求一個(gè)接收器接收、解調(diào)、顯示傳輸?shù)纳窠?jīng)信號(hào)。在采樣精度為8bit時(shí),系統(tǒng)的速度可達(dá)5600。該速度可保證8個(gè)EEG頻道、或1個(gè)速度為每秒采樣頻道的可靠傳輸。研究者目前的奮斗目標(biāo)是提高該基于TinyOS的傳感網(wǎng)絡(luò)的數(shù)據(jù)傳輸速度,設(shè)計(jì)與被測(cè)對(duì)象連接的前端神經(jīng)放大電路。

路易斯安娜州立大學(xué)和位于BatonRouge的南方大學(xué)的Nian-FengTzeng博士正在研究應(yīng)用于石油/氣體開(kāi)發(fā)和管理的UcoMS(UbiquitousComputingandMonitoringSystem,泛計(jì)算和監(jiān)控系統(tǒng))。該系統(tǒng)適用于傳感網(wǎng)絡(luò)、無(wú)線通信和網(wǎng)格計(jì)算,主要功能包括幫助鉆孔、操作數(shù)據(jù)記錄和處理、在線平臺(tái)信息發(fā)布和顯示、設(shè)備監(jiān)控/入侵檢測(cè)、地震處理、復(fù)雜表面設(shè)備和管道的管理。也可使用UCoMS監(jiān)控、維護(hù)淘汰的平臺(tái)。

另外,F(xiàn)reescale正在其Zigbee開(kāi)發(fā)板上測(cè)試TinyOS和TinyDB,波士頓大學(xué)的WeiLi將其用于傳感網(wǎng)絡(luò)的控制和優(yōu)化?;乇菊履夸?.1.4TinyOS開(kāi)發(fā)案例目前有多個(gè)采用TinyOS的149.1.5TinyOS的基本概念TinyOS系統(tǒng)、庫(kù)及應(yīng)用程序都是用nesC語(yǔ)言寫(xiě)的語(yǔ)言寫(xiě)的,這時(shí)一種新的用于編寫(xiě)結(jié)構(gòu)化的基于組件的應(yīng)用程序的語(yǔ)言。nesC語(yǔ)言主要用于諸如傳感器網(wǎng)絡(luò)等嵌入式系統(tǒng)。nesC具有類似于C語(yǔ)言的語(yǔ)法,但支持TinyOS的并發(fā)模型,同時(shí)具有結(jié)構(gòu)化機(jī)制、命名機(jī)制,能夠與其他軟組件鏈接在一起從而形成一個(gè)魯棒的網(wǎng)絡(luò)嵌入式系統(tǒng)。其主要目標(biāo)是幫助應(yīng)用程序設(shè)計(jì)者建立可易于組合成完整、并發(fā)式系統(tǒng)的組件,并能夠在編譯時(shí)執(zhí)行廣泛的檢查。TinyOS定義了許多在nesC中所表達(dá)的重要概念。首先,nesC應(yīng)用程序要建立在定義良好、具有雙向接口的組件之上。其次,nesC定義了并發(fā)模型,該模型是基于任務(wù)(task)及硬件事件句柄(hardwareeventhandler)的,在編譯時(shí)會(huì)檢測(cè)數(shù)據(jù)爭(zhēng)用(datarace)?;乇菊履夸?.1.5TinyOS的基本概念TinyOS系統(tǒng)、庫(kù)及15⑴組件任何一個(gè)nesC應(yīng)用程序都是有一個(gè)或多個(gè)組件鏈接起來(lái),從而形成一個(gè)完整的可執(zhí)行程序的。組件提供(provide)并使用(use)接口。這些接口是組件的唯一訪問(wèn)點(diǎn)并且它們是雙向的。接口聲明了一組函數(shù),稱為命令(command),接口的提供者必須實(shí)現(xiàn)它們;還聲明了另外一組函數(shù),稱為事件(event),接口的使用者必須實(shí)現(xiàn)它們。對(duì)于一個(gè)組件而言,如果它要使用某個(gè)接口中的命令,它必須實(shí)現(xiàn)這個(gè)接口的事件。一個(gè)組件可以使用或提供多個(gè)接口以及同一個(gè)接口的多個(gè)實(shí)例。在nesC中有兩種類型的組件,分別稱為模塊(module)和配件(configuration)。模塊提供應(yīng)用程序代碼,實(shí)現(xiàn)一個(gè)或多個(gè)接口;配件則是用來(lái)將其它組件裝配起來(lái)的組件,將各個(gè)組件所使用的接口與其它組件提供的接口連接在一起。這種行為稱為導(dǎo)通(wiring)。每個(gè)nesC應(yīng)用程序都由一個(gè)頂級(jí)配置所描述,其內(nèi)容就是將該應(yīng)用程序所用到的所有組件導(dǎo)通起來(lái),形成一個(gè)有機(jī)整體。

⑴組件16⑵并發(fā)模型TinyOS一次僅執(zhí)行一個(gè)程序。組成程序的組件來(lái)自于兩個(gè)方面,一部分是系統(tǒng)提供的組件,另一部分是為特定應(yīng)用用戶自定義的組件。程序運(yùn)行時(shí),有兩個(gè)執(zhí)行線程:一個(gè)稱為任務(wù)(task),另一個(gè)稱為硬件事件句柄(hardwareeventhandler)。任務(wù)是被延期執(zhí)行的函數(shù),它們一旦被調(diào)度,就會(huì)運(yùn)行直至結(jié)束,并且在運(yùn)行過(guò)程中不準(zhǔn)相互搶占。硬件事件句柄是用來(lái)相應(yīng)和處理硬件中斷的,雖然也要運(yùn)行完畢,但它們可能會(huì)搶占任務(wù)或其他硬件事件句柄的執(zhí)行。命令和事件要作為硬件事件句柄的一部分而執(zhí)行必須使用關(guān)鍵字async來(lái)聲明。

因?yàn)槿蝿?wù)和硬件事件句柄可能被其他異步代碼所搶占,所以nesC程序易于受到特定競(jìng)爭(zhēng)條件的影響,導(dǎo)致產(chǎn)生不一致或不正確的數(shù)據(jù)。避免競(jìng)爭(zhēng)的辦法通常是在任務(wù)內(nèi)排他地訪問(wèn)共享數(shù)據(jù),或訪問(wèn)所有數(shù)據(jù)都使用原子語(yǔ)句。nesC編譯器會(huì)在編譯時(shí)向程序員報(bào)告潛在的數(shù)據(jù)爭(zhēng)用,這里面可能包含事實(shí)上并不可能發(fā)生的沖突。如果程序員確實(shí)可以擔(dān)保對(duì)某個(gè)數(shù)據(jù)的訪問(wèn)不會(huì)導(dǎo)致麻煩,可以將該變量使用關(guān)鍵字norace來(lái)聲明,但使用這個(gè)關(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安裝過(guò)程結(jié)束,可以自行編寫(xiě)一個(gè)測(cè)試程序。在D盤(pán)根目錄下新建文件夾javatest,然后創(chuàng)建文本文件,將下面的代碼拷入并保存成文件,注意文件名要與類名相一致。publicclassTest{ publicstaticvoidmain(String[]args) { System.out.println("HelloWorld!"); }}然后再使用cmd命令進(jìn)入命令行,并進(jìn)入該目錄下,嘗試使用如下命令編譯并執(zhí)行該java程序,如果然后屏幕上會(huì)打印出”HelloWorld!”,則表示JDK安裝成功。javaTest③在系統(tǒng)變量中找到Path:將%JAVA_HOME%\bi20圖9-6選擇安裝類型圖9-6選擇安裝類型21①硬件抽象組件將物理硬件映射到TinyOS的組件模型;interfaceScheduler{一個(gè)組件可以使用(use)或提供(provide)多個(gè)接口或者同一接口的多個(gè)實(shí)例。回本章目錄include$(MAKERULES)該內(nèi)容要放在中,SendMsg接口類型提供者必須實(shí)現(xiàn)send,而使用者必須實(shí)現(xiàn)sendDone事件。componentsM2;commandboolrunNextTask(boolsleep);implementation{TOSSIM模擬器提供運(yùn)行時(shí)調(diào)試輸出信息,允許用戶從不同角度分析和觀察程序的執(zhí)行過(guò)程。大致看來(lái),在TinyOS的通訊經(jīng)歷的組件流程如圖9-13所示usesinterfaceA1;usesinterfaceB1;/opt/TinyOS-2.TOSHruntask();語(yǔ)法結(jié)構(gòu)類似于C語(yǔ)言,只是在最前面增加event關(guān)鍵字。硬件事件句柄是用來(lái)相應(yīng)和處理硬件中斷的,雖然也要運(yùn)行完畢,但它們可能會(huì)搶占任務(wù)或其他硬件事件句柄的執(zhí)行。接口SendMsg中包含commandssend和eventssenddone。c-otest就可以編譯該程序。8位無(wú)符號(hào)數(shù):uint8_t⑶TinyOS的程序運(yùn)行機(jī)制③選擇安裝目錄時(shí),在DefaultTextFileType中要選擇Unix/binary,如圖9-7。圖9-7選擇安裝目錄①硬件抽象組件將物理硬件映射到TinyOS的組件模型;③22④然后在選擇需要安裝的工具時(shí),全部選中,用鼠標(biāo)點(diǎn)擊“default”變成“install”。⑤最后點(diǎn)擊安裝來(lái)開(kāi)始安裝,整個(gè)過(guò)程需要較長(zhǎng)時(shí)間。⑶安裝單片機(jī)工具可以選擇AVR或MSP430等,根據(jù)自己的需要安裝。如果選擇AVR,則需要下面幾個(gè)包:avr-binutils、avr-gcc、avr-libc、avarice、insight(avr-gdb)、avrdude,這幾個(gè)包的下載地址在本節(jié)開(kāi)始提到的網(wǎng)站中可以找到,需要注意的是,在cygwin和Linux下下載的包是不一樣的。⑷安裝nesC和TinyOS_tool這一步需要安裝NesC、Deputy、TinyOS-tools三個(gè)包,這幾個(gè)包的下載地址在本節(jié)開(kāi)始提到的網(wǎng)站中可以找到,這里同樣需要需要在cygwin和Linux下下載的包是不一樣的,使用Linux的rpm命令來(lái)安裝這些包。④然后在選擇需要安裝的工具時(shí),全部選中,用鼠標(biāo)點(diǎn)擊“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簡(jiǎn)介9.3.1nesC概述9.3.2nesC基本概念9.3.3一個(gè)簡(jiǎn)單的nesC編程示例9.3.4TOSSIM仿真回本章目錄9.3nesC簡(jiǎn)介9.3.1nesC概述9.3.2ne269.3.1nesC概述nesC語(yǔ)言是一種在C基礎(chǔ)上擴(kuò)展的編程語(yǔ)言,主要用于傳感器網(wǎng)絡(luò)的編程開(kāi)發(fā),這類系統(tǒng)的特點(diǎn)是內(nèi)存有限,存在任務(wù)和中斷兩類操作。nesC語(yǔ)言由加州大學(xué)伯克利分校研發(fā)人員開(kāi)發(fā)。TinyOS最初是用匯編和C語(yǔ)言編寫(xiě)的,后來(lái)改用支持組件化編程的nesC語(yǔ)言。該語(yǔ)言把組件化/模塊化思想和基于事件驅(qū)動(dòng)的執(zhí)行模型結(jié)合起來(lái)。nesC使用C作為其基礎(chǔ)語(yǔ)言,支持所有的C語(yǔ)言詞法和語(yǔ)法,其獨(dú)有的特色如下:①增加了組件(component)和接口(interface)的關(guān)鍵字定義;②定義了接口及如何使用接口表達(dá)組件之間關(guān)系的方法;③目前只支持組件的靜態(tài)連接,不能實(shí)現(xiàn)動(dòng)態(tài)連接和配置?;乇菊履夸?.3.1nesC概述回本章目錄27圖9-8所示是nesC語(yǔ)言的一般程序框架。該系統(tǒng)中的一個(gè)組件一般會(huì)提供一些接口(假定組件名為ComA),接口可以被認(rèn)為是這個(gè)軟件組件實(shí)現(xiàn)的一組函數(shù)的聲明,是單獨(dú)定義的一組命令和事件,其他組件通過(guò)引用相同接口聲明來(lái)使用這個(gè)組件(ComA)的函數(shù),從而實(shí)現(xiàn)組件間功能的相互調(diào)用,即組件的接口是實(shí)現(xiàn)組件間互連的通道。但若組件中實(shí)現(xiàn)的函數(shù)并未被它在接口中說(shuō)明,就不能被其他組件所使用。nesC語(yǔ)言的定義中存在兩種不同功能的組件:其中組件接口中的函數(shù)功能專門(mén)在模塊的組件文件中實(shí)現(xiàn),而不同組件之間的關(guān)系則是專門(mén)通過(guò)稱為配件的組件文件來(lái)描述的。圖9-8基于nesC語(yǔ)言的一般程序框架圖圖9-8所示是nesC語(yǔ)言的一般程序框架。該系統(tǒng)中的一個(gè)組件28

為了跨平臺(tái)使用,變量的類型和標(biāo)準(zhǔn)C語(yǔ)言的int、long和char不一樣。TinyOS代碼使用的是更清楚直接的類型,直接聲明字節(jié)大小。事實(shí)上,這些能映射到基本的C類型,在不同的平臺(tái)上是不同的映射,大多數(shù)平臺(tái)支持浮點(diǎn)數(shù)運(yùn)算,double可能不行。對(duì)于整形,nesC的定義如下:8位帶符號(hào)數(shù):int8_t8位無(wú)符號(hào)數(shù):uint8_t16位帶符號(hào)數(shù):int16_t16位無(wú)符號(hào)數(shù):uint16_t32位帶符號(hào)數(shù):int32_t32位無(wú)符號(hào)數(shù):uint32_t雖然可以給應(yīng)用程序中的模塊和配件取任意的名稱,但為了簡(jiǎn)便,建議在編寫(xiě)代碼時(shí)使用如表9-4所示的統(tǒng)一的命名格式。為了跨平臺(tái)使用,變量的類型和標(biāo)準(zhǔn)C語(yǔ)言的int、long29表9-4nesC程序的命名最后簡(jiǎn)單介紹一下使用nesC編程的流程,nesC語(yǔ)言開(kāi)發(fā)應(yīng)用程序的一般步驟如圖9-9所示。圖9-9使用nesC編程的流程表9-4nesC程序的命名最后簡(jiǎn)單介紹一下使用nesC編309.3.2nesC基本概念⑴組件一個(gè)nesC語(yǔ)言編寫(xiě)的程序由一個(gè)或多個(gè)組件(component)構(gòu)成或連接而成。一個(gè)組件由兩部分組成:第一個(gè)部分是規(guī)范說(shuō)明,包含要用接口的名字;另一部分是它們的實(shí)現(xiàn)。一個(gè)組件可以提供接口(provides),也可以使用接口(uses),提供的接口描述了該組件提供給上一層調(diào)用者的功能,而使用的接口則表示了該組件本身工作時(shí)需要的功能。組件分兩種:Module組件(模塊)用于實(shí)現(xiàn)某種邏輯功能;Configuration組件(配件)用于將各個(gè)組件連接起來(lái)成為一個(gè)整體。組件特征的特征是組件內(nèi)變量、函數(shù)可以自由訪問(wèn),但組件之間不能訪問(wèn)和調(diào)用。nesC的組件模型如圖9-10?;乇菊履夸?.3.2nesC基本概念⑴組件回本章目錄31⑵接口接口是一組相關(guān)函數(shù)的集合,它是雙向的并且是組件間的唯一訪問(wèn)點(diǎn)。由于大多數(shù)的節(jié)點(diǎn)平臺(tái)沒(méi)有基于硬件的內(nèi)存保護(hù)措施,也沒(méi)有將用戶地址空間和系統(tǒng)地址空間分離開(kāi),只有一個(gè)所有組件都能共享的地址空間。最好的辦法就是保持內(nèi)存盡可能少的共享。組件聲明的任何狀態(tài)變量都是私有的:沒(méi)有任何其他組件可以對(duì)它進(jìn)行命名或者直接訪問(wèn)它。兩個(gè)組件直接交互的唯一方式是通過(guò)接口。接口聲明了兩種函數(shù):圖9-10TinyOS的組件模型⑵接口圖9-10TinyOS的組件模型32在中,SchedulerBasicP是主要的TinyOS調(diào)度器,提供帶參數(shù)的TaskBasic接口。$TOSROOT/support/make/Makerules連接的箭頭是也可以對(duì)稱反過(guò)來(lái),如“BlinkC.接口SendMsg和ReceiveMsg都是參數(shù)化接口,參數(shù)id就是前面說(shuō)的handlerid。在采樣精度為8bit時(shí),系統(tǒng)的速度可達(dá)5600。①provides未必一定有組件使用,但uses一定要有人提供,否則編譯會(huì)提示出錯(cuò)。⑶TinyOS的程序運(yùn)行機(jī)制與uCOS-II相比,Tiny-OS基于事件驅(qū)動(dòng)的機(jī)制就決定了其實(shí)時(shí)性不高,編程復(fù)雜,但其內(nèi)核占用空間極小,而uCOS-II是基于線程模式的,編程簡(jiǎn)單,實(shí)時(shí)性高,但相對(duì)帶來(lái)的開(kāi)銷也大。nesC使用箭頭“->”來(lái)綁定一個(gè)接口到另一個(gè)接口,但一定要是同一類接口。TinyOS在某些場(chǎng)合因?qū)崟r(shí)性比較差,會(huì)出現(xiàn)任務(wù)過(guò)載、任務(wù)阻塞、任務(wù)隊(duì)列溢出、通信吞吐量下降等一系列問(wèn)題,從而導(dǎo)致系統(tǒng)崩潰,在這種情況下,需進(jìn)一步改進(jìn)TinyOS實(shí)時(shí)性、并發(fā)性及移植性,并通過(guò)完善其整體架構(gòu)來(lái)提高其綜合性能。硬件事件句柄是用來(lái)相應(yīng)和處理硬件中斷的,雖然也要運(yùn)行完畢,但它們可能會(huì)搶占任務(wù)或其他硬件事件句柄的執(zhí)行。消息的發(fā)送涉及組件、接口和事件三方面,當(dāng)上層組件有消息發(fā)送時(shí)通過(guò)接口調(diào)用下層組件來(lái)實(shí)現(xiàn)。這里需要將頂層的配置放到COMPONENT中。$TOSROOT/support/make/Makerules3一個(gè)簡(jiǎn)單的nesC編程示例此確認(rèn)消息是在主動(dòng)消息層的最底層生成,其內(nèi)容是一個(gè)特殊立即序列,發(fā)送方可迅速確定是否需重發(fā)消息。若任務(wù)隊(duì)列為空,CPU進(jìn)入休眠狀態(tài)以降低功耗。providesinterfaceA1;路易斯安娜州立大學(xué)和位于BatonRouge的南方大學(xué)的Nian-FengTzeng博士正在研究應(yīng)用于石油/氣體開(kāi)發(fā)和管理的UcoMS(UbiquitousComputingandMonitoringSystem,泛計(jì)算和監(jiān)控系統(tǒng))。cmd1(0x11);①命令(command):接口的提供者必須實(shí)現(xiàn)它們;②事件(event):接口的使用者必須實(shí)現(xiàn)它們。也就是說(shuō),提供了接口的組件必須實(shí)現(xiàn)該接口的命令函數(shù);而使用了某接口的組件必須實(shí)現(xiàn)該接口的事件函數(shù)。函數(shù)調(diào)用時(shí),命令用call,事件用signal,在一個(gè)組件中,provides的接口中的command函數(shù)必須被實(shí)現(xiàn)(在implementation中定義),uses的接口中的event函數(shù)必須被實(shí)現(xiàn)。async指出這個(gè)command或者event可以在有中斷時(shí)使用。如果一個(gè)組件調(diào)用了(call)的一個(gè)接口命令,必須實(shí)現(xiàn)該接口的事件。一個(gè)組件可以使用(use)或提供(provide)多個(gè)接口或者同一接口的多個(gè)實(shí)例。在中,SchedulerBasicP是主要的TinyOS調(diào)度33接口的特點(diǎn)是:①provides未必一定有組件使用,但uses一定要有人提供,否則編譯會(huì)提示出錯(cuò)。在動(dòng)態(tài)組件配置語(yǔ)言中uses也可以動(dòng)態(tài)配置。②接口可以連接多個(gè)同樣的接口,叫做多扇入/扇出。③一個(gè)module可以同時(shí)提供一組相同的接口,又稱參數(shù)化接口,表明該Module可提供多份同類資源,能夠同時(shí)給多個(gè)組件分享??梢园凑障旅娴姆椒ǘx接口:①接口放在一個(gè)單獨(dú)的文件中*.nc②接口的名稱應(yīng)與文件名對(duì)應(yīng),例如interface1的接口必須對(duì)應(yīng)于文件名。③接口定義描述了一系列函數(shù)原型(command和event)接口的特點(diǎn)是:34一個(gè)簡(jiǎn)單地接口如下:interfaceSendMsg{commandresult_tsend(uint16_taddress,uint8_tlength,TOS_MsgPtrmsg);eventresult_tsendDone(TOS_MsgPtrmsg,result_tsuccess);}該內(nèi)容要放在中,SendMsg接口類型提供者必須實(shí)現(xiàn)send,而使用者必須實(shí)現(xiàn)sendDone事件。nesC使用箭頭“->”來(lái)綁定一個(gè)接口到另一個(gè)接口,但一定要是同一類接口。例如“A->B”意為A連接到B,A是接口的使用者(user),而B(niǎo)是接口的提供者(provider)。完整的表達(dá)式應(yīng)該為:A.a->B.b,這意味著,組件A的接口a連接到組件B的接口b。當(dāng)一個(gè)組件使用或者提供同一個(gè)接口的多個(gè)不同實(shí)例時(shí),設(shè)置別名就非常有必要了。當(dāng)一個(gè)組件只含有一個(gè)接口的時(shí)候,就可以省略接口的名字了。連接的箭頭是也可以對(duì)稱反過(guò)來(lái),如“BlinkC.Timer0->Timer0”同“Timer0<-BlinkC.Timer0;”等價(jià),但為了方便閱讀,大多數(shù)連接的箭頭還是從左到右的。一個(gè)組件使用了一個(gè)接口,它可以調(diào)用這個(gè)接口的命令,但必須實(shí)現(xiàn)其事件。調(diào)用接口命令需要關(guān)鍵字“call”,調(diào)用接口事件需要關(guān)鍵字“signal”。一個(gè)簡(jiǎn)單地接口如下:35⑶模塊模塊(module)提供一個(gè)或多個(gè)接口的實(shí)現(xiàn)。模塊是接口的實(shí)現(xiàn)者和使用者,模塊名也必須與文件名同名,模塊包含兩部分內(nèi)容:①模塊使用和提供的接口描述②模塊內(nèi)部的實(shí)現(xiàn)代碼下面是一個(gè)模塊的示例,該模塊要放置到中。moduleM1{/*聲明部分*/providesinterfaceA1;usesinterfaceB1;}implementation{/*實(shí)現(xiàn)部分,C代碼*/commandvoidA1.cmd1(){callB1.cmd2();}eventvoidA1.event1(){…}}⑶模塊36⑷配件配件(configuration)是一個(gè)完整的配置列表,配件可以像模塊一樣使用外部的接口并且對(duì)外提供接口。組件名也必須與文件名同名,同模塊一樣,配件也包含兩部分內(nèi)容:①組件使用和提供的接口描述②組件內(nèi)部的實(shí)現(xiàn)代碼(配置列表)配件(configuration)把其他的組件裝配起來(lái),連接組件使用的接口到其提供者。每個(gè)nesC應(yīng)用程序都必須有且只有一個(gè)頂層配件(top-levelconfiguration)連接內(nèi)部組件。之所以區(qū)別設(shè)計(jì)模塊與配件,是為了讓系統(tǒng)設(shè)計(jì)者在構(gòu)建應(yīng)用程序的時(shí)候可以脫離現(xiàn)有的實(shí)現(xiàn)。例如:設(shè)計(jì)者可以提供配件,只是簡(jiǎn)單地把一個(gè)或多個(gè)模塊連接起來(lái),而不涉及其中具體的工作。同樣地,另一個(gè)開(kāi)發(fā)者負(fù)責(zé)提供一組模塊庫(kù),這些模塊可以普遍使用到眾多應(yīng)用中。下面是一個(gè)組件的示例,該示例要保存到文件中。configurationC1{providesinterfaceA1;}implementation{componentsM1;componentsM2;A1=M1.A1;M1.B1->M2.B1;}⑷配件37⑸命令命令是在接口中的一種函數(shù),這種函數(shù)要求接口的提供者實(shí)現(xiàn),而接口的使用者則會(huì)調(diào)用這種函數(shù)。形象的稱為命令,即為接口提供的可供調(diào)用的命令。語(yǔ)法結(jié)構(gòu)類似于C語(yǔ)言,只是在最前面增加command關(guān)鍵字。①命令定義下面給出一個(gè)命令的定義。interfaceA1{commandintcmd1(intarg);…}②命令實(shí)現(xiàn)下面給出一個(gè)命令的實(shí)現(xiàn)moduleM1{providesinterfaceA1;…}implementation{commandintA1.cmd1(intarg){……}}⑸命令38③命令使用下面給出一個(gè)命令的使用,調(diào)用命令時(shí)一定要用call命令,否則編譯會(huì)出錯(cuò)。moduleM2{usesinterfaceA1;}implementation{…intret=callA1.cmd1(0x11);…}⑹事件事件也是在接口中的一種函數(shù),這種函數(shù)要求接口的提供者調(diào)用,而接口的使用者則會(huì)實(shí)現(xiàn)這種函數(shù)。形象的稱為event,即為接口使用者所實(shí)現(xiàn)的事件處理函數(shù)。語(yǔ)法結(jié)構(gòu)類似于C語(yǔ)言,只是在最前面增加event關(guān)鍵字。①事件定義下面給出一個(gè)事件的定義,它可以擁有參數(shù)和返回值。interfaceA1{…eventvoidevent1(intarg1,intarg2);}③命令使用⑹事件39②事件實(shí)現(xiàn)下面給出的是事件的實(shí)現(xiàn),接口的提供者在發(fā)出事件時(shí),必須使用關(guān)鍵字post,否則編譯會(huì)出錯(cuò)。moduleM1{providesinterfaceA1;}implementation{…postA1.event1(0x1,0x2);/*發(fā)出對(duì)應(yīng)的事件,實(shí)際上類同于調(diào)用事件處理函數(shù)*/…}③事件使用下面給出使用事件的方法,接口使用者必須實(shí)現(xiàn)事件的具體內(nèi)容,如同事件處理函數(shù)一樣。moduleM2{usesinterfaceA1;}implementation{eventvoidA1.event1(intarg1,intarg2){…}}②事件實(shí)現(xiàn)40⑺任務(wù)任務(wù)是TinyOS系統(tǒng)提供的一種特殊的機(jī)制,類同于線程。在大多數(shù)情況下,因?yàn)橥酱a是非搶占的,這種編程方式行之有效。但是,這種做法并不適合大規(guī)模計(jì)算。當(dāng)一個(gè)組件需要做什么且此時(shí)還有寬裕的時(shí)間,最好給TinyOS延遲計(jì)算的能力,即處理完之前已在等待的事情后再執(zhí)行。任務(wù)是一個(gè)函數(shù),組件告訴TinyOS稍后再運(yùn)行而不是立即運(yùn)行。任務(wù)一般為一個(gè)函數(shù),無(wú)參數(shù),無(wú)返回值。任務(wù)可以在一般的TinyOS程序中發(fā)出,而任務(wù)的執(zhí)行是由TinyOS系統(tǒng)內(nèi)核來(lái)實(shí)現(xiàn)的。并且任務(wù)的執(zhí)行是不影響調(diào)用者的,將會(huì)在發(fā)出任務(wù)后的某一個(gè)時(shí)刻被調(diào)度運(yùn)行。任務(wù)具有如下特點(diǎn):①無(wú)參數(shù)、無(wú)返回值②系統(tǒng)會(huì)按特定的順序調(diào)度這些任務(wù)③任務(wù)執(zhí)行期間不能搶占,但是可以被中斷所搶占④在任務(wù)未執(zhí)行時(shí),發(fā)出多少個(gè)任務(wù),都將只運(yùn)行一次這個(gè)任務(wù)系統(tǒng)執(zhí)行完一個(gè)任務(wù)后才會(huì)去執(zhí)行其它任務(wù),所以任務(wù)一般要求短小,不至于影響其它任務(wù)。⑺任務(wù)41任務(wù)的定義一般也是放在module中的,下面給出一個(gè)任務(wù)示例:moduleM1{}implementation{…taskvoidtask1(){…}

voidf1(){posttask1();}}為了協(xié)調(diào)任務(wù)和中斷的執(zhí)行,nesC使用“atomic”指出該段代碼“不可被打斷”。另外定義了“task”封裝一些代碼來(lái)完成一個(gè)任務(wù),系統(tǒng)有FIFO的任務(wù)隊(duì)列。不同的任務(wù)之間沒(méi)有優(yōu)先級(jí),但任務(wù)可以被interrupthandler打斷。為防止全局變量等公用數(shù)據(jù)被非正常修改,nesC規(guī)定只在任務(wù)中進(jìn)入公共的數(shù)據(jù)部分。任務(wù)的定義一般也是放在module中的,下面給出一個(gè)任務(wù)示例429.3.3一個(gè)簡(jiǎn)單的nesC編程示例下面是一個(gè)最簡(jiǎn)單的C程序,在Linux上,你只要使用命令gcctest.c-otest就可以編譯該程序。intmain(){ return0;}在TinyOS中,要完成同樣的事,你需要三個(gè)文件。讀者可以參考以下步驟來(lái)建立這個(gè)最簡(jiǎn)單地程序:⑴創(chuàng)建一個(gè)文件夾,如simple,來(lái)保存這三文件。⑵為我們的程序創(chuàng)建一個(gè)配置文件,內(nèi)容如下:configurationSimpleAppC{}implementation{ componentsSimpleC,MainC;

SimpleC.Boot->MainC.Boot;}在這個(gè)程序中有兩個(gè)組件:Main組件和SimpleC組件,其中,Main組件提供了實(shí)際上是程序入口點(diǎn)的信號(hào)。

回本章目錄9.3.3一個(gè)簡(jiǎn)單的nesC編程示例下面是一個(gè)最簡(jiǎn)單的C程43⑶創(chuàng)建組件文件,這里包含SimpleC的定義(接口),內(nèi)容如下:moduleSimpleC{ usesinterfaceBoot;}

implementation{ eventvoidBoot.booted() {//Theentrypointoftheprogram }}⑷創(chuàng)建Makefile文件,Makefile文件用來(lái)控制該程序的編譯,Makefile文件內(nèi)容如下:COMPONENT=SimpleAppCinclude$(MAKERULES)這里需要將頂層的配置放到COMPONENT中。⑸使用如下命令來(lái)編譯該程序$makemicaz如果環(huán)境變量等都已經(jīng)配置好,這里就可以成功編譯。⑶創(chuàng)建組件文件,這里包含SimpleC的定義(接口),內(nèi)容449.3.4TOSSIM仿真TOSSIM是一個(gè)支持基于TinyOS的應(yīng)用在PC機(jī)上運(yùn)行的模擬器,TOSSIM將TinyOS環(huán)境下的nesC代碼直接編譯為可在PC機(jī)環(huán)境下運(yùn)行的可執(zhí)行文件,提供了不用將程序下載到真實(shí)的節(jié)點(diǎn)上就可以對(duì)程序進(jìn)行測(cè)試的一個(gè)平臺(tái)。TOSSIM模擬器提供運(yùn)行時(shí)調(diào)試輸出信息,允許用戶從不同角度分析和觀察程序的執(zhí)行過(guò)程。TOSSIM提供了用于顯示仿真情況的用戶界面TINYVIZ,它是一個(gè)基于java的gui應(yīng)用程序,它允許用戶以可視化方式控制程序的模擬過(guò)程。TINYVIZ提供了圖形調(diào)試接口,它能可視化地和TinyOS應(yīng)用程序交互,能使用戶方便地跟蹤應(yīng)用的執(zhí)行,可以設(shè)置斷點(diǎn),查看變量,同時(shí)可以模擬多個(gè)節(jié)點(diǎn)的執(zhí)行,并能夠根據(jù)一定的模擬設(shè)置網(wǎng)絡(luò)屬性?;乇菊履夸?.3.4TOSSIM仿真TOSSIM是一個(gè)支持基于Ti45commandvoidinit();callInterrupt.publicstaticvoidmain(String[]args)完整的表達(dá)式應(yīng)該為:A.2TinyOS的調(diào)度機(jī)制由于無(wú)線傳感器網(wǎng)絡(luò)的特殊性,研究人員在設(shè)計(jì)TinyOS系統(tǒng)時(shí)就提出以下幾個(gè)原則:5TinyOS的基本概念同cygwin下的配置componentsSchedulerBasicPasSched;但是,這種做法并不適合大規(guī)模計(jì)算。cmd1(0x11);一個(gè)完整的應(yīng)用系統(tǒng)由一個(gè)內(nèi)核調(diào)度器(簡(jiǎn)稱調(diào)度器)和許多功能獨(dú)立且相互聯(lián)系的組件構(gòu)成,可以把TinyOS系統(tǒng)和在其上運(yùn)行的應(yīng)用程序看成是一個(gè)大的“執(zhí)行程序”。interfaceA1{系統(tǒng)執(zhí)行完一個(gè)任務(wù)后才會(huì)去執(zhí)行其它任務(wù),所以任務(wù)一般要求短小,不至于影響其它任務(wù)。使用了三種機(jī)制來(lái)管理和控制能量狀態(tài)。當(dāng)沒(méi)有中斷發(fā)生時(shí),調(diào)度器會(huì)從隊(duì)列中取出一個(gè)任務(wù)執(zhí)行,任務(wù)執(zhí)行過(guò)程中可以被打斷。⑤支持網(wǎng)絡(luò)協(xié)議組件的替換①硬件抽象組件將物理硬件映射到TinyOS的組件模型;現(xiàn)有的TinyOS系統(tǒng)提供了大多數(shù)傳感網(wǎng)硬件平臺(tái)和應(yīng)用領(lǐng)域里都可用到的組件,例如定時(shí)器組件、傳感器組件、消息收發(fā)組件、電源管理組件等,從而把用戶和底層硬件隔離開(kāi)來(lái)。TOSSIM模擬器提供運(yùn)行時(shí)調(diào)試輸出信息,允許用戶從不同角度分析和觀察程序的執(zhí)行過(guò)程。下面介紹利用TOSSIM模擬TINYVIZ程序的具體方法。①進(jìn)入cygwin應(yīng)用程序,進(jìn)入應(yīng)用程序所在目錄,其中最后一級(jí)的目錄為應(yīng)用程序。②運(yùn)行命令:makepc,該命令的作用是將應(yīng)用程序編譯為pc機(jī)能執(zhí)行的二進(jìn)制文件;③然后運(yùn)行命令:exportdbg=usr1,此處dbg模式設(shè)置為usr1;④最后運(yùn)行:build/pc/main.exe-gui20,此處,20為傳感器節(jié)點(diǎn)數(shù)目,可人為設(shè)定。此時(shí)打開(kāi)另外一個(gè)cygwin應(yīng)用程序,注意不要關(guān)閉原來(lái)的cygwin應(yīng)用程序。①進(jìn)入目錄:…②運(yùn)行命令:make③然后再運(yùn)行命令:④此時(shí)就可以運(yùn)行仿真了,20個(gè)節(jié)點(diǎn)情形的仿真過(guò)程如圖9-11所示,其中被箭頭指向的節(jié)點(diǎn)為接收到信息的節(jié)點(diǎn)。commandvoidinit();下面介紹利用TOSS46圖9-1120個(gè)節(jié)點(diǎn)的仿真圖9-1120個(gè)節(jié)點(diǎn)的仿真479.4TinyOS內(nèi)部機(jī)制簡(jiǎn)介9.4.1TinyOS程序運(yùn)行機(jī)制分析9.4.2TinyOS的調(diào)度機(jī)制9.4.3TinyOS的通信模型9.4.4TinyOS的能量管理回本章目錄9.4TinyOS內(nèi)部機(jī)制簡(jiǎn)介9.4.1TinyOS程序489.4.1TinyOS程序運(yùn)行機(jī)制分析⑴的啟動(dòng)接口的啟動(dòng)接口包含如下三個(gè)內(nèi)容:①I(mǎi)nit:初始化組件和硬件狀態(tài);interfaceInit{commanderror_tinit();}②Scheduler:初始化和運(yùn)行任務(wù);interfaceScheduler{commandvoidinit();commandboolrunNextTask(boolsleep);commandvoidtaskLoop();}③Boot:通知系統(tǒng)已經(jīng)成功地啟動(dòng)interfaceBoot{eventvoidbooted();}回本章目錄9.4.1TinyOS程序運(yùn)行機(jī)制分析⑴的啟動(dòng)接口回本章目49⑵TinyOS的啟動(dòng)順序TinyOS的啟動(dòng)順序有以下4步:①調(diào)度程序初始化;②組件初始化;③發(fā)送啟動(dòng)boot過(guò)程完成的信號(hào);④運(yùn)行調(diào)度程序。⑶TinyOS的程序運(yùn)行機(jī)制TinyOS程序通過(guò)并口導(dǎo)入到節(jié)點(diǎn)之上,節(jié)點(diǎn)一旦加電程序就會(huì)運(yùn)行。實(shí)際上在ROM空間的零地址上是一個(gè)跳轉(zhuǎn)指令,加電之后的程序首先運(yùn)行這個(gè)跳轉(zhuǎn)指令,將控制轉(zhuǎn)向程序的真正的代碼處,這之后程序才真正開(kāi)始執(zhí)行。TinyOS的所有組件都需要一個(gè)通用的主要組件即Main組件,在程序的配置文件中將該組件進(jìn)行綁定。Main組件提供了一個(gè)初始化和運(yùn)行TinyOS組件的接口StdControl,但是真正實(shí)現(xiàn)這個(gè)接口的組件應(yīng)當(dāng)是應(yīng)用程序組件。下面看看Main組件究竟完成哪些功能。⑵TinyOS的啟動(dòng)順序50Main組件本身的實(shí)現(xiàn)是另外一個(gè)組件RealMain,它才是真正的Main,我們先不關(guān)心其它的代碼,看看RealMain做了什么。intmain()attribute((C,spontaneous)){callhardwareInit();callPot.init(10);TOSHschedinit();callStdControl.init();callStdControl.start();callInterrupt.enable();while(1){TOSHruntask();}}Main組件本身的實(shí)現(xiàn)是另外一個(gè)組件RealMain,它才是51從代碼上我們看到RealMain完成了硬件初始化、電位器的初始化、調(diào)度器的初始化,并且調(diào)用了接口StdControl中的函數(shù),這些函數(shù)完成了應(yīng)用程序組件的初始化任務(wù),此外還要打開(kāi)中斷。從這里我們也就明白了程序執(zhí)行后會(huì)先進(jìn)行硬件的初始化,然后初始化組件。至于組件的初始化如何完成則取決于用戶編寫(xiě)的組件初始化函數(shù),因?yàn)镸ain組件使用的StdControl接口需要在用戶編寫(xiě)的組件里綁定到其初始化函數(shù)中。最后RealMain組件開(kāi)始運(yùn)行隊(duì)列中的任務(wù)。TinyOS的調(diào)度隊(duì)列是個(gè)先進(jìn)先出的循環(huán)隊(duì)列,整個(gè)隊(duì)列中至少有一個(gè)空閑位置,應(yīng)用程序可以調(diào)用PostTask將一個(gè)新的任務(wù)加到隊(duì)列中。當(dāng)沒(méi)有中斷發(fā)生時(shí),調(diào)度器會(huì)從隊(duì)列中取出一個(gè)任務(wù)執(zhí)行,任務(wù)執(zhí)行過(guò)程中可以被打斷。如果隊(duì)列中沒(méi)有了任務(wù),處理器會(huì)進(jìn)入睡眠狀態(tài),等待被其它事件激活。從代碼上我們看到RealMain完成了硬件初始化、電位器的初529.4.2TinyOS的調(diào)度機(jī)制TinyOS調(diào)度是任務(wù)和事件的二級(jí)調(diào)度。任務(wù)是單線程運(yùn)行至完畢,不可相互搶占,但事件可搶占正在運(yùn)行的任務(wù)或低優(yōu)先級(jí)事件。任務(wù)用于實(shí)時(shí)要求不高的應(yīng)用中,所有任務(wù)只分配單個(gè)任務(wù)棧,默認(rèn)是簡(jiǎn)單的FIFO調(diào)度。若任務(wù)隊(duì)列為空,CPU進(jìn)入休眠狀態(tài)以降低功耗。其中任務(wù)數(shù)默認(rèn)是8個(gè),最大任務(wù)數(shù)是255。還采用了分段操作來(lái)減少任務(wù)的運(yùn)行時(shí)間,即分為程序啟動(dòng)硬件操作后迅速返回和硬件完成操作后通知程序兩個(gè)階段。事件用于實(shí)時(shí)性有要求的應(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?;乇菊履夸?.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的通信模型基于主動(dòng)消息(ActiveMessage),是一種高性能并行通信方式。在每次發(fā)送消息后,接收方需返回一個(gè)同步的確認(rèn)消息。此確認(rèn)消息是在主動(dòng)消息層的最底層生成,其內(nèi)容是一個(gè)特殊立即序列,發(fā)送方可迅速確定是否需重發(fā)消息。在中,消息結(jié)構(gòu)是TOS_Msg,包含消息地址、消息類型、消息所屬群號(hào)及消息處理函數(shù)ID等信息。在中,消息結(jié)構(gòu)是message_t,相對(duì)TOS_Msg代表明確的主動(dòng)消息數(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都是不透明的,不能直接訪問(wèn)。要訪問(wèn)message_t必須通過(guò)Packet、AMPacket和其他的一些接口。每個(gè)鏈路層定義了其headerfootermetadata,這些結(jié)構(gòu)必須是外部結(jié)構(gòu)體(nx_struct),其所有域必須是外部類型(nx_*)。因?yàn)橥獠款愋涂杀WC平臺(tái)間兼容,可使結(jié)構(gòu)體以字節(jié)對(duì)齊,從而避免數(shù)據(jù)包緩沖對(duì)齊和域偏移的問(wèn)題。當(dāng)數(shù)據(jù)轉(zhuǎn)發(fā)到無(wú)線傳感器節(jié)點(diǎn)時(shí),先存儲(chǔ)在緩存中,然后由主動(dòng)消息分發(fā)層交給上層應(yīng)用組件對(duì)應(yīng)的消息處理函數(shù)完成消息的解包操作。計(jì)算處理或發(fā)送相應(yīng)消息等工作TinyOS要求每個(gè)應(yīng)用程序在消息被釋放后,能返回一塊未用的消息緩存,以接收下個(gè)未到的消息。通訊的實(shí)現(xiàn)也是通過(guò)各層組件通訊實(shí)現(xiàn)的,其結(jié)構(gòu)如圖9-12所示。圖9-12TinyOS的通信需要注意的是header、footer、metadata都是56大致看來(lái),在TinyOS的通訊經(jīng)歷的組件流程如圖9-13所示圖9-13TinyOS通訊組件流程圖大致看來(lái),在TinyOS的通訊經(jīng)歷的組件流程如圖9-13所示57

應(yīng)用程序直接使用的組件是GenericComm,數(shù)據(jù)將依次經(jīng)過(guò)AMStandard、RadioCRCPacket和SecDedRadioByteSignal等組件的處理與編碼之后通過(guò)硬件發(fā)送出去。接受的過(guò)程恰好與之相反。應(yīng)用程序組件要發(fā)送數(shù)據(jù)需要引用系統(tǒng)組件GenericComm。GenericComm組件是TinyOS的最基本的網(wǎng)絡(luò)通訊棧,它是一個(gè)配置(configuration)文件,可以在中找到它的綁定實(shí)現(xiàn)。該組件提供的接口中有兩個(gè)最重要的接口即SendMsg和ReceiveMsg,分別供用戶調(diào)用來(lái)發(fā)送和接受消息,并且使用了很多底層的接口來(lái)實(shí)現(xiàn)通訊。從這個(gè)文件中我們可以看到真正實(shí)現(xiàn)這些接口的組件由AMStandard來(lái)完成ActiveMessage的發(fā)送和接收、UARTNoCRCPacket來(lái)實(shí)現(xiàn)了通過(guò)串口進(jìn)行通訊、RadioCRCPacket來(lái)實(shí)現(xiàn)了通過(guò)無(wú)線進(jìn)行通訊等等。接口SendMsg和ReceiveMsg都是參數(shù)化接口,參數(shù)id就是前面說(shuō)的handlerid。接口SendMsg中包含commandssend和eventssenddone。應(yīng)用程序直接使用的組件是GenericComm,數(shù)58通過(guò)語(yǔ)句SendMsg=AMStandard.SendMsg;ReceiveMsg=AMStandard.ReceiveMsg;來(lái)說(shuō)明它們的真正實(shí)現(xiàn)是由組件AMStandard中相應(yīng)接口來(lái)完成的。

消息的發(fā)送涉及組件、接口和事件三方面,當(dāng)上層組件有消息發(fā)送時(shí)通過(guò)接口調(diào)用下層組件來(lái)實(shí)現(xiàn)。下層組件完成發(fā)送后也通過(guò)接口向上層組件回送消息。消息的接收主要是以事件的逐層向上傳遞來(lái)進(jìn)行的。當(dāng)硬件接到一個(gè)消息時(shí)它會(huì)發(fā)生中斷,在中斷的處理程序中觸發(fā)事件,在該事件的處理函數(shù)中又觸發(fā)了事件,這個(gè)事件的處理函數(shù)接收Radio的采樣數(shù)據(jù)并試圖找到開(kāi)始標(biāo)志,一旦找到了消息的開(kāi)始標(biāo)志,它就會(huì)Post一個(gè)任務(wù)將接收到的編碼數(shù)據(jù)進(jìn)行解碼。數(shù)據(jù)解碼之后該事件發(fā)信號(hào)給事件,表示可以接收下一字節(jié)數(shù)據(jù)。事件處理字階級(jí)組件傳遞的解碼數(shù)據(jù),主要是通過(guò)Post一個(gè)任務(wù)進(jìn)行CRC檢查。這個(gè)任務(wù)會(huì)發(fā)信號(hào)給事件,只是簡(jiǎn)單地將其接到的消息返回。通過(guò)語(yǔ)句599.4.4TinyOS的能量管理使用了三種機(jī)制來(lái)管理和控制能量狀態(tài)。①M(fèi)CU能量控制該方式包含dirty標(biāo)識(shí)位、低功耗狀態(tài)計(jì)算函數(shù)McuSleepC和能量狀態(tài)覆蓋函數(shù)PowerOverride。dirty標(biāo)識(shí)位通知TinyOS需計(jì)算一個(gè)新的低功耗模式只要硬件表示層組件對(duì)硬件配置進(jìn)行了改動(dòng),MCU的低功耗模式也會(huì)改變,就會(huì)調(diào)用McuPowerState.update()。接著調(diào)用McuSleepC計(jì)算出最佳低功耗模式,最后通過(guò)調(diào)用PowerOverride.lowestState()以更新MCU功耗模式。②能量管理接口每個(gè)設(shè)備都有個(gè)能量管理接口即StdControl或SplitControl或AsyncStd-Control。調(diào)用stop命令停止該設(shè)備,進(jìn)入低功耗模式。③定時(shí)器TinyOS的定時(shí)器服務(wù)可以工作在大多數(shù)處理器的極低功耗的省電模式下。TinyOS功耗低、占用空間少,滿足無(wú)線傳感器網(wǎng)絡(luò)資源極端有限的條件。但TinyOS并不能滿足實(shí)時(shí)性要求相對(duì)高的無(wú)線傳感器網(wǎng)絡(luò)。TinyOS在某些場(chǎng)合因?qū)崟r(shí)性比較差,會(huì)出現(xiàn)任務(wù)過(guò)載、任務(wù)阻塞、任務(wù)隊(duì)列溢出、通信吞吐量下降等一系列問(wèn)題,從而導(dǎo)致系統(tǒng)崩潰,在這種情況下,需進(jìn)一步改進(jìn)TinyOS實(shí)時(shí)性、并發(fā)性及移植性,并通過(guò)完善其整體架構(gòu)來(lái)提高其綜合性能。回本章目錄9.4.4TinyOS的能量管理使用了三種機(jī)制來(lái)管理和控制60c-otest就可以編譯該程序。在國(guó)內(nèi)有一家代理,開(kāi)發(fā)平臺(tái)的做工非常不錯(cuò),產(chǎn)品覆蓋面也比較廣,主要的缺點(diǎn)就是產(chǎn)品太貴,而且中文的資料較少。2TinyOS的調(diào)度機(jī)制也可使用UCoMS監(jiān)控、維護(hù)淘汰的平臺(tái)。表9-3環(huán)境變量的配置⑴創(chuàng)建一個(gè)文件夾,如simple,來(lái)保存這三文件。但是,這種做法并不適合大規(guī)模計(jì)算。圖9-9使用nesC編程的流程init(10);②運(yùn)行命令:makeprovidesinterfaceScheduler;init(10);在大多數(shù)情況下,因?yàn)橥酱a是非搶占的,這種編程方式行之有效。⑵為我們的程序創(chuàng)建一個(gè)配置文件,內(nèi)容如下:下面是一個(gè)組件的示例,該示例要保存到文件中。2TinyOS的特點(diǎn)從這個(gè)文件中我們可以看到真正實(shí)現(xiàn)這些接口的組件由AMStandard來(lái)完成ActiveMessage的發(fā)送和接收、UARTNoCRCPacket來(lái)實(shí)現(xiàn)了通過(guò)串口進(jìn)行通訊、RadioCRCPacket來(lái)實(shí)現(xiàn)了通過(guò)無(wú)線進(jìn)行通訊等等。3一個(gè)簡(jiǎn)單的nesC編程示例從這里我們也就明白了程序執(zhí)行后會(huì)先進(jìn)行硬件的初始化,然后初始化組件。其中任務(wù)數(shù)默認(rèn)是8個(gè),最大任務(wù)數(shù)是255。思考與習(xí)題1.簡(jiǎn)述TinyOS的特點(diǎn)。2.簡(jiǎn)述nesC程序的特點(diǎn)。3.安裝TinyOS,并編寫(xiě)簡(jiǎn)單地程序。4.對(duì)照TinyOS的源程序,理解TinyOS的內(nèi)部機(jī)制。

c-otest就可以編譯該程序。思考與習(xí)題1.簡(jiǎn)述Ti61

第九章物聯(lián)網(wǎng)中的常用嵌入式系統(tǒng)

第九章物聯(lián)網(wǎng)中的常用嵌入式系統(tǒng)62本章主要內(nèi)容9.1TinyOS簡(jiǎn)介9.2安裝TinyOS9.3nesC簡(jiǎn)介9.4TinyOS內(nèi)部機(jī)制簡(jiǎn)介思考與習(xí)題本章主要內(nèi)容639.1TinyOS簡(jiǎn)介9.1.1TinyOS概述9.1.2TinyOS的特點(diǎn)9.1.3TinyOS開(kāi)發(fā)平臺(tái)9.1.4TinyOS開(kāi)發(fā)案例9.1.5TinyOS的基本概念回本章目錄9.1TinyOS簡(jiǎn)介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的組件模型;②綜合硬件組件模擬高級(jí)的硬件行為,如感知組件、通信組件等;③高層次的軟件組件實(shí)現(xiàn)控制、路由以及數(shù)據(jù)傳輸?shù)葢?yīng)用層的功能。圖9-1TinyOS的組件結(jié)構(gòu)回本章目錄9.1.1TinyOS概述圖9-1TinyOS的組件結(jié)65每個(gè)TinyOS程序應(yīng)當(dāng)具有至少一個(gè)應(yīng)用組件,即用戶組件。該應(yīng)用組件通過(guò)接口調(diào)用下層組件提供的服務(wù),實(shí)現(xiàn)針對(duì)特定應(yīng)用的具體邏輯功能,如數(shù)據(jù)采集、數(shù)據(jù)處理、數(shù)據(jù)收發(fā)等。一個(gè)完整的應(yīng)用系統(tǒng)由一個(gè)內(nèi)核調(diào)度器(簡(jiǎn)稱調(diào)度器)和許多功能獨(dú)立且相互聯(lián)系的組件構(gòu)成,可以把TinyOS系統(tǒng)和在其上運(yùn)行的應(yīng)用程序看成是一個(gè)大的“執(zhí)行程序”?,F(xiàn)有的TinyOS系統(tǒng)提供了大多數(shù)傳感網(wǎng)硬件平臺(tái)和應(yīng)用領(lǐng)域里都可用到的組件,例如定時(shí)器組件、傳感器組件、消息收發(fā)組件、電源管理組件等,從而把用戶和底層硬件隔離開(kāi)來(lái)。在此基礎(chǔ)上,用戶只需開(kāi)發(fā)針對(duì)特殊硬件和特殊應(yīng)用需求的少量組件,大大提高了應(yīng)用的開(kāi)發(fā)效率。TinyOS設(shè)計(jì)之初的目的是制作一個(gè)專屬嵌入式無(wú)線傳感器網(wǎng)絡(luò)的操作系統(tǒng)。但事實(shí)上,由于良好的可擴(kuò)展性和足夠小的代碼尺寸,TinyOS在物聯(lián)網(wǎng)的應(yīng)用領(lǐng)域中也占有非常重要的地位。每個(gè)TinyOS程序應(yīng)當(dāng)具有至少一個(gè)應(yīng)用組件,即用戶組件。該66由于無(wú)線傳感器網(wǎng)絡(luò)的特殊性,研究人員在設(shè)計(jì)TinyOS系統(tǒng)時(shí)就提出以下幾個(gè)原則:①能在有限的資源上運(yùn)行:要求執(zhí)行模式允許在單一的協(xié)議棧上運(yùn)行;②允許高度的并發(fā)性:要求執(zhí)行模式能對(duì)事件作出快速的直接響應(yīng);③適應(yīng)硬件升級(jí):要求組件和執(zhí)行模式能夠應(yīng)對(duì)硬件/軟件的替換;④支持多樣化的應(yīng)用程序:要求能夠根據(jù)實(shí)際需要,裁減操作系統(tǒng)的服務(wù);⑤魯棒性強(qiáng):要求通過(guò)組件間有限的交互渠道,就能應(yīng)對(duì)各種復(fù)雜情況;⑥支持一系列平臺(tái):要求操作系統(tǒng)的服務(wù)具有可移植性。由于無(wú)線傳感器網(wǎng)絡(luò)的特殊性,研究人員在設(shè)計(jì)TinyOS系統(tǒng)時(shí)67TinyOS操作系統(tǒng)采用的輕量級(jí)線程技術(shù)、兩層調(diào)度方式、事件驅(qū)動(dòng)模式、主動(dòng)消息通信技術(shù)及組件化編程等有效地提高了傳感器節(jié)點(diǎn)cpu的使用率,有助于省電操作并簡(jiǎn)化了應(yīng)用的開(kāi)發(fā)。TinyOS系統(tǒng)、庫(kù)和基于TinyOS的應(yīng)用基本上都是用nesC語(yǔ)言開(kāi)發(fā)的,在TinyOS中采用nesC語(yǔ)言進(jìn)行應(yīng)用程序開(kāi)發(fā)。在TinyOS中,應(yīng)用程序開(kāi)發(fā)人員可以通過(guò)nesC語(yǔ)言表達(dá)組件以及組件之間的事件/命令接口。組件分為配置文件和模塊,程序的流程是通過(guò)配置文件中接口的連接實(shí)現(xiàn)而構(gòu)建起來(lái)的,而具體實(shí)現(xiàn)的邏輯功能是通過(guò)模塊完成的。每個(gè)模塊由一組命令和事件組成,這些命令和事件成為該模塊的接口。一般來(lái)說(shuō),上層組件對(duì)下層組件發(fā)命令,下層組件發(fā)信號(hào)通知事件的發(fā)生,最底層的組件直接和硬件交互,從而自上到下形成一種樹(shù)狀結(jié)構(gòu)。TinyOS操作系統(tǒng)采用的輕量級(jí)線程技術(shù)、兩層調(diào)度方式、事件68TinyOS的并行處理能力通過(guò)任務(wù)(task)和中斷處理事件(interrupthanderevent)來(lái)體現(xiàn)。任務(wù)會(huì)加入一個(gè)FIFO隊(duì)列中,在執(zhí)行過(guò)程中,任務(wù)間沒(méi)有競(jìng)爭(zhēng);但中斷處理程序可以打斷任務(wù)執(zhí)行。TinyOS采用二級(jí)調(diào)度機(jī)制來(lái)滿足無(wú)線傳感網(wǎng)絡(luò)運(yùn)行特點(diǎn),整個(gè)程序調(diào)度過(guò)程如圖9-2所示。組件中完成任務(wù)提交,由操作系統(tǒng)完成調(diào)度。一個(gè)節(jié)點(diǎn)上應(yīng)用程序的框圖如圖9-3所示,操作系統(tǒng)只是在后臺(tái)提供隊(duì)列服務(wù)。圖9-2TinyOS程序調(diào)度

圖9-3一個(gè)節(jié)點(diǎn)上應(yīng)用程序的框圖TinyOS的并行處理能力通過(guò)任務(wù)(task)和中斷處理事件69與uCOS-II相比,Tiny-OS基于事件驅(qū)動(dòng)的機(jī)制就決定了其實(shí)時(shí)性不高,編程復(fù)雜,但其內(nèi)核占用空間極小,而uCOS-II是基于線程模式的,編程簡(jiǎn)單,實(shí)時(shí)性高,但相對(duì)帶來(lái)的開(kāi)銷也大。表9-2比較了Tiny-OS與uCOS-II。操作系統(tǒng)TinyOSuCOS-II運(yùn)行模式事件線程搶占式內(nèi)核否是時(shí)間可確定性否是支持動(dòng)態(tài)編程否否(最小)內(nèi)核RAM:47B,ROM:473BRAM:300B,ROM:2kB低功耗是否表9-2Tiny-OS與uCOS-II的比較與uCOS-II相比,Tiny-OS基于事件驅(qū)動(dòng)的機(jī)制就決定709.1.2TinyOS的特點(diǎn)回本章目錄9.1.2TinyOS的特點(diǎn)回本章目錄71commandvoidtaskLoop();interfaceBoot{/opt/TinyOS-2.形象的稱為命令,即為接口提供的可供調(diào)用的命令。系統(tǒng)本身提供了一系列的組件供用戶調(diào)用,其中包括主組件、應(yīng)用組件、執(zhí)行組件、傳感組件、通信組件和硬件抽象組件,如下圖9-1所示。moduleM2{一個(gè)組件使用了一個(gè)接口,它可以調(diào)用這個(gè)接口的命令,但必須實(shí)現(xiàn)其事件。本章主要內(nèi)容usesinterfaceA1;③一個(gè)module可以同時(shí)提供一組相同的接口,又稱參數(shù)化接口,表明該Module可提供多份同類資源,能夠同時(shí)給多個(gè)組件分享。配件(configuration)是一個(gè)完整的配置列表,配件可以像模塊一樣使用外部的接口并且對(duì)外提供接口。eventvoidA1.nx_uint8_tdata[TOSH_DATA_LENGTH];//有效載荷區(qū)事件處理字階級(jí)組件傳遞的解碼數(shù)據(jù),主要是通過(guò)Post一個(gè)任務(wù)進(jìn)行CRC檢查。配件(configuration)是一個(gè)完整的配置列表,配件可以像模塊一樣使用外部的接口并且對(duì)外提供接口。表9-3環(huán)境變量的配置連接的箭頭是也可以對(duì)稱反過(guò)來(lái),如“BlinkC.nesC的組件模型如圖9-10。一個(gè)nesC語(yǔ)言編寫(xiě)的程序由一個(gè)或多個(gè)組件(component)構(gòu)成或連接而成。④通過(guò)任務(wù)和事件來(lái)管理并發(fā)進(jìn)程TinyOS的應(yīng)用程序都是基于事件驅(qū)動(dòng)模式的,采用事件觸發(fā)去喚醒傳感器工作。事件相當(dāng)于不同組件之間傳遞狀態(tài)信息的信號(hào)。當(dāng)事件對(duì)應(yīng)的硬件中斷發(fā)生時(shí),系統(tǒng)能夠快速地調(diào)用相關(guān)的事件處理程序。任務(wù):一般用在對(duì)于時(shí)間要求不是很高的應(yīng)用中,且任務(wù)之間是平等的,即在執(zhí)行時(shí)是按順序先后來(lái)得,而不能互相占先執(zhí)行,一般為了減少任務(wù)的運(yùn)行時(shí)間,要求每一個(gè)任務(wù)都很短小,能夠使系統(tǒng)的負(fù)擔(dān)較輕;支持網(wǎng)絡(luò)協(xié)議的替換。事件:一般用在對(duì)于時(shí)間的要求很嚴(yán)格的應(yīng)用中,而且它可以占先優(yōu)于任務(wù)和其他事件執(zhí)行,它可以被一個(gè)操作的完成或是來(lái)自外部環(huán)境的事件觸發(fā),在TinyOS中一般由硬件中斷處理來(lái)驅(qū)動(dòng)事件。⑤支持網(wǎng)絡(luò)協(xié)議組件的替換除了默認(rèn)的協(xié)議之外,還提供其他協(xié)議供用戶替換,并且支持客戶自定義協(xié)議,這對(duì)于通信協(xié)議分析,非常適用于通信協(xié)議的研究工作。commandvoidtaskLoop();④通過(guò)任務(wù)72⑥代碼短小精悍TinyOS的程序采用的是模塊化設(shè)計(jì),所以它的程序核心往往都很小,一般來(lái)說(shuō)核心代碼和數(shù)據(jù)大概在400Bytes左右;能夠突破傳感器存儲(chǔ)資源少的限制,這能夠讓TinyOS很有效的運(yùn)行在無(wú)線傳感器網(wǎng)絡(luò)上并去執(zhí)行相應(yīng)的管理工作等。⑥代碼短小精悍739.1.3TinyOS開(kāi)發(fā)平臺(tái)國(guó)內(nèi)目前可以買(mǎi)到的TinyOS開(kāi)發(fā)平臺(tái)主要有兩種,一種是Crossbow公司W(wǎng)SN開(kāi)發(fā)套件,一種億道電子的XSBase-WSN開(kāi)發(fā)套件;Crossbow本身就是TinyOS聯(lián)盟的成員之一,其所有產(chǎn)品都在TinyOS源碼的Platform目錄下可以找到,可以算得上是TinyOS技術(shù)商用化的代表;在國(guó)內(nèi)有一家代理,開(kāi)發(fā)平臺(tái)的做工非常不錯(cuò),產(chǎn)品覆蓋面也比較廣,主要的缺點(diǎn)就是產(chǎn)品太貴,而且中文的資料較少。億道電子的WSN套件使用的是較先進(jìn)CC2430芯片,同時(shí)支持TinyOS和Z-stack兩種開(kāi)發(fā)方式,并且包含大量的中文教材和使用手冊(cè),硬件移植的也非常穩(wěn)定,所有的TinyOS測(cè)試用例都能正常運(yùn)行,而且還帶了大量的中文教材、使用手冊(cè)和實(shí)驗(yàn)用例,其中值得一提的是,該產(chǎn)品搭建了一整套的解決方案框架,實(shí)現(xiàn)了異構(gòu)網(wǎng)絡(luò)之間的互聯(lián)互通,可以在任何一地通過(guò)GPRS手機(jī)上網(wǎng),訪問(wèn)節(jié)點(diǎn)上的物理數(shù)據(jù),開(kāi)發(fā)者可以迅速的在這個(gè)框架下做二次開(kāi)發(fā)。回本章目錄9.1.3TinyOS開(kāi)發(fā)平臺(tái)國(guó)內(nèi)目前可以買(mǎi)到的TinyO749.1.4TinyOS開(kāi)發(fā)案例目前有多個(gè)采用TinyOS的研究項(xiàng)目,如UCLA(加州大學(xué)洛杉磯分校)的ShahinFarshchi在進(jìn)行一項(xiàng)以TinyOS為基礎(chǔ)的無(wú)線神經(jīng)界面研究

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論