摘要:無線傳感器網(wǎng)絡(luò)節(jié)點(diǎn),在一般用途的系統(tǒng)和嵌入式系統(tǒng)里都有自己的特點(diǎn)。有時必須在能源很少并且環(huán)境比較惡劣的情況下工作,同時還提供共同服務(wù),使它很容易編寫應(yīng)用程序。在當(dāng)前流行的無線傳感網(wǎng)絡(luò)操作系統(tǒng)TinyOs下,雖然各個組件可以互相提供共同服務(wù),但是每個傳感器節(jié)點(diǎn)必須單獨(dú)的運(yùn)行一個靜態(tài)的系統(tǒng)鏡像,所以很難滿足多維應(yīng)用的系統(tǒng)或者頻繁的應(yīng)用更新。SOS,一種從設(shè)計(jì)上更考慮動態(tài)性的更適合微型節(jié)點(diǎn)的操作系統(tǒng)應(yīng)運(yùn)而生。它由一個公共的內(nèi)核和模塊組成,它有自己的消息機(jī)制,動態(tài)內(nèi)存機(jī)制,可以動態(tài)加載和動態(tài)卸載模塊,以及其他的一些服務(wù)。然而模塊之間是通過一個相互的預(yù)定協(xié)作機(jī)制相互聯(lián)系的,沒有內(nèi)存的保護(hù)。但是盡管如此,SOS通過一系列自己的手段有效的克服了這些缺點(diǎn),比如看門狗定時器,垃圾回收系統(tǒng)等等。相互獨(dú)立的模塊之間,可以通過最小的系統(tǒng)終端來添加或者刪除。通過對比,雖然SOS是動態(tài)設(shè)計(jì)并且使用了更高的內(nèi)核接口,但是跟TinyOs相比,總的使用開銷卻是基本一樣的。SOS是基于模塊化的,容易編程。TinyOS是基于組件化,效率高。而MantisOS可以支持多線程,但是代碼占用空間大。由此可以看到,SOS是一個具有自己的特點(diǎn)和優(yōu)勢的無線傳感網(wǎng)絡(luò)操作系統(tǒng)。
關(guān)鍵詞:無線傳感網(wǎng)絡(luò)節(jié)點(diǎn);模塊;內(nèi)核
中圖分類號:TP393文獻(xiàn)標(biāo)識碼:A文章編號:1009-3044(2008)34-1576-02
A Dynamic Wireless Sensor Network Operating System-SOS
MA Wen-long, GAO Bao-cheng
(Institute of Automation, Beijing University of Posts and Telecommunications, Beijing 100876, China)
Abstract: Sensor network nodes exhibit characteristics of both embedded systems and general-purpose systems. They also provide common services that make it easy to write applications. In TinyOS, the current state of the art in sensor node operating systems, reusable components implement common services, but each node runs a single statically-linked system image, making it hard to run multiple applications or incrementally update applications.SOS, a new operating system for mote-class sensor nodes that takes a more dynamic point on the design spectrum. SOS consists of dynamically-loaded modules and a common kernel, which implements messaging, dynamic memory, and module loading and unloading, among other services. Modules are not processes: they are scheduled cooperatively and there is no memory protection. Nevertheless, the system protects against common module bugs using techniques such as typed entry points, watchdog timers, and primitive resource garbage collection. Individual modules can be added and removed with minimal system interruption.We describe SOS's design and implementation, discuss tradeoffs, and compare it with TinyOS Our evaluation shows that despite the dynamic nature of SOS and its higher-level kernel interface,its long term total usage nearly identical to that of systems such as TinyOS.SOS is based on modules and is easy to program,TinyOs is based on framework and has more effective,MantisOS supports multi-threaded, but needs large code space. It can be seen, SOS is one with its own characteristics and advantages of wireless sensor network operating system.
Key words:sensor network nodes; modules;kernel
1 介紹
無線傳感器節(jié)點(diǎn)構(gòu)成的網(wǎng)絡(luò),是一種體積小、電池供電的嵌入式系統(tǒng),一般工作的環(huán)境是提前沒法預(yù)知的,可能被放在手邊也可能放在很遠(yuǎn)的沒有網(wǎng)絡(luò)到達(dá)的地方,甚至可能散播在森里或者潮濕的環(huán)境里。這些困難以及無線傳感器網(wǎng)絡(luò)的高維護(hù)成本,要求無線傳感器節(jié)點(diǎn)可以克服物理環(huán)境并且有自理能力,在獲得有用數(shù)據(jù)的同時可以減少電池的使用,使得壽命可以適當(dāng)?shù)难娱L。另外,由于無線傳感器網(wǎng)絡(luò)的應(yīng)用可能瞬息萬變,所以應(yīng)用代碼可能要求經(jīng)常的改變或者升級或者更新。TinyOs系統(tǒng),有很多用NesC語言編寫的軟件包,可以達(dá)到這個要求,但是大小的改動都需要重新編譯成靜態(tài)鏡像文件重新加載到嵌入式系統(tǒng)里,這樣就使得應(yīng)用程序的更新變得代價非常高。
無線傳感網(wǎng)絡(luò)操作系統(tǒng)可以完成動態(tài)鏈接等一般嵌入式操作系統(tǒng)可以完成的工作,并且沒有性能的丟失。SOS,由一個公共的內(nèi)核和動態(tài)應(yīng)用模塊組成,這些動態(tài)應(yīng)用模塊可以在運(yùn)行時被加載或者卸載。動態(tài)模塊可以通過系統(tǒng)的一個jump table 與內(nèi)核交互,并且可以提供注冊函數(shù),被其他動態(tài)模塊使用。SOS跟TinyOS一樣沒有內(nèi)存保護(hù)的機(jī)制,但是系統(tǒng)會保護(hù)內(nèi)核的公共錯誤。比如,函數(shù)功能切入點(diǎn)被一些標(biāo)記有錯誤的字符串,這樣當(dāng)把這些代碼向一個提供原來服務(wù)的節(jié)點(diǎn)上燒制的時候,系統(tǒng)就能發(fā)現(xiàn)拼寫錯誤,并避免了系統(tǒng)崩潰,這樣就有效的克服了錯誤的產(chǎn)生。
surge模塊是一個多反射的數(shù)據(jù)獲取程序,在實(shí)現(xiàn)平臺上用surge模塊分別運(yùn)行在SOS、TinyOS上,來觀察CPU的使用情況。發(fā)現(xiàn)SOS相對TinyOS 而言,CPU使用的情況算是中等情況,并且SOS提供了更好的能量節(jié)省的方法。不過運(yùn)行一段時間以后發(fā)現(xiàn)兩個系統(tǒng)的總的能量消耗是一樣的。
2 系統(tǒng)架構(gòu)
SOS在設(shè)計(jì)的時候,除了考慮了傳統(tǒng)的嵌入式系統(tǒng)本身有的技術(shù),內(nèi)核還提供了動態(tài)連接模塊,優(yōu)先級序列表,以及動態(tài)內(nèi)存管理的子系統(tǒng)。內(nèi)核提供的這些服務(wù)可以幫助用戶在一般配置后的修改。大部分傳感器網(wǎng)絡(luò)層的應(yīng)用和網(wǎng)絡(luò)協(xié)議都發(fā)生在以內(nèi)核為中心的模塊之間。一個路由協(xié)議和一個傳感器模塊就可以組成一個最小的最簡單的傳感器網(wǎng)絡(luò)的應(yīng)用結(jié)構(gòu)。
表1表明了core SOS kernel, TinyOS with Deluge, and Mat′e Bombilla virtual machine三個的內(nèi)存的占用情況,SOS支持簡單的模塊間的分發(fā)并且可以在系統(tǒng)運(yùn)行時刪除或者添加模塊。TinyOS可以分發(fā)系統(tǒng)鏡像并且可以通過Deluge來重新更新節(jié)點(diǎn)的程序。Bombilla Virtual Machine可以通過Trickle協(xié)議來運(yùn)行或者傳遞新的程序。可以看出相對TinyOS而言,TinyOS要運(yùn)行Deluge才可以,而SOS可以通過公共內(nèi)核使模塊間相互交互。相對Bombilla Virtual Machine而言,內(nèi)存占用的較少。另外值得一提的是,SOS里RAM的使用分成兩個部分,一部分是 SOS的內(nèi)核CORE,另外一部分是動態(tài)內(nèi)存池占用的。
下面討論一下SOS的架構(gòu)里的關(guān)鍵的設(shè)計(jì)。
2.1 模塊
在SOS里,模塊是可以實(shí)現(xiàn)某些功能或者任務(wù)的二進(jìn)制可執(zhí)行文件,就相當(dāng)于TinyOs里的組件。模塊可能會同時負(fù)責(zé)很多部分的功能,包括底層驅(qū)動,路由協(xié)議,應(yīng)用程序等。SOS的內(nèi)核程序一般情況下是不需要變化的,除非底層硬件發(fā)生了改變或者源代碼的管理必須改變。在SOS里一個實(shí)際的應(yīng)用程序一般由一個模塊或者多個的相互交互的模塊組成,模塊之間,位置獨(dú)立,主要是通過消息機(jī)制或者函數(shù)接口來相互聯(lián)系。SOS的發(fā)展面臨的最大困難就是維護(hù)模塊性以及模塊的安全性。
2.1.1 模塊結(jié)構(gòu)
SOS實(shí)現(xiàn)了一個定義完整并且優(yōu)化的帶有入口和出口的模塊,這樣一類模塊組成一個模塊的結(jié)構(gòu),SOS通過這樣的一個結(jié)構(gòu)來維護(hù)模塊性。模塊之間有兩種入口機(jī)制來相互流通。第一種是通過內(nèi)核的調(diào)度表,另一種是通過被模塊注冊的對方使用的函數(shù)。
模塊的消息處理是通過模塊的一個特定的函數(shù)來處理的,這個消息處理函數(shù)有兩個參數(shù),一個是正被分發(fā)的消息本身,一個是模塊的狀態(tài)。這兩個參數(shù)都是一個結(jié)構(gòu)體。所有模塊的消息處理函數(shù)都必須依照SOS的內(nèi)核定義,實(shí)現(xiàn)兩個方法:init和final。Init消息處理函數(shù)的作用是初始化模塊的初始狀態(tài),初始化定時器,初始化一些注冊函數(shù)以及一些訂閱的函數(shù)。Final消息處理函數(shù)的作用是程序退出時釋放資源,包括內(nèi)存,定時器,被注冊過的函數(shù)指針。模塊的消息處理函數(shù)還需要處理一些特定的消息,比如定時器的觸發(fā),傳感器讀數(shù)據(jù),以及從別的模塊或者別的傳感器傳來的包含數(shù)據(jù)的消息。SOS里的消息是異步的,這點(diǎn)類似TinyOs。SOS的內(nèi)核調(diào)度表會從優(yōu)先級隊(duì)列里,依次取出消息并將此消息發(fā)送給其對應(yīng)的目的模塊的消息處理函數(shù)。模塊內(nèi)部的直接函數(shù)是被用來做一些需要同步處理的操作的。這些內(nèi)部函數(shù)需要注冊和訂閱才能使用,模塊的狀態(tài)信息保存在內(nèi)存的block塊里,模塊的地址是可再定位地址的,程序的狀態(tài)是由SOS內(nèi)核管理的,內(nèi)部函數(shù)的位置是通過一個注冊過程確定的,而消息處理函數(shù)則是出于可以執(zhí)行的二進(jìn)制的一段連續(xù)的塊里。
2.1.2 模塊交互
模塊之間的交互是通過消息機(jī)制,調(diào)用被模塊注冊的函數(shù),調(diào)用ker_*system(API)訪問內(nèi)核實(shí)現(xiàn)的。關(guān)于這些交互的方法的描述見表2。消息本身是靈活變化的,并且傳遞比較緩慢,所以SOS提供了一些直接的調(diào)用方法,可以被模塊注冊使用,這些調(diào)用方法可以通過調(diào)度表為模塊提供反應(yīng)時間短的聯(lián)系。
函數(shù)的注冊和訂閱是一種SOS提供的機(jī)制,是內(nèi)核跟模塊之間相互交互的紐帶。一個模塊注冊了內(nèi)核的函數(shù)以后,當(dāng)它的鏡像文件加載的時候就會通知內(nèi)核它處于鏡像文件的位置。注冊是通過系統(tǒng)調(diào)用ker register fn實(shí)現(xiàn)的,關(guān)于它們的一些信息可以見表3。函數(shù)控制塊(Function Control block)用來儲存關(guān)于注冊函數(shù)的一些關(guān)鍵字信息,通過成對的函數(shù)id和模塊id來進(jìn)行索引。
函數(shù)控制塊(FCB)有一個有效標(biāo)志位,訂閱者的計(jì)數(shù)器,和原型的信息。原型信息既包括了基本的類型信息而且還記錄是否一個參數(shù)包含了動態(tài)內(nèi)存,是不是可能更換所有者。舉個例子,比如原型信息是{'c','x','v','1'},這就表示函數(shù)會返回一個字符'c',但是需要一個參數(shù)'1',并且這個參數(shù)的指針指向了動態(tài)內(nèi)存分配的'x'。當(dāng)一個注冊函數(shù)被卸載或者刪除的時候,原型信息會被SOS的內(nèi)核使用到。
Ker_get_handle這個系統(tǒng)調(diào)用是用來注冊一個函數(shù)的,它通過模塊id和函數(shù)id在FCB尋找函數(shù)的位置,如果查找成功的話,內(nèi)核會返回一個指向這個被注冊了的函數(shù)的函數(shù)指針。訂閱者就可以通過引用這個函數(shù)指針來訪問它了。當(dāng)這個函數(shù)有變化的時候,內(nèi)核只需要讓函數(shù)在FCB里的函數(shù)指針指向一個新的地址,而不需要去更新或者改變訂閱者的模塊的代碼。
模塊可以通過一個jump表,訪問內(nèi)核的函數(shù)。有了這個jump表,模塊就可以和內(nèi)核保持相互獨(dú)立了,而不需要依賴于內(nèi)核。當(dāng)內(nèi)核需要升級的時候,只要jump的結(jié)構(gòu)不變化的前提下,只需要改變內(nèi)核的代碼,而不需要重新編譯模塊的代碼。
2.1.3 模塊的插入和刪除
通過上述的描述,可以看到,向一個傳感器節(jié)點(diǎn)上加載模塊是可行的。并且模塊的結(jié)構(gòu)是統(tǒng)一,被加載的是模塊編譯后生成的鏡像文件。
模塊的插入,是通過分發(fā)協(xié)議(distribution protocol)偵聽新的模塊在網(wǎng)絡(luò)中發(fā)送的廣播來初始化的。當(dāng)分發(fā)協(xié)議發(fā)現(xiàn)網(wǎng)絡(luò)中有新的模塊發(fā)送了廣播,它會先檢查是否這個新的模塊相對原來的節(jié)點(diǎn)上的模塊鏡像有升級,然后檢查是否節(jié)點(diǎn)上有足夠的內(nèi)存空間來儲存新的模塊。如果這兩個條件都成立,就開始下載這個模塊的鏡像文件,并檢查模塊的包頭里的元數(shù)據(jù)。元數(shù)據(jù)包含了模塊的唯一的身份信息,模塊所需要的內(nèi)存空間,以及版本信息用以區(qū)別跟別的版本的模塊。SOS的內(nèi)核如果發(fā)現(xiàn)不能為模塊分配足夠的內(nèi)存,會立刻取消模塊的插入。
代碼連接器(linker script)可以在鏡像文件的確定的位置為模塊放置處理函數(shù),當(dāng)模塊進(jìn)行插入的時候可以進(jìn)行簡單的鏈接。當(dāng)模塊進(jìn)行插入的時候,通過元數(shù)據(jù)的唯一的身份標(biāo)志,內(nèi)核的數(shù)據(jù)結(jié)構(gòu)就產(chǎn)生了。模塊的標(biāo)識以及模塊的狀態(tài)通過一個指向動態(tài)內(nèi)存的指針保存。最后,內(nèi)核通過調(diào)度表調(diào)用模塊的處理函數(shù)并初始化消息機(jī)制,整個過程就順利完成了。
模塊的刪除是通過模塊發(fā)送一個final的消息觸發(fā)內(nèi)核開始進(jìn)行的。這個消息通知內(nèi)核釋放模塊持有的資源。Final消息之后,內(nèi)核還要運(yùn)行垃圾回收機(jī)制,將屬于這個模塊的定時器資源,傳感器資源,內(nèi)存資源都釋放。
2.2 動態(tài)內(nèi)存
出于可靠性以及資源管理的原因,無線傳感網(wǎng)絡(luò)嵌入式系統(tǒng)一般不支持動態(tài)內(nèi)存。但是不幸的是,靜態(tài)內(nèi)存會導(dǎo)致存在大量的垃圾內(nèi)存碎片,可能對公共任務(wù)產(chǎn)生復(fù)雜的語義。SOS里的動態(tài)內(nèi)存就解決了這些問題,而且消除了模塊加載過程里本來需要對靜態(tài)內(nèi)存的依賴。
SOS有很多動態(tài)內(nèi)存的注解,使得可以簡單方便的調(diào)試。動態(tài)內(nèi)存分配了占有三個基本塊大小的內(nèi)存空間。大多數(shù)內(nèi)存分配塊,比如消息頭,都是占用了最小的內(nèi)存空間。但是一些應(yīng)用需要移動很大的連續(xù)的內(nèi)存空間,比如模塊的插入。一個未使用內(nèi)存塊的鏈表,為每個內(nèi)存塊大小的存儲大小都提供了一個時間常量,減少了對動態(tài)內(nèi)存的過度使用。
隊(duì)列以及數(shù)據(jù)結(jié)構(gòu)在SOS運(yùn)行的時候會動態(tài)的增加或者減少。通過動態(tài)內(nèi)存的使用和釋放,形成了一個系統(tǒng)。這個系統(tǒng)可以有效的對臨時的未使用內(nèi)存再使用,并且在特定的情況下可以調(diào)節(jié)內(nèi)存分配問題。動態(tài)內(nèi)存自身還設(shè)置了分配的限度,這個是很重要的,如果沒有限度的話,當(dāng)運(yùn)行在實(shí)際節(jié)點(diǎn)上的時候,動態(tài)內(nèi)存將會被全部申請掉。
3 結(jié)論
SOS通過應(yīng)用的發(fā)展和系統(tǒng)的配置維護(hù)了模塊性,具有高級的支持一般操作系統(tǒng)語義的內(nèi)核接口。SOS體系結(jié)構(gòu)的設(shè)計(jì)也反映了這些想法和特點(diǎn)。內(nèi)核的消息傳遞機(jī)制和動態(tài)內(nèi)存分配機(jī)制使得模塊的鏡像文件之間可以相互獨(dú)立的進(jìn)行交互。為了提供系統(tǒng)性能和提供編程的接口,SOS系統(tǒng)的模塊之間是通過函數(shù)調(diào)用來進(jìn)行交互。SOS的動態(tài)性的實(shí)質(zhì)是限制靜態(tài)安全分析,為了達(dá)到這個目的,SOS提供了在運(yùn)行時檢查函數(shù)調(diào)用的機(jī)制以維持系統(tǒng)的整體性。除此之外,SOS系統(tǒng)內(nèi)核還提供了垃圾回收機(jī)制。因此,對開發(fā)者來說,選擇SOS操作系統(tǒng)還是選擇別的操作系統(tǒng),最重要的一點(diǎn)是要考慮到系統(tǒng)的動態(tài)性或者靜態(tài)性的利弊。
SOS是一個年輕的工程,還處在一個積極發(fā)展的狀態(tài),還存在許多的挑戰(zhàn)。其中一個大的挑戰(zhàn)就是發(fā)展有效的技術(shù)來保護(hù)錯誤的模塊操作以保持系統(tǒng)的一致性。雖然子函數(shù)系統(tǒng)可以進(jìn)行bug追蹤并且有統(tǒng)一的函數(shù)入口,但是由于缺少內(nèi)存的保護(hù)措施,還是有可能導(dǎo)致系統(tǒng)會出現(xiàn)癱瘓。將模塊與內(nèi)核相分離的方法還在進(jìn)行深入的研究。SOS系統(tǒng)里的操作是基于相互協(xié)作的概念進(jìn)行的,所以如果某個操作失誤可能導(dǎo)致CPU被全部占用。但是總體來說,SOS從新的技術(shù)里獲得進(jìn)步,并且一直在優(yōu)化中,提高系統(tǒng)的性能以及模塊系統(tǒng)的使用。
參考文獻(xiàn):
[1] http://nesl.ee.ucla.edu/projects/sos/[EB/OL].
[2] Angeles L,Han C C,Kumar R,et al.A Dynamic Operating System for Sensor Nodes[D].University of California.
[3] 孫利民.無線傳感器網(wǎng)絡(luò)[M].北京:清華大學(xué)出版社,2005.
[4] 唐劍,史浩山,韓忠祥.無線傳感器網(wǎng)絡(luò)中的目標(biāo)跟蹤算法[J].空軍工程大學(xué)學(xué)報(bào):自然科學(xué)版,2006(5).