中國(guó)信息化培訓(xùn)中心

7x24小時(shí)咨詢熱線

400-660-3310

當(dāng)前位置 : 好學(xué)校 中國(guó)信息化培訓(xùn)中心 學(xué)習(xí)資訊 資訊詳情

物聯(lián)網(wǎng)操作系統(tǒng)

2013-09-10

無(wú)線傳感器網(wǎng)絡(luò)中的操作系統(tǒng)是一個(gè)位于節(jié)點(diǎn)硬件和應(yīng)用程序之間的軟件層,它給應(yīng)用程序開發(fā)者提供了基本的編程理念。操作系統(tǒng)的主要作用是確保應(yīng)用程序能與硬件資源進(jìn)行交互、執(zhí)行和優(yōu)化任務(wù),在多種應(yīng)用程序和服務(wù)程序之間做選擇,并試圖獲取資源。

其他功能還包括:

內(nèi)存管理。

電源管理。

文檔管理。

建立關(guān)系網(wǎng)絡(luò)。

一套編程環(huán)境和工具——命令、命令解釋器、命令編輯器、編譯器、調(diào)試器等,確保用戶能開發(fā)、調(diào)試和執(zhí)行用戶的程序。

??進(jìn)入操作系統(tǒng)訪問(wèn)敏感資源的合法入口,如輸入組件。

傳統(tǒng)上,操作系統(tǒng)可分為單任務(wù)、多任務(wù)、單用戶和多用戶操作系統(tǒng)。一個(gè)單任務(wù)操作系統(tǒng)一次只能執(zhí)行一個(gè)任務(wù),然而一個(gè)多任務(wù)操作系統(tǒng)能同時(shí)執(zhí)行多個(gè)任務(wù)。多任務(wù)操作系統(tǒng)需要大量的內(nèi)存來(lái)管理多個(gè)任務(wù)的狀態(tài),并使具有不同復(fù)雜性的任務(wù)并行執(zhí)行。例如,在一個(gè)無(wú)線傳感器節(jié)點(diǎn)中,處理器子系統(tǒng)與通信子系統(tǒng)相互作用的同時(shí)也可以與傳感器子系統(tǒng)相互作用。一個(gè)多任務(wù)操作系統(tǒng)是這種類型環(huán)境的佳選擇。然而,由于有限的資源,并行處理對(duì)資源的開銷可能無(wú)法承擔(dān)。在單任務(wù)操作系統(tǒng)中一次只能執(zhí)行一個(gè)任務(wù),因此目標(biāo)任務(wù)執(zhí)行持續(xù)時(shí)間短。在單用戶操作系統(tǒng)中,在同一時(shí)間只有一個(gè)用戶能使用系統(tǒng)里的資源,然而一個(gè)多用戶操作系統(tǒng)允許多個(gè)用戶同時(shí)共享系統(tǒng)里的資源。

一個(gè)特定操作系統(tǒng)的選擇取決于很多因素,在接下來(lái)的內(nèi)容中,將會(huì)討論典型的功能性和非功能性方面。

1.功能性方面

1)數(shù)據(jù)類型

在無(wú)線傳感器網(wǎng)絡(luò)中,不同子系統(tǒng)之間的通信是至關(guān)重要的。由于各種原因這些子系

統(tǒng)相互通信,例如交換數(shù)據(jù)、托管功能和信號(hào)。相互作用通過(guò)精心制定的協(xié)議和數(shù)據(jù)類型

而產(chǎn)生,并且它們都是由操作系統(tǒng)來(lái)支持的。復(fù)雜的數(shù)據(jù)結(jié)構(gòu)具有較強(qiáng)的表達(dá)能力但消耗

資源,然而簡(jiǎn)單的數(shù)據(jù)結(jié)構(gòu)能節(jié)約資源但表達(dá)能力有限。在無(wú)線傳感器網(wǎng)絡(luò)中幾乎所有現(xiàn)

有的操作系統(tǒng)或運(yùn)行環(huán)境都支持C語(yǔ)言編程和一些復(fù)雜的數(shù)據(jù)類型,如結(jié)構(gòu)體和枚舉的原

始數(shù)據(jù)類型。

2)調(diào)度

任務(wù)調(diào)度是操作系統(tǒng)中的一個(gè)基本功能,任務(wù)如何有效地組織、確定優(yōu)先級(jí)并執(zhí)行,這些決定了操作系統(tǒng)的效率。

從廣義上講,有兩種調(diào)度機(jī)制:基于排隊(duì)和循環(huán)調(diào)度。在排隊(duì)調(diào)度中,來(lái)自各予系統(tǒng)的任務(wù)是暫時(shí)存儲(chǔ)在隊(duì)列中,并根據(jù)預(yù)定義的規(guī)則串行執(zhí)行。有些操作系統(tǒng)對(duì)任務(wù)指定優(yōu)先級(jí),使它們可以優(yōu)先被考慮。

基于隊(duì)列調(diào)度,可進(jìn)一步分為先出和排序隊(duì)列。在一個(gè)先入先出的系統(tǒng)中任務(wù)是按照它們抵達(dá)的時(shí)間來(lái)執(zhí)行的:先到達(dá)的任務(wù)將會(huì)先被執(zhí)行,確保處理器是閑置的。一個(gè)非搶占的操作系統(tǒng)在另一個(gè)任務(wù)沒有完成前是不能執(zhí)行其他任務(wù)的,然而在優(yōu)先級(jí)的操作系統(tǒng)中,一個(gè)更高優(yōu)先級(jí)的任務(wù)可能中斷低優(yōu)先級(jí)任務(wù)。在一個(gè)有序的隊(duì)列計(jì)劃中,隊(duì)列中的任務(wù)是根據(jù)預(yù)定的準(zhǔn)則進(jìn)行排序。一種方法是根據(jù)它們的預(yù)估時(shí)間來(lái)排序任務(wù),這種方法能防止持續(xù)時(shí)間長(zhǎng)的任務(wù)中斷持續(xù)時(shí)間短的任務(wù),該方法也被稱為短工作優(yōu)先規(guī)則( SJF)。在SJF計(jì)劃中,排序會(huì)帶來(lái)系統(tǒng)開銷,因?yàn)槊總€(gè)隊(duì)列中的任務(wù)必須進(jìn)行評(píng)估,估計(jì)執(zhí)行期限,并據(jù)此進(jìn)行排序任務(wù)。

先入先出的系統(tǒng)( FIFO)是簡(jiǎn)單和經(jīng)濟(jì)的,因?yàn)樗鼤?huì)帶來(lái)低的系統(tǒng)開銷。然而,先入先出的系統(tǒng)可能對(duì)待任務(wù)不公平,因?yàn)槌掷m(xù)時(shí)間長(zhǎng)的任務(wù)可能會(huì)在很長(zhǎng)一段時(shí)間內(nèi)阻礙持續(xù)時(shí)間短的任務(wù)。

循環(huán)調(diào)度是一種分時(shí)調(diào)度技術(shù),它可以并發(fā)處理多個(gè)任務(wù)。調(diào)度程序通過(guò)把時(shí)間分解成時(shí)間片來(lái)定義時(shí)間框架,并以多路復(fù)用方式把任務(wù)分配給各個(gè)時(shí)間片。這樣所有的任務(wù)都朝著完成的方向運(yùn)行。

不管任務(wù)如何執(zhí)行,一個(gè)調(diào)度器可以是一個(gè)非搶占式或搶占式調(diào)度。嚴(yán)格意義上的非搶占式調(diào)度,任務(wù)從執(zhí)行一直到結(jié)束不會(huì)被另一個(gè)任務(wù)中斷。相反,嚴(yán)格意義上的搶占式調(diào)度決定任務(wù)之間的時(shí)間優(yōu)先順序,允許更高優(yōu)先級(jí)的任務(wù)中斷低優(yōu)先級(jí)的任務(wù)。也有所謂的“禮貌先發(fā)制人( politely-preemptive)”的調(diào)度,即使任務(wù)可以被中斷,但如果它是在一個(gè)關(guān)鍵部分,調(diào)度程序也不會(huì)中斷這個(gè)操作。

3)棧

棧是一種數(shù)據(jù)結(jié)構(gòu),在內(nèi)存中它通過(guò)將一個(gè)數(shù)據(jù)輸入到另一個(gè)數(shù)據(jù)來(lái)暫時(shí)存儲(chǔ)數(shù)據(jù)結(jié)構(gòu),訪問(wèn)對(duì)象遵循后進(jìn)先出的原則。當(dāng)它開始執(zhí)行子程序前,處理器內(nèi)核使用棧來(lái)存儲(chǔ)系統(tǒng)狀態(tài)信息,運(yùn)用這個(gè)方法可以記住當(dāng)子程序完成后程序返回的地址。通過(guò)存儲(chǔ)當(dāng)前子程序棧頂?shù)臓顟B(tài),子程序可以再一次調(diào)用其他子程序。當(dāng)該子程序完成后,處理器彈出棧頂?shù)刂?,跳回到調(diào)用入口。

在一個(gè)多線程的操作系統(tǒng)中,每個(gè)線程都需要它自己的棧管理狀態(tài)信息,這就是為什么在無(wú)線傳感器網(wǎng)絡(luò)中多線程操作系統(tǒng)如此昂貴的一個(gè)原因。

4)系統(tǒng)調(diào)用

操作系統(tǒng)提供了一些確保關(guān)注分離的基本功能,即需要訪問(wèn)硬件資源和額外的底層服務(wù)的訪問(wèn)機(jī)制的實(shí)施細(xì)節(jié)。用戶調(diào)用這些操作,他們希望在訪問(wèn)硬件資源如傳感器、看門狗定時(shí)器或者進(jìn)行無(wú)線收發(fā)時(shí),不需要考慮硬件是如何進(jìn)行訪問(wèn)的。

5)中斷處理

一個(gè)中斷是由硬件設(shè)備產(chǎn)生的異步信號(hào),使處理器中斷執(zhí)行當(dāng)前的指令,并調(diào)用相應(yīng)的中斷處理程序。處理器把進(jìn)程被中斷的狀態(tài)存儲(chǔ)在堆棧中,并將執(zhí)行中斷處理子程序。例如,當(dāng)一個(gè)通信子系統(tǒng)收到一個(gè)需要立即處理的數(shù)據(jù)包時(shí)可能會(huì)產(chǎn)生一個(gè)中斷信號(hào)。該處理器子系統(tǒng)必須暫停當(dāng)前通信進(jìn)程的執(zhí)行,在操作系統(tǒng)中調(diào)用適當(dāng)?shù)哪K來(lái)處理數(shù)據(jù)包,處理完數(shù)據(jù)包后再返回執(zhí)行通信進(jìn)程。

另外,硬件設(shè)備在操作系統(tǒng)中可以定義多個(gè)中斷標(biāo)志。在某些情況下,操作系統(tǒng)本身可以產(chǎn)生周期性中斷,用處理器來(lái)監(jiān)控硬件資源的狀態(tài),發(fā)現(xiàn)硬件中斷標(biāo)志,并處理相應(yīng)的中斷事件。

任務(wù)可以有不同的優(yōu)先級(jí),同樣,中斷信號(hào)也可以有不同的優(yōu)先級(jí),一個(gè)高優(yōu)先級(jí)的中斷可以中斷低優(yōu)先級(jí)的中斷。在這樣的系統(tǒng)中,程序可以選擇設(shè)置中斷屏蔽來(lái)避免被中斷。中斷屏蔽可以防止程序被一些不相關(guān)的低級(jí)別中斷所中斷。但屏蔽中斷可能存在破壞數(shù)據(jù)的危險(xiǎn)。而一些操作系統(tǒng)在關(guān)鍵的操作中必須屏蔽中斷。

6)多線程

一個(gè)線程是一個(gè)處理器或一個(gè)程序在執(zhí)行過(guò)程中所采取的路徑。在一個(gè)不可中斷操作系統(tǒng)的單一任務(wù)中,任務(wù)是單一的,并且只有一個(gè)執(zhí)行線程。在多線程環(huán)境中,一個(gè)任務(wù)可以被分為多個(gè)邏輯塊,可相互獨(dú)立的并發(fā)執(zhí)行。同樣,不同來(lái)源的多個(gè)任務(wù)也可并發(fā)執(zhí)行。如果有必要,線程的相同任務(wù)可以共享一個(gè)共同的數(shù)據(jù)和地址空間來(lái)互相溝通。

一個(gè)多線程的操作系統(tǒng)主要有兩個(gè)優(yōu)勢(shì):

(1)任務(wù)之間互不阻止,這一點(diǎn)對(duì)于處理與任務(wù)有關(guān)的輸入/輸出系統(tǒng)特別重要。

(2)短期任務(wù)可以與長(zhǎng)期任務(wù)一起執(zhí)行。

因?yàn)榫€程具有占有資源的性質(zhì),它們不能被無(wú)休止地創(chuàng)建。創(chuàng)建線程能降低處理器的執(zhí)行速度,可能沒有足夠的資源來(lái)分配大量的線程。因此,一些操作系統(tǒng)只能支持有限數(shù)量的線程,并把它們置入緩沖區(qū)中。緩沖區(qū)中的每一線程都等待分配任務(wù),一旦得到請(qǐng)求,緩沖區(qū)就會(huì)分配一個(gè)可用的線程,直到任務(wù)完成,線程就會(huì)返回到緩沖區(qū),并且等待下一次分配。如果緩沖區(qū)里所有的線程都被使用了,在下一個(gè)線程返回緩沖區(qū)之前,系統(tǒng)將會(huì)在隊(duì)列中等待即將到來(lái)的請(qǐng)求。以這種方式,操作系統(tǒng)能將線程數(shù)量控制在一定規(guī)模。

7)基于線程與基于事件的編程

無(wú)線傳感器網(wǎng)絡(luò),支持并發(fā)任務(wù)。其中涉及輸入/輸出系統(tǒng)的任務(wù)特別重要,應(yīng)選擇基于線程或基于事件的執(zhí)行模式。

根據(jù)分散的堆棧和建立上下文信息的大規(guī)模,選擇基于線程或基于事件的執(zhí)行模式。在一個(gè)單一的程序和單一的地址空間中,基于線程的程序使用多線程控制。這樣,當(dāng)其他任務(wù)在不同的線程中執(zhí)行時(shí),被輸入/輸出設(shè)備阻止的線程可以被掛起。然而,程序員必須小心用鎖(lock)保護(hù)共享數(shù)據(jù)結(jié)構(gòu),并使用條件變量來(lái)協(xié)調(diào)執(zhí)行線程。在處理所有這些問(wèn)題時(shí),操作系統(tǒng)需要同步執(zhí)行程序。一般情況下,多線程環(huán)境編寫的程序代碼是復(fù)雜的、可能產(chǎn)生錯(cuò)誤,并可能導(dǎo)致死鎖和惡性競(jìng)爭(zhēng)。

在基于事件的編程中有事件和事件處理者。在操作系統(tǒng)調(diào)度中,當(dāng)~個(gè)指定的事件發(fā)生時(shí),事件處理程序會(huì)被命名。通常內(nèi)核實(shí)現(xiàn)一個(gè)循環(huán)功能,當(dāng)事件發(fā)生時(shí),會(huì)以輪詢的方式調(diào)用相應(yīng)的事件處理程序。一般情況下一個(gè)事件會(huì)被一次處理完,但如果碰到一個(gè)阻塞操作,它會(huì)寄存一個(gè)新的回調(diào),并向調(diào)度程序返回控制。

8)內(nèi)存分配

內(nèi)存單元是一種寶貴的資源,這是操作系統(tǒng)的關(guān)鍵所在,此外,數(shù)據(jù)和應(yīng)用程序代碼被暫時(shí)存儲(chǔ)在內(nèi)存單元中。內(nèi)存怎樣分配以及分配多長(zhǎng)時(shí)間,決定任務(wù)執(zhí)行的速度。內(nèi)存可被分配到一個(gè)靜態(tài)或動(dòng)態(tài)的程序中,靜態(tài)內(nèi)存分配可以節(jié)省使用內(nèi)存,但它只能用于程序內(nèi)存的使用是預(yù)先知道的。程序啟動(dòng)時(shí)分配靜態(tài)內(nèi)存,作為執(zhí)行操作的一部分,不會(huì)被釋放。因?yàn)槌绦虻膬?nèi)存是在編譯時(shí)分配的,所以內(nèi)存的使用率很高。另一方面,靜態(tài)內(nèi)存分配不允許在運(yùn)行時(shí)進(jìn)行。

當(dāng)程序編譯不知道所需內(nèi)存的大小和被占用時(shí)間時(shí),就采用動(dòng)態(tài)內(nèi)存分配。在使用動(dòng)態(tài)數(shù)據(jù)結(jié)構(gòu)的情況下,編譯時(shí)無(wú)法知道內(nèi)存的大小,這樣的程序通常只是短暫使用內(nèi)存。當(dāng)它們不再需要特定的內(nèi)存區(qū)時(shí),它們會(huì)占用并短暫使用一部分內(nèi)存。因?yàn)閮?nèi)存的資源是有限的,不再使用的內(nèi)存可以被釋放或分配給不同的所有者。動(dòng)態(tài)內(nèi)存分配確保了編程的靈活性,但產(chǎn)生了相當(dāng)大的管理開銷。

把增加節(jié)點(diǎn)的內(nèi)存容量作為一項(xiàng)策略,大多數(shù)體系結(jié)構(gòu)使用EEPROM或閃存來(lái)存儲(chǔ)程序代碼。因此,它可能用來(lái)部署相對(duì)復(fù)雜的應(yīng)用程序和通信協(xié)議。然而,讀寫閃存的過(guò)程是耗能很大的。

2.非功能方面的問(wèn)題

1)關(guān)注點(diǎn)分離

因?yàn)榭捎玫馁Y源極度緊張,被設(shè)計(jì)用來(lái)支持資源受限的設(shè)備以及由這些設(shè)備所建立的網(wǎng)絡(luò)的操作系統(tǒng)不同于通用的操作系統(tǒng)。在通用操作系統(tǒng)中,操作系統(tǒng)和在它上面運(yùn)行的應(yīng)用程序之間有一個(gè)清晰的分離,它們通過(guò)定義良好的接口和系統(tǒng)調(diào)用來(lái)互相交流。操作系統(tǒng)本身有幾個(gè)不同的服務(wù)可以獨(dú)立地進(jìn)行升級(jí)、調(diào)試或刪除。在無(wú)線傳感器網(wǎng)絡(luò)中,這種方式是很難實(shí)現(xiàn)的。

在大多數(shù)情況下,操作系統(tǒng)由一個(gè)輕量級(jí)的模塊編排”( wired)在一起,創(chuàng)造一個(gè)單塊的程序模塊代碼,負(fù)責(zé)傳感、處理和通信任務(wù)?!熬幣拧毙枰诰幾g時(shí)產(chǎn)生一個(gè)單一的系統(tǒng)映像,并可以在單個(gè)節(jié)點(diǎn)上安裝。一些操作系統(tǒng)提供了一個(gè)不可分割的系統(tǒng)內(nèi)核以及一套庫(kù)組件來(lái)構(gòu)建一個(gè)應(yīng)用程序。也有其他的操作系統(tǒng),提供了一個(gè)內(nèi)核和一些可重構(gòu)的底層服務(wù),將其虛擬成節(jié)點(diǎn)的硬件組件。該服務(wù)可以在“編排”后構(gòu)成應(yīng)用程序,因?yàn)檫@些服務(wù)的核心功能相對(duì)獨(dú)立,即使它的功能是有限的,在一定程度上也是一個(gè)關(guān)注點(diǎn)分離,關(guān)注點(diǎn)分離確保了靈活和高效的重新編程和重新配置。更新或升級(jí),可根據(jù)需要作為一個(gè)整體或部分。在軟件升級(jí)中,重新配置確保了通信帶寬和存儲(chǔ)空間的有效利用。

2)系統(tǒng)開銷

操作系統(tǒng)執(zhí)行程序代碼,需要自己的資源共享。消耗多少資源取決于它提供的更高服務(wù)級(jí)別和應(yīng)用時(shí)的規(guī)模和服務(wù)類型,操作系統(tǒng)所消耗的資源稱為系統(tǒng)的開銷( overhead)。

目前可用的無(wú)線傳感器節(jié)點(diǎn)擁有的資源是以幾千字節(jié)和幾百兆字節(jié)為單位來(lái)計(jì)量的,這些資源會(huì)在程序進(jìn)行檢測(cè)、數(shù)據(jù)融合、自組織、網(wǎng)絡(luò)化管理和通信等方面被共享,鑒于這些任務(wù),操作系統(tǒng)的開銷應(yīng)該被理解。

3)可移植性

前面已經(jīng)闡述了不同的硬件架構(gòu)能被用于開發(fā)無(wú)線傳感器節(jié)點(diǎn),在理想情況下,異構(gòu)體系結(jié)構(gòu)和操作系統(tǒng)的節(jié)點(diǎn)能夠共存和互相協(xié)作。然而目前現(xiàn)有的操作系統(tǒng)不提供這種類型的支持。

對(duì)于利用操作系統(tǒng)的可移植性來(lái)處理硬件架構(gòu)的快速演變的問(wèn)題,無(wú)線傳感器網(wǎng)絡(luò)仍然是一門新興技術(shù)。在過(guò)去的十年中,架構(gòu)設(shè)計(jì)經(jīng)歷了顯著的變化,越來(lái)越多領(lǐng)域的應(yīng)用程序開始被研究。為了適應(yīng)無(wú)法預(yù)料的要求,這種演變的趨勢(shì)將會(huì)繼續(xù)下去。而操作系統(tǒng)應(yīng)該是便攜的和可擴(kuò)展的。

4)動(dòng)態(tài)編程

一旦無(wú)線傳感器網(wǎng)絡(luò)被部署,一部分應(yīng)用程序或操作系統(tǒng)可能需要重新編程,原因如下:

??在初的部署設(shè)置時(shí),無(wú)法獲取完整部署所需的條件參數(shù),因此,網(wǎng)絡(luò)可能無(wú)法達(dá)到佳性能。

??應(yīng)用需求和網(wǎng)絡(luò)操作中物理環(huán)境的屬性會(huì)隨著時(shí)間變化。當(dāng)網(wǎng)絡(luò)正在運(yùn)行時(shí)檢測(cè)和修復(fù)錯(cuò)誤可能是必要的。

因?yàn)楣?jié)點(diǎn)數(shù)量龐大,人工更換軟件是行不通的。另一種方法是開發(fā)一個(gè)操作系統(tǒng),提供支持動(dòng)態(tài)編程的功能?;谶@樣的考慮,要求應(yīng)用程序和操作系統(tǒng)之間有明顯的分離界限,才可能實(shí)現(xiàn)動(dòng)態(tài)重編程的功能。另一方面,如果兩者之間有界限,在原則上可以實(shí)現(xiàn)動(dòng)態(tài)編程,但其實(shí)際執(zhí)行取決于幾個(gè)因素:首先,操作系統(tǒng)應(yīng)該能接收“一片接一片的(pieceby piece)”軟件更新,將它組合并存儲(chǔ)在臨時(shí)內(nèi)存中;其次,操作系統(tǒng)要確保這確實(shí)是一個(gè)更新版本;后,它應(yīng)該能刪去舊的軟件,并安裝和配置新的升級(jí)版本。所有這些資源的消耗可能導(dǎo)致自身錯(cuò)誤。

軟件重新編程需要多種傳輸協(xié)議代碼、壓縮和解壓縮代碼;并確保代碼的一致性和版本控制;以無(wú)線傳輸代碼的方式來(lái)提供可靠穩(wěn)定抗干擾的( robust)傳輸策略。

當(dāng)前發(fā)展中的編程工具和環(huán)境將在以后的章節(jié)中介紹。

3.原型

1TinyOS (微操作系統(tǒng).)

在無(wú)線傳感器網(wǎng)絡(luò)中微操作系統(tǒng)應(yīng)用廣泛、可選范圍豐富并且運(yùn)行環(huán)境有輔助工具。此外,它經(jīng)歷了一個(gè)漫長(zhǎng)的設(shè)計(jì)和演進(jìn)過(guò)程,使其工作原理更容易理解。

微操作系統(tǒng)具有緊湊的結(jié)構(gòu),這使它能夠支持很多應(yīng)用程序,概念上的架構(gòu)包括一個(gè)調(diào)度器和一套組件,可通過(guò)定義良好的接口相互連接。組件可分為配置組件和模塊。配置組件是由兩個(gè)以上的模塊相互連接而被“編排”( wiring)組成,而模塊是微操作系統(tǒng)程序的基本構(gòu)建塊。多種配置組成一個(gè)單一的可執(zhí)行代碼,并產(chǎn)生一個(gè)微操作系統(tǒng)應(yīng)用程序,微操作系統(tǒng)在應(yīng)用和操作系統(tǒng)之間并沒有提供一個(gè)明確的關(guān)注點(diǎn)分離。

一個(gè)組件由一個(gè)框架、命令處理程序、事件處理程序和一套不可中斷的任務(wù)組成。組件是類似于面向?qū)ο缶幊陶Z(yǔ)言中的對(duì)象,它封裝了狀態(tài),并通過(guò)定義良好的接口進(jìn)行交互。一個(gè)接口可以定義命令、事件處理程序和任務(wù),并以它們自己的狀態(tài)在一定框架范圍內(nèi)運(yùn)行。因此,組什需明確其命令的用途和發(fā)出信號(hào)的事什,這種方式可以滿足在這個(gè)應(yīng)用程序被編譯時(shí)確定所需的資源。

組件是分層結(jié)構(gòu),并通過(guò)命令和事件互相通信:高級(jí)別的組件給低級(jí)別的組件廣播發(fā)送命令,低級(jí)別的組件給高級(jí)別的組件發(fā)送響應(yīng)事件信號(hào)。因此,高級(jí)別的組件實(shí)現(xiàn)事件處理程序,而低級(jí)別的組件控制處理器(或功能子程序)。物理硬件的組成是以層次結(jié)構(gòu)為基礎(chǔ)的,圖3.1說(shuō)明了應(yīng)用程序和操作系統(tǒng)之間的邏輯邊界。

在圖3.1中可以看到,有兩個(gè)組件處于高級(jí)別,即路由組件和傳感器中的應(yīng)用組件。路由組件是負(fù)責(zé)建立和維護(hù)網(wǎng)絡(luò)的,而傳感器的應(yīng)用組件是負(fù)責(zé)傳感和處理的。通過(guò)動(dòng)態(tài)交互信息,兩個(gè)組件互相通信,并與較低級(jí)別的組件異步。此外,通過(guò)發(fā)出無(wú)阻塞指令和表示對(duì)指定的事件的關(guān)注,一個(gè)高級(jí)別組件能與低級(jí)別組件相互通信。

3.2-3.4顯示了邏輯結(jié)構(gòu)部件和組件配置,在圖3.2中組件A顯示了它服務(wù)接口C的功能,反過(guò)來(lái)又提供給命令Dl和信號(hào)事件D2。在圖3.3中,組件B表示宣布調(diào)用命令Dl和提供一個(gè)事件處理程序來(lái)處理事件D2的界面。

在圖3.4中,組件A和組件B之間的綁定是通過(guò)配置E來(lái)約束的。

?

低級(jí)別組件和高級(jí)別組件的邏輯邊界

3.1??低級(jí)別組件和高級(jí)別組件的邏輯邊界

?

微操作系統(tǒng)中定義的任務(wù)、指令和事件作為微操作系統(tǒng)運(yùn)行環(huán)境的基本構(gòu)建塊,是為單一的框架組件之間能進(jìn)行有效通信。任務(wù)是從執(zhí)行直到完成的單一過(guò)程。換句話說(shuō),雖然它們可以被事件中斷,但它們不能被其他任務(wù)搶占,這就是為什么微操作系統(tǒng)能支持并發(fā)( concurrency),并確保任務(wù)互不干擾或破壞對(duì)方的數(shù)據(jù)的原因。

因?yàn)槿蝿?wù)要被完整執(zhí)行,它可以分配一個(gè)單一的堆棧來(lái)存儲(chǔ)上下文消息。任務(wù)可以調(diào)用低級(jí)別的指令,發(fā)送信號(hào)給更高級(jí)別的事件,并調(diào)用其他任務(wù),包括它們自己。例如,負(fù)責(zé)從通信子系統(tǒng)讀取數(shù)據(jù)包的任務(wù)可以重復(fù)調(diào)用自己,直到它已經(jīng)完成讀取所有的數(shù)據(jù)包。在微操作系統(tǒng)中調(diào)用任務(wù)是以FIFO規(guī)則為基礎(chǔ)的,微操作系統(tǒng)架構(gòu)對(duì)持續(xù)時(shí)間短的任務(wù)是有效的。

指令是由高級(jí)別組件到低級(jí)別組件的非阻塞請(qǐng)求,為了處理潛在的長(zhǎng)期執(zhí)行操作,微操作系統(tǒng)引入了分時(shí)操作的概念。在一個(gè)分時(shí)系統(tǒng)中,當(dāng)任務(wù)完成后,函數(shù)調(diào)用會(huì)立即返回,并且調(diào)用的函數(shù)會(huì)通知調(diào)用者。它被稱為分時(shí)是因?yàn)樗鼘⒄{(diào)用和執(zhí)行分割成兩個(gè)時(shí)間段來(lái)完成,一個(gè)典型的例子是數(shù)據(jù)包的傳輸任務(wù)。數(shù)據(jù)包傳輸可以阻塞任務(wù),因?yàn)榻邮掌髟跀?shù)據(jù)包重發(fā)之前要等待一個(gè)超時(shí)事件( ttim。。ut)。然而,在超時(shí)信號(hào)出現(xiàn)之前如果收到一個(gè)ACK數(shù)據(jù)包,接收器會(huì)放棄等待ttime。。。的控制。在微操作系統(tǒng)中,這個(gè)任務(wù)被分解成兩個(gè)事件:超時(shí)事件和數(shù)據(jù)包接收事件。

每一個(gè)對(duì)己被命名事件感興趣的組件都應(yīng)該提供一個(gè)事件處理程序來(lái)處理它,硬件事件發(fā)生時(shí)將會(huì)調(diào)用事件處理程序。低級(jí)別的組件也能直接連接到硬件中斷的處理程序,如外部中斷、定時(shí)器事件、計(jì)數(shù)器事件。事件處理器會(huì)以不同的方式來(lái)處理可能發(fā)生的事件。它可以將后期高級(jí)別事件信息存入其結(jié)構(gòu)中,或者調(diào)用低級(jí)別指令。

在微操作系統(tǒng)中資源分配是采用靜態(tài)內(nèi)存分配來(lái)進(jìn)行優(yōu)化的,因?yàn)閼?yīng)用的內(nèi)存需求是在其組成時(shí)就明確了,它避免了與動(dòng)態(tài)分配有關(guān)的額外開銷。由于微操作系統(tǒng)缺乏明確的關(guān)注點(diǎn)分離,限制了它的適應(yīng)性。此外,沒有額外支持的微操作系統(tǒng)和任何機(jī)制來(lái)動(dòng)態(tài)加載和刪除組件。

作為一個(gè)基于事件的系統(tǒng),微操作系統(tǒng)不支持直接執(zhí)行上下文,因此一個(gè)復(fù)雜的程序通常需要一個(gè)狀態(tài)機(jī)。因?yàn)樵S多程序員認(rèn)為狀態(tài)機(jī)難以管理,所以狀態(tài)機(jī)出現(xiàn)較少,文獻(xiàn)中提到一個(gè)典型的例子是處理與加密操作。這些操作需要幾秒鐘的時(shí)間來(lái)完成,占用了處理器的寶貴時(shí)間,使系統(tǒng)無(wú)法響應(yīng)外部事件?;诰€程的操作系統(tǒng)用時(shí)間先決( time critical)或短周期的任務(wù)搶占來(lái)處理這種類型的情況。

2SOS

SOS嘗試在靈活性和資源效率之間建寺平衡,與微操作系統(tǒng)有所不同,它支持運(yùn)行程序代碼重新配置和重新編程。操作系統(tǒng)包括內(nèi)核和一組模塊,可以裝載和卸載。在功能上模塊類似于微操作系統(tǒng)的組件,它實(shí)現(xiàn)了特定的任務(wù)或功能。此外,微操作系統(tǒng)組件能以同樣的方式“編排”建立一個(gè)應(yīng)用程序,SOS應(yīng)用程序由一個(gè)或多個(gè)互動(dòng)模塊組成。不像微操作系統(tǒng)的組件,它在內(nèi)存中有一個(gè)固定存儲(chǔ)區(qū),在SOS模塊中是一個(gè)狀態(tài)獨(dú)立的二進(jìn)制代碼,這種典型的特征確保了SOS能與其他模塊動(dòng)態(tài)鏈接。

SOS內(nèi)核提供底層硬件接口,此外,它提供一個(gè)基于優(yōu)先級(jí)的調(diào)度機(jī)制,并支持動(dòng)態(tài)內(nèi)存分配。

(1).交互

交互模塊通過(guò)異步通信和直接調(diào)用注冊(cè)函數(shù)(registered function),源于模塊A到模塊B的消息要先經(jīng)過(guò)位于優(yōu)先級(jí)隊(duì)列排列的調(diào)度器。然后內(nèi)核會(huì)調(diào)用模塊B中合適的消息處理程序,并把消息傳送給它。

模塊執(zhí)行特定目的存在的消息處理程序。一個(gè)模塊可以通過(guò)直接調(diào)用它的注冊(cè)函數(shù)與另一個(gè)模塊進(jìn)行交互。通過(guò)函數(shù)調(diào)用的交互作用比基于消息通信的速度要快,這種方法需要模塊來(lái)明確記錄其在內(nèi)核中的公用函數(shù),所有關(guān)注這些函數(shù)的模塊需要“訂閱”( subscribe)這些函數(shù)。在模塊初始化時(shí),注冊(cè)函數(shù)通過(guò)調(diào)用一個(gè)名為ker_register_fn的系統(tǒng)函數(shù)來(lái)產(chǎn)生,調(diào)用確保模塊通知內(nèi)核二進(jìn)制映像函數(shù)被執(zhí)行了。內(nèi)核通過(guò)創(chuàng)建一個(gè)函數(shù)控制塊(FCB)來(lái)存儲(chǔ)函數(shù)的關(guān)鍵信息,這個(gè)信息是用來(lái)處理函數(shù)訂閱,并支持動(dòng)態(tài)內(nèi)存管理和運(yùn)行時(shí)的模塊更新。圖3.5說(shuō)明了兩個(gè)基本類型模塊之間的交互作用。

?

SOS系統(tǒng)中模塊間的交互

??????????????????3.5??SOS系統(tǒng)中模塊間的交互

模塊通過(guò)調(diào)用名為ker_get_handle的系統(tǒng)函數(shù)來(lái)訂閱一個(gè)命名函數(shù),這樣做它們提供了帶有模塊的內(nèi)核和函數(shù)的ID,這將用于定位關(guān)注的函數(shù)控制塊。如果查找成功,內(nèi)核返回一個(gè)指向訂閱函數(shù)的函數(shù)指針的指針。訂閱者通過(guò)取消指針來(lái)訪問(wèn)訂閱函數(shù),這確保了內(nèi)核通過(guò)FCB改變函數(shù)指針來(lái)重置新版本的功能,這個(gè)過(guò)程對(duì)用戶是透明的。

(2).動(dòng)態(tài)重編程

以下5個(gè)基本特征確保了SOS支持動(dòng)態(tài)編程。第一,模塊都是獨(dú)立的二進(jìn)制文件,它們使用相對(duì)地址而不是絕對(duì)地址,因此它們可重定位。第二,模塊實(shí)現(xiàn)了兩種處理,初始化和終的消息處理程序。當(dāng)首次加載模塊時(shí),初始化消息處理器將調(diào)用內(nèi)核。其目的是設(shè)置模塊的初始狀態(tài),包括初始化定時(shí)器、函數(shù)注冊(cè)以及函數(shù)訂閱。在卸載模塊前,內(nèi)核會(huì)調(diào)用終的消息處理器。其目的是釋放模塊擁有的所有資源,包括定時(shí)器、內(nèi)存和注冊(cè)函數(shù),使該模塊能正常退出系統(tǒng)。在終消息后,內(nèi)核會(huì)進(jìn)行垃圾回收。第三,編譯過(guò)程中,在已知的偏移二進(jìn)制中,SOS使用一個(gè)鏈接腳本放置初始化處理模塊,腳本在模塊插入時(shí)可輕松地連接。第四,SOS保留外部的模塊狀態(tài),這使新插入的模塊繼承了它所替換模塊的狀態(tài)信息。第五,當(dāng)模塊插入時(shí),SOS生成和保存含有相關(guān)模塊的初始化處理程序的絕對(duì)地址的原數(shù)據(jù)包,以及指針指向保持模塊狀態(tài)的動(dòng)態(tài)內(nèi)存。

SOS中,動(dòng)態(tài)模塊替換發(fā)生需3個(gè)步驟。

(1)當(dāng)一個(gè)新的模塊使用時(shí),代碼分發(fā)協(xié)議在網(wǎng)絡(luò)中發(fā)布公告,公告中包含了模塊的身份(ID)、版本號(hào)和所需內(nèi)存的大小。當(dāng)本地分發(fā)協(xié)議接收公告時(shí),它評(píng)估數(shù)據(jù)包,決定模塊是否是已經(jīng)在本地存在更新的版本或節(jié)點(diǎn)對(duì)新的模塊是關(guān)注的。在這兩種情況下,它也可以確保有足夠的空間在程序存儲(chǔ)器中下載模塊。

(2)?一旦決定下載模塊,該協(xié)議進(jìn)行下載模塊并審查第一個(gè)數(shù)據(jù)包中的元數(shù)據(jù)。元數(shù)據(jù)包含了存儲(chǔ)該模塊所需本地內(nèi)存的大小。如果SOS內(nèi)核決定了它不具有足夠的隨機(jī)存儲(chǔ)空間來(lái)滿足運(yùn)行該模塊所需的本地空間,模塊插入將會(huì)立即停止。

(3)換句話說(shuō),如果任何事情都很正常,那么模塊插入將會(huì)發(fā)生。在模塊插入時(shí),內(nèi)核創(chuàng)建的元數(shù)據(jù)用來(lái)存儲(chǔ)處理器的絕對(duì)地址,指向動(dòng)態(tài)內(nèi)存控制模塊的狀態(tài)和信息。SOS內(nèi)核通過(guò)調(diào)度模塊的初始信息來(lái)調(diào)用模塊的處理器。

3Contiki

Contiki是一種混合的操作系統(tǒng),系統(tǒng)程序被分為內(nèi)核服務(wù)和裝載程序。默認(rèn)情況下,它的核心功能是作為一個(gè)事件驅(qū)動(dòng)的內(nèi)核,并作為應(yīng)用程序庫(kù)支持多線程操作。有一個(gè)動(dòng)態(tài)鏈接策略是用來(lái)匹配多線程庫(kù)和具有明確要求的應(yīng)用。

SOS -樣,Contiki實(shí)現(xiàn)了把由內(nèi)核支持的基本系統(tǒng)與動(dòng)態(tài)可裝載和可重編程服務(wù)的剩余部分分離。通過(guò)內(nèi)核發(fā)布公告,服務(wù)程序之間相互通信。內(nèi)核本身不提供任何硬件抽象,相反,它允許設(shè)備驅(qū)動(dòng)程序和應(yīng)用程序直接與硬件通信。這個(gè)內(nèi)核的范圍有限,很容易重新編程和更換服務(wù)。

每一個(gè)Contiki通過(guò)一個(gè)私有內(nèi)存來(lái)管理自己的狀態(tài),保留一個(gè)指針來(lái)運(yùn)行狀態(tài)。然而,服務(wù)與服務(wù)之間共享相同的地址空間,它還實(shí)現(xiàn)了一個(gè)事件處理程序和一個(gè)可選的輪詢處理器。圖3.6說(shuō)明了ROMRAM的內(nèi)存分配。

?

Contiki操作系統(tǒng)的內(nèi)存分配

3.6??Contiki操作系統(tǒng)的內(nèi)存分配

如圖3.6所示,Contiki在編譯時(shí)被分成兩個(gè)主要部分:一部分是虛線內(nèi)的服務(wù),包括核心服務(wù);另一部分是這些虛線外的可動(dòng)態(tài)裝載服務(wù)。核心由內(nèi)核、程序加載器、驅(qū)動(dòng)通信硬件設(shè)備的通信協(xié)議棧和其他經(jīng)常使用的服務(wù)組成。這些服務(wù)被編譯成一個(gè)二進(jìn)制映像,并運(yùn)行在無(wú)線傳感器節(jié)點(diǎn)上。這種操作系統(tǒng)只能被特殊的啟動(dòng)引導(dǎo)加載器(boot loader)覆蓋或修改,其他情況下是不能被動(dòng)態(tài)修改的。

該程序加載器負(fù)責(zé)將驅(qū)動(dòng)程序下載到活動(dòng)內(nèi)存(active memory),它可以通過(guò)遠(yuǎn)程數(shù)據(jù)的通信服務(wù)或直接從本地存儲(chǔ)來(lái)得到二進(jìn)制文件。通常程序二進(jìn)制文件存儲(chǔ)在EEPROM中。

內(nèi)核是操作系統(tǒng)的核心要素,其基本任務(wù)是調(diào)度事件和定期輪詢處理。隨后,Contiki的程序執(zhí)行由內(nèi)核或通過(guò)輪詢機(jī)制調(diào)度事件來(lái)觸發(fā)。在沒有被中斷或被其他機(jī)制所搶占的情況下,事件處理程序完成一個(gè)完整的事件處理。當(dāng)Contiki在多線程環(huán)境中運(yùn)行時(shí),可能會(huì)出現(xiàn)一個(gè)線程搶占另一個(gè)線程的情況。

內(nèi)核支持同步和異步事件,同步事件被盡可能快地派遣到目標(biāo)進(jìn)程,一旦事件的進(jìn)程結(jié)束,控制返回到張貼過(guò)程(posting process)。另一方面,異步事件在合適的時(shí)候被派遣。除了這些事件外,內(nèi)核提供了一種輪詢機(jī)制,定期對(duì)硬件組件的狀態(tài)進(jìn)行采樣。在這段時(shí)間內(nèi),調(diào)查處理器通過(guò)硬件設(shè)備的優(yōu)先級(jí)來(lái)確定目標(biāo)。

(1).服務(wù)架構(gòu)

Contiki操作系統(tǒng)一個(gè)很有趣的特征是其支持動(dòng)態(tài)加載和重新配置的服務(wù),這是通過(guò)定義服務(wù)、服務(wù)接口、服務(wù)存根和服務(wù)層來(lái)實(shí)現(xiàn)的。Contiki服務(wù)模塊是針對(duì)微操作系統(tǒng)的。?Contiki服務(wù)包括服務(wù)接口及其實(shí)現(xiàn),也就是所謂的過(guò)程。服務(wù)接口包括一個(gè)版本號(hào),以及實(shí)現(xiàn)該接口的功能的指針函數(shù)的列表。服務(wù)存根通過(guò)服務(wù)接口與服務(wù)的動(dòng)態(tài)通信來(lái)完成一個(gè)應(yīng)用程序,服務(wù)層類似于查詢服務(wù)或注冊(cè)表服務(wù)。主動(dòng)服務(wù)通過(guò)提供服務(wù)接口、地址信息和版本號(hào)來(lái)對(duì)服務(wù)進(jìn)行描述,這樣一來(lái),服務(wù)層保持跟蹤所有進(jìn)行的服務(wù)。圖3.7.說(shuō)明了應(yīng)用程序與Contiki服務(wù)是如何進(jìn)行交互的。

?

 Contiki服務(wù)交互架構(gòu)

3.7??Contiki服務(wù)交互架構(gòu)

因?yàn)槌绦蚴峭ㄟ^(guò)服務(wù)接口存根調(diào)用服務(wù)的,所以這種操作沒必要知道有關(guān)的實(shí)施細(xì)節(jié)或服務(wù)在內(nèi)存中的地址。當(dāng)服務(wù)接口被調(diào)用時(shí),服務(wù)接口存根查詢服務(wù)層,并獲得一個(gè)服務(wù)接口的指針。一旦獲得服務(wù)的接口描述與服務(wù)的存根版本號(hào)配對(duì),那么該接口存根就會(huì)調(diào)用執(zhí)行所請(qǐng)求的功能。服務(wù)與使用該服務(wù)的程序的松散耦合使操作系統(tǒng)可以更新服務(wù),而不需要修改應(yīng)用程序。

(2).協(xié)議線程( Proto Thread)

Contiki通過(guò)結(jié)合一些事件和線程的功能來(lái)介紹協(xié)議線程的概念,協(xié)議線程可以視為輕量級(jí)(無(wú)堆棧的)線程,但它們也可以作為基于事件編程的中斷任務(wù)。一個(gè)協(xié)議線程提供有條件的阻塞等待聲明,PT__ WAIT_UNTILQ需要一個(gè)條件語(yǔ)句塊實(shí)例,直到該語(yǔ)句評(píng)估正確為止。當(dāng)協(xié)議線程到達(dá)PT WAIT_UNTIL()聲明時(shí),如果條件聲明是正確的,那么它不中斷地繼續(xù)執(zhí)行。PT—WAIT_UNTIL()指令不需要任何條件聲明,包括復(fù)雜的布爾表達(dá)式。

因?yàn)閰f(xié)議線程是無(wú)堆棧的,只有明確的PT WAIT_UNTIL()聲明能阻塞這個(gè)線程,所以從調(diào)度的角度來(lái)看,系統(tǒng)中的所有協(xié)議線程在相同的堆棧中運(yùn)行,上下文切換是通過(guò)堆棧彈出來(lái)實(shí)現(xiàn)的。通過(guò)分別使用PT__ BEGINPT END聲明來(lái)明確宣告協(xié)議線程的開始和結(jié)束,協(xié)議線程可以通過(guò)PT EXIT語(yǔ)句提前結(jié)束。

協(xié)議線程概念并沒有明確指明它什么時(shí)候或以什么方式來(lái)被調(diào)用或調(diào)度,在Contiki的實(shí)施中,運(yùn)行在事件驅(qū)動(dòng)內(nèi)核頂層的過(guò)程被當(dāng)作一個(gè)協(xié)議線程來(lái)執(zhí)行,因此,當(dāng)過(guò)程收到一個(gè)事件時(shí)協(xié)議線程被調(diào)用,例如,在過(guò)程從其他過(guò)程或計(jì)時(shí)器事件收到消息的時(shí)候。同樣,協(xié)議線程概念不預(yù)先確定內(nèi)存是如何劃撥給管理協(xié)議線程狀態(tài)的。與調(diào)度一樣,這也是在特定條件下實(shí)現(xiàn)的。例如,只有預(yù)先知道操作系統(tǒng)是由基于一組固定的協(xié)議線程組成,才能通過(guò)提前靜態(tài)分配內(nèi)存來(lái)進(jìn)行狀態(tài)管理。如果協(xié)議線程的數(shù)量沒有提前知道,內(nèi)存也可以以一種動(dòng)態(tài)方式來(lái)分配。在Contiki執(zhí)行中,靜態(tài)內(nèi)存分配是一種典型的設(shè)置,并且協(xié)議線程狀態(tài)保存在進(jìn)程控制塊中。

因?yàn)閰f(xié)議線程減少了明確的狀態(tài)機(jī)和狀態(tài)轉(zhuǎn)換,所以簡(jiǎn)化了事件驅(qū)動(dòng)的編程狀態(tài)機(jī)的設(shè)計(jì)。協(xié)議線程的成本是與內(nèi)存開銷和幾個(gè)處理器的開銷有關(guān)的,為了說(shuō)明協(xié)議線程的實(shí)用性,考慮一個(gè)MAC協(xié)議,定期關(guān)閉無(wú)線收發(fā)子系統(tǒng),但要確保無(wú)線收發(fā)子系統(tǒng)在進(jìn)入休眠狀態(tài)前完成通信。這種行為歸納如下:

(1)此時(shí)無(wú)線收發(fā)子系統(tǒng)打開。

(2)無(wú)線收發(fā)子系統(tǒng)周期性地保持收發(fā)狀態(tài)。

(3)?一旦超過(guò),無(wú)線收發(fā)子系統(tǒng)就會(huì)關(guān)閉,但是它已完成一項(xiàng)正在進(jìn)行的通信。

(4)如果通信沒有完成,那么MAC協(xié)議就要等待twait max時(shí)刻到達(dá),相當(dāng)于一個(gè)完整的通信周期。

(5)如果通信完成或超過(guò)大等待時(shí)間,無(wú)線收發(fā)子系統(tǒng)就會(huì)關(guān)閉,并且會(huì)保持休眠一個(gè)周期。

(6)這個(gè)過(guò)程(通信一休眠)不斷重復(fù)。

3.8和圖3.9分別顯示了基于事件與基于協(xié)議線程實(shí)現(xiàn)的通信子系統(tǒng)的睡眠調(diào)度。狀態(tài)機(jī)的實(shí)現(xiàn)需要一個(gè)明確的狀態(tài)變量,可以采用開啟、等待和關(guān)閉。有條件的if語(yǔ)句是用來(lái)執(zhí)行不同的動(dòng)態(tài)變量的值,代碼可以放置在事件處理函數(shù)中,無(wú)論什么時(shí)候事件發(fā)生都可以被調(diào)用。在這種情況下可能發(fā)生的事件是定時(shí)時(shí)間到時(shí)和通信結(jié)束。在圖3.8中可以看出,控制狀態(tài)機(jī)的代碼量超過(guò)總代碼量的三分之一,此外,該機(jī)制的6個(gè)步驟的結(jié)構(gòu)不能直接從代碼中顯現(xiàn)出來(lái)。

協(xié)議線程實(shí)施休眠的時(shí)間安排顯然是更短、更直觀的。

?

4LiteOS

LiteOS是一種基于多線程的操作系統(tǒng),并且支持多個(gè)應(yīng)用程序。它是基于一個(gè)操作系統(tǒng)和在它上面運(yùn)行的應(yīng)用程序之間完全分離的原則,不同于所有其他的操作系統(tǒng),LiteOS并沒有提供用來(lái)“編排”起來(lái)建立應(yīng)用程序的組件或模塊。就LiteOS而言,開發(fā)建立阻塞和確定它們彼此交互的方式,完全是應(yīng)用程序開發(fā)人員的任務(wù)。

LiteOS提供幾種系統(tǒng)調(diào)用的方式:來(lái)自用戶的分離系統(tǒng)的殼調(diào)用,分層文件管理系統(tǒng),動(dòng)態(tài)重編程技術(shù)。

整個(gè)系統(tǒng)仿照分布式文件系統(tǒng),在基站端的用戶可以使用安裝在資源豐富的計(jì)算機(jī)上的殼調(diào)用來(lái)實(shí)現(xiàn)對(duì)已命名節(jié)點(diǎn)的識(shí)別、交互,以及重編程。網(wǎng)絡(luò)中的每個(gè)節(jié)點(diǎn)運(yùn)行一個(gè)多線程的內(nèi)核,其中有3個(gè)主要組件:一個(gè)調(diào)度器、一套系統(tǒng)調(diào)用和二進(jìn)制安裝器。內(nèi)核的系統(tǒng)調(diào)用,使遠(yuǎn)程用戶可以訪問(wèn)和管理本地文件和目錄。本地文件分為傳感器數(shù)據(jù)、設(shè)備驅(qū)動(dòng)程序和應(yīng)用程序二進(jìn)制文件。在系統(tǒng)內(nèi)的層次結(jié)構(gòu)中,一個(gè)節(jié)點(diǎn)是一個(gè)無(wú)指定的組件。

3.10說(shuō)明了LiteOS的系統(tǒng)架構(gòu)。

?

LiteOS操作系統(tǒng)架構(gòu)

3.10??LiteOS操作系統(tǒng)架構(gòu)

1).殼和系統(tǒng)調(diào)用

殼繼承了Linux操作系統(tǒng)的幾個(gè)特點(diǎn)。殼向一個(gè)距其有一跳距離的無(wú)線節(jié)點(diǎn)提供了一種安裝機(jī)制,使整個(gè)網(wǎng)絡(luò)可被視為一個(gè)分布式和分層文件系統(tǒng)。用戶可以像使用本地資源那樣訪問(wèn)一個(gè)指定節(jié)點(diǎn)的資源。殼支持大量的可以在分布式文件系統(tǒng)上執(zhí)行的Linux指令。

這樣,LiteOSLinux用戶提供了一個(gè)熟悉的界面。

命令被分為五大類:文件命令、處理命令、調(diào)試命令、環(huán)境命令和設(shè)備命令。文件中的命令用于瀏覽分層文件系統(tǒng),以及移動(dòng)、復(fù)制、刪除文件和目錄。下面給出一個(gè)使用文件命令操作的例子。

$ pwd

Current directory is /snOl/node101/apps

$ cp /c/Blink.lhex Blink.lhex

Copy complete

$ exec Blink.lhex

File Blink.‘lhex successfully started

$ ps

Name State

Blink Sleep

在這個(gè)例子中,pwd命令在sn01節(jié)點(diǎn)中打印了工作目錄,這就是node101/apps。接下來(lái),使用cp指令,Blink.lhex文件從資源豐富的計(jì)算機(jī)的根日錄被復(fù)制到指定節(jié)點(diǎn)的sn01目錄。然后,通過(guò)使用exec指令,文件就會(huì)被執(zhí)行。ps指令報(bào)告進(jìn)程狀態(tài),在這種情況下表示一個(gè)休眠的線程。

該過(guò)程命令對(duì)管理、創(chuàng)建、暫停、終止線程是非常有用的。在LiteOS中可以同時(shí)使用多達(dá)8個(gè)線程,調(diào)適指令確保能建立調(diào)適環(huán)境來(lái)調(diào)適程序代碼。環(huán)境指令給管理操作系統(tǒng)環(huán)境提供了支持、顯示交互的歷史記錄,并提供命令手冊(cè)。后,設(shè)備命令提供對(duì)硬件設(shè)備(如傳感器和無(wú)線收發(fā)子系統(tǒng))的直接訪問(wèn)。

2.LiteFS

LiteFS是一種分布式文件系統(tǒng),它是LiteOS的本質(zhì)特征。通過(guò)LiteFS,用戶可以直接訪問(wèn)傳感器網(wǎng)絡(luò),可以規(guī)劃和管理各個(gè)節(jié)點(diǎn)。類似于Linux中的文件,LiteOS中的文件代表數(shù)據(jù)、應(yīng)用程序二進(jìn)制和設(shè)各驅(qū)動(dòng)程序。本地文件系統(tǒng)的組織結(jié)構(gòu)如下:RAM包含被開放( opened)文件的列表以及內(nèi)存分配和閃存EEPROM中的有關(guān)信息。文件系統(tǒng)的結(jié)構(gòu)被存儲(chǔ)在EEPROM存儲(chǔ)器中,實(shí)際文件被存儲(chǔ)在閃存中,如圖3.11所示。

?

LiteFS的文件系統(tǒng)結(jié)構(gòu)

3.11??LiteFS的文件系統(tǒng)結(jié)構(gòu)

RAM中可同時(shí)打開多達(dá)8個(gè)文件,LiteFS使用兩位向量來(lái)跟蹤EEPROM和閃存分配。8B用于前者,32B用于后者,這相當(dāng)于RAM104B。在EEPROM中每個(gè)文件代表一個(gè)32B的控制塊,控制塊的可用空問(wèn)被劃分為65塊。第一塊是根塊,它在文件系統(tǒng)格式化時(shí)都被初始化,其余的區(qū)塊是目錄塊(圖中的D)或文件塊(圖中的F)。文件控制塊多可尋址10個(gè)邏輯FLASH頁(yè),每一頁(yè)包含2KB的數(shù)據(jù)(或8個(gè)物理FLASH頁(yè))。當(dāng)一個(gè)文件占用超過(guò)20KB時(shí),LiteFS為這個(gè)文件分配另一個(gè)控制塊,并且在以前的控制塊中存儲(chǔ)一個(gè)新的控制塊的地址。

3).動(dòng)態(tài)重編程

LiteOS支持用戶應(yīng)用程序的動(dòng)態(tài)更換和重新編程,無(wú)論是否提供源代碼都可以完成。如果源代碼是提供給操作系統(tǒng)的,它將被一個(gè)新的內(nèi)存設(shè)置重新編譯,同時(shí)所有引用和指向舊版本的指針將被重新定向。如果源代碼不是提供給操作系統(tǒng)的,LiteOS采用差別修補(bǔ)( differential patching)”機(jī)制,以取代舊版本的二進(jìn)制代碼。該方法是通過(guò)插入差別修補(bǔ)程序,并將差別修補(bǔ)程序連同二迸制映像文件一起分發(fā),來(lái)直接將重定位信息編碼到二進(jìn)制應(yīng)用程序代碼中。

有一種描述差別修補(bǔ)的數(shù)學(xué)模型已經(jīng)被提出,該模型具有3個(gè)參數(shù)。該模型的參數(shù)是閃存的二進(jìn)制可執(zhí)行文件的起始地址、RAM中已分配內(nèi)存的起始地址、棧頂。堆棧屬于內(nèi)存的一部分,只是在實(shí)際執(zhí)行的過(guò)程中內(nèi)存的某個(gè)區(qū)域被指定作為堆棧。當(dāng)這些參數(shù)已知時(shí),就有可能將更新的程序插入到舊的二進(jìn)制映像中。模型參數(shù)是憑借經(jīng)驗(yàn)和節(jié)點(diǎn)架構(gòu)的知識(shí)來(lái)獲得的,這限制了修補(bǔ)計(jì)劃的實(shí)用性。

4.評(píng)價(jià)

與所有的排名一樣,對(duì)操作系統(tǒng)的性能進(jìn)行排名是一個(gè)困難的任務(wù),排名需要從一個(gè)合適的角度進(jìn)行。在無(wú)線傳感器網(wǎng)絡(luò)中,有關(guān)于開發(fā)、部署、運(yùn)行性能和代碼更新的若干問(wèn)題。如果以設(shè)計(jì)為主題,可能存在以下的問(wèn)題:由操作系統(tǒng)提供的用來(lái)訪問(wèn)硬件設(shè)備的接口有多豐富?由操作系統(tǒng)支持的編程環(huán)境有多靈活和富有表現(xiàn)性?由操作系統(tǒng)支持的并有利于構(gòu)建應(yīng)用程序的模塊、組件和庫(kù)文件是否有多樣的選擇?操作系統(tǒng)便攜到什么程度?應(yīng)用程序代碼的可管理性如何?

如果以部署為主題,主要的方面是動(dòng)態(tài)代碼的安裝和動(dòng)態(tài)代碼的傳送。在大量的節(jié)點(diǎn)上對(duì)代碼進(jìn)行安裝和測(cè)試是一個(gè)繁重的任務(wù)。同樣,如果就代碼的更新而言,動(dòng)態(tài)代碼的傳送和重編程是重要的因素。

如果以運(yùn)行方式為主題,主要的方面是操作系統(tǒng)的效率,特別是緊湊性和功耗。

在這些方面,TinyOS在規(guī)模上是緊湊的,在資源利用上是高效的,因?yàn)楣芾矸稚Ⅲw的開銷成為單一管理純二進(jìn)制數(shù),但更換或重新編程成本高。SOS、ContikiLiteOS靈活地支持了動(dòng)態(tài)重編程,因此非常適合應(yīng)用程序可能進(jìn)行頻繁的更新和升級(jí)過(guò)程。然而,圖像傳送的成本比較高。LiteOS被視為一個(gè)分布式文件系統(tǒng)網(wǎng)絡(luò)的方式很有趣,因?yàn)樗鼮橛脩籼峁┝艘粋€(gè)直觀的網(wǎng)絡(luò)瀏覽方式。然而,因?yàn)楣?jié)點(diǎn)是無(wú)狀態(tài)的,所有的更新記錄應(yīng)存儲(chǔ)在用戶觸手可及的地方,它會(huì)導(dǎo)致網(wǎng)絡(luò)上額外的流量被用于傳送命令和狀態(tài)信息。

通常,無(wú)線傳感器網(wǎng)絡(luò)是一種新的技術(shù)領(lǐng)域。操作環(huán)境以及應(yīng)用要求可能變得更加緊湊和精致,但還存在一些后續(xù)的問(wèn)題,如動(dòng)態(tài)編程和代碼更換之間的平衡,另外還有代碼的執(zhí)行效率與其他諸多因素的平衡。

????3.1和表3.2提供了本章提出的4個(gè)操作系統(tǒng)的功能和非功能方面的摘要。

?

當(dāng)前操作系統(tǒng)非功能方面的比較

3.2當(dāng)前操作系統(tǒng)非功能方面的比較

操作系統(tǒng)
小系統(tǒng)開銷
關(guān)注分離
動(dòng)態(tài)重編程
可移植性
?
TinyOs
?
332字節(jié)
操作系統(tǒng)和應(yīng)用程序之間沒有明顯的區(qū)別,在編譯過(guò)程中,一個(gè)特定的配置生成了一個(gè)單片的可執(zhí)行代碼
?
要求軟件支持

?
?
SOS
?
Ca116字節(jié)
可替代模塊被編譯生成一個(gè)可執(zhí)行代碼,這在操作系統(tǒng)和應(yīng)用程序之間沒有明顯的區(qū)別
?
支持
?
中等到低
?
Contiki
?
Ca810字節(jié)
模塊被編譯生成一個(gè)可重編程和可執(zhí)行的代碼,但這并不是應(yīng)用程序和操作系統(tǒng)的分離
?
支持
?
?
中等
?
?
LiteOS
?
不可用
應(yīng)用程序被分割成若干實(shí)體:它們是獨(dú)立于操作系統(tǒng)開發(fā)的
?
支持

?
收藏
分享到:

相關(guān)課程

中國(guó)信息化培訓(xùn)中心

中國(guó)信息化培訓(xùn)中心

認(rèn)證等級(jí)

信譽(yù)良好,可安心報(bào)讀

中國(guó)信息化培訓(xùn)中心

已獲好學(xué)校V2信譽(yù)等級(jí)認(rèn)證

信譽(yù)值

  • (60-80)基礎(chǔ)信譽(yù)積累,可放心報(bào)讀
  • (81-90)良好信譽(yù)積累,可持續(xù)信賴
  • (91-100)充分信譽(yù)積累,推薦報(bào)讀

與好學(xué)校簽訂讀書保障協(xié)議:

  • 100%
  • 15
  • 14457
在線咨詢
;