王 博,辛云宏
(陜西師范大學物理學與信息技術學院,陜西西安 710062)
無線傳感器網絡(Wireless Sensor Network,WSN)由部署在監測區域內大量廉價微型傳感器節點組成,通過無線通信方式形成的一個網絡系統,其目的是協作的感知、采集和處理網絡覆蓋區域中感知對象的信息[1-2],并發送給觀察者,被譽為21世紀最具影響技術之一。傳感器節點通常是一個微型的資源受限的嵌入式系統,因此要求一個小型高效的操作系統管理組織硬件并完成軟件功能。
由于無線傳感器網絡節點的資源十分有限,傳統的嵌入式操作系統難以正常有效地運行和工作,特別對能量和內存的需求矛盾比較突出。因此,需要一種全新的嵌入式操作系統來滿足無線傳感器節點的基本需求。近年來,科研機構不斷開發出具有多種功能的WSN操作系統。大多數操作系統都使用事件驅動的編程模型,典型的有 TinyOS[3]、Contiki[4]、EYES -OS[5]、SOS[6]等。
TinyOS操作系統是美國加州大學伯克利分校的研究人員針對無線傳感器網絡設計的開源嵌入式操作系統,是目前無線傳感器網絡采用的主流操作系統。TinyOS最初使用匯編和C語言編寫,但經研究人員進一步的研究及使用后發現,C語言并不能有效和方便地支持無線傳感器網絡應用程序的開發。因而在經過研究和設計,并在對C語言進行了一定擴展的基礎上,提出了支持組件化編程的nesC語言,該語言可以把組件化、模塊化思想和基于事件驅動的執行模型結合起來,具有一些C語言無法比擬的優點。nesC語言提出后,TinyOS操作系統和基于TinyOS操作系統的應用程序全部使用nesC語言編寫。
TinyOS是美國加州大學伯克利分校針對無線傳感器網絡開發的嵌入式操作系統,核心程序很小,對硬件要求很低,它的事件驅動機制、主動消息機制、組件化結構等特點使其在研究中得到廣泛應用。目前,TinyOS支持的平臺主要集中在Atmel公司的AVR系列和TI公司的MSP430系列單片機。
TinyOS體現結構如圖1所示,其核心部分為TinyOS的硬件抽象3層結構。TinyOS的硬件抽象層使系統的軟件和硬件完全獨立,從而使系統的設備驅動程序與硬件無關,大大提高了系統的可移植性。TinyOS具有3層硬件抽象結構,并明確規定了每一層的功能,每一層都依賴于下一層提供的接口,這使得TinyOS的移植比較方便。

圖1 TinyOS體系結構圖
最底層是硬件描述層(Hardware Presentation Layer,HPL),該層提供硬件層和軟件層的直接接口,通過調用函數的方法來屏蔽復雜的硬件層,不僅實現了硬件層和軟件層的內部通信,而且為系統其他部分提供了使用的接口。
中間層是硬件適用層(Hardware AdaptationLayer,HAL),位于HPL上層,該層對硬件層的定時器、模數轉換器、存儲器等模塊原型進行較高層的抽象,可以更直接更方便地為上層軟件層提供可定制的操作接口。
最頂層是硬件獨立層(Hardware Independent Layer,HIL),位于HAL上層,該層提供抽象的獨立硬件層接口,通過隱藏硬件層來簡化上層應用軟件的編寫,其功能類似于Windows操作系統下的API。
TinyOS的3層硬件抽象結構有很大的靈活性,具體的應用程序可以將HAL和HIL組件結合使用,以提高代碼執行效率和系統的可移植性。
在TinyOS的總體框架中,物理層硬件層為框架的最底層,在該層中,傳感器、射頻收發器以及時鐘等硬件均能觸發事件(event)發生,交由上層組件處理;軟件層中相對下層的組件也能出發事件并交由上層處理,而上層會發出命令(command)交下層處理。為協調各組件間任務的有序處理,需要操作系統采取一定的調度模式。
TinyOS采用的是事件驅動的兩級調度[7]:任務(task)和硬件事件處理句柄(Hardware Event Handlers)。TinyOS使用兩種機制支持任務,task和post。task聲明必須為無參數的函數聲明,執行中的任務都具有原子操作性,任務完成前彼此之間不能被搶占。硬件事件處理句柄被執行去響應硬件中斷,可以搶占任務的運行和其他硬件事件處理句柄。TinyOS的任務調度隊列只采用最簡單的FIFO算法,內核使用一個循環隊列來管理任務列表,默認任務列表大小為8。這個任務隊列實際上是一個函數指針的數組,提交一個任務即是向隊列里插入一個函數指針。任務提交(post)到FIFO隊列中等待,當任務隊列頭索引號等于尾索引號時,表明任務隊列為空,系統進入休眠狀態并等待,直到新的事件發生。如果新事件向隊列中提交了任務,則處理器返回執行狀態,TinyOS規定當且僅當任務已經推入隊列且沒有被執行時post表達式才返回fail,否則將繼續休眠。當被事件觸發后,TinyOS將中發出信號的事件關聯的所有任務將被迅速處理,當這個時間和所有任務被處理完成后,未被使用的CPU將再次被置于睡眠狀態而不是積極尋找下一個活躍事件,從而大幅降低了功耗。
TinyOS的編譯系統采用 GNU Make,首先將TinyOS應用程序預編譯,形成一個“*.C”文件,然后將這個文件傳遞給與硬件平臺相對應的編譯器。TinyOS的編譯系統放于support/make文件夾中,包含各個平臺的配置文件“*.target”和在這個平臺上建立應用程序的“*.rules”文件。所以TinyOS的編譯系統可以分為兩個部分:使用nesC編譯的公用部分和針對具體平臺的部分。目前TinyOS支持AVR的Mica系列節點,還有基于MSP430芯片的Telos系列及基于PXA27芯片的 Imote,而對于 CC2430目前還在開發中。假設目標平臺是MICA,其編譯過程如圖2所示。

圖2 TinyOS默認的編譯鏈
具體進行編譯操作時,編譯文件根據“TOSMAKE_PATH”變量中所列的路徑搜索“*.target”文件。“*.target”文件通常設置一些平臺相關變量和提供編譯平臺的名稱,并通過調用“TOSMake_include_platform”指向具體的“*.rules”文件。“*.rules”文件由平臺所配備的微處理器決定,因此通常幾個平臺共用一個“*.rules”文件。如果以命令行的形式給定一個虛擬平臺,編譯系統會自動尋找“*.extra”文件。
CC2430單片機是TI公司生產的一款專用于IEEE 802.15.4和ZigBee協議通信的片上系統解決方案[8]。它延用了以往CC2420芯片的架構,在單個芯片上整合了ZigBee射頻前端、內存和微控制器。它使用1個8位MCU(8051),具有128 kB可編程閃存和8 kB的RAM,還包含模擬數字轉換器(ADC)、幾個定時器(Timer)、AES128協同處理器、看門狗定時器(Watchdog Timer)、32 kHz晶振的休眠模式定時器、通電復位電路(Power on Reset)、掉電檢測電路(Brown out Detection),以及21個可編程I/O引腳。CC2430芯片采0.18 μmCMOS工藝生產;在接收和發射模式下,電流損耗分別低于27 mA或25 mA。CC2430非常適合那些要求能耗非常低的應用,因為它具有休眠模式以及轉換到主動模式的超短時間的特性。而無線傳感器網絡研究的一個核心問題就是節能,因為傳感器節點經常需要布置在環境惡劣的無人區,所以能耗問題就成為一個關鍵問題。由于CC2430的低能耗特性,使其經常作為傳感器節點的硬件平臺。
TinyOS核心代碼經nesC預編譯后形成的C文件可以被GCC理解編譯。而GCC適用的平臺包括telos系列,mica系列和intelmote2系列。但是一些平臺如Motorola HCS08,Intel MCS51則不適用于GCC編譯。所以將TinyOS移植到CC2430上的關鍵問題是,如何使GCC支持MCS-51系列的交叉編譯及支持CC2430硬件組件的編寫。
在Windows和Linux兩大主要平臺上有許多8051編譯器,其中使用最廣泛并且經常進行更新的有2種:KEIL和Small Device C Complier(SDCC)。由于SDCC是一個新興的開源項目,因此在移植過程中經常會出現許多問題,使一些模塊無法正常工作。而且在調試中,SDCC只是簡單地駐留在0地址,當單步執行代碼時也沒有任何調試信息。相比于SDCC,KEIL提供了一套良好的開發調試環境,因此,最終選用KEIL開發工具進行TinyOS的移植工作。
具體流程如下:
(1)根據TinyOS上層組件接口的要求,用nesC語言編寫硬件表達層和硬件抽象層文件[9]。
(2)使用TinyOS的NCC編譯器將編寫的應用程序編譯成app.preMangle.c文件。
(3)將app.preMangle.c文件通過perl語言編寫的腳本將其原語法轉換為CC2430開發環境Keil支持的語法,生成app.c。
(4)利用KEIL開發工具將app.c編譯、連接,生成app.hex,再通過 SmartRF04 Flash Programmer下載到目標板。
3.3.1 組件編寫
由于TinyOS的組件模式是基于不同抽象層組件的系統,當移植到新的平臺時,可以通過添加新的底層硬件的抽象并使用已有的上層組件。為實現CC2430的基本功能,需要對各功能模塊進行移植,文中移植的功能包括Timer定時器,UART通信,AD采樣,射頻通信等。具體模塊移植方法如下:
(1)通用I/O口。首先要對CC2430的各個接口進行定義,CC2430共有21個可編程的I/O接口,通過設置一組寄存器來控制來控制這些接口作為通用I/O口或者是用作外部電路。在HplCC2430GeneralIOC文件及相關頭文件中對各個引腳進行定義。由于需要用到CC2430的UART功能,ADC功能,射頻功能以及Timer定時器功能,所以需要對相應的寄存器定義。
(2)UART通信。由于需要向上位機發送數據,所以需要使用CC2430的UART通信功能。CC2430有兩個UART接口,分別為 UART0和 UART1。分別對應CC2430兩個I/O接口。選用的UART1,RX和TX對應P0_4接口和P0_5接口,通過SerialByteComm接口實現該功能。在HalCC2430SimpleUartP文件中實現SerialByte-Comm接口,該接口有兩個命令:get和put,分別用來對U1BUF寄存器進行讀寫。在HplCC2430SimpleUartP文件中對CC2430芯片串口通信所需要的配置的寄存器各位的值以及波特率等硬件信息進行設置。
在PlatformSerialC文件中對這些接口進行一個封裝,并對SerialByteComm接口的put操作作一個判斷,如果UART1的8位寄存器U1CSR的最低位為0,說明串口處于空閑狀態,這是向串口發送數據,否則串口處于繁忙狀態,不進行任何操作。
通過這3層組件對SerialByteComm接口的抽象,實現向串口發送數據的功能。
(3)數模轉換。通過傳感器感器采集到的模擬信號,需要通過AD轉換為數字信號后才能進行下一步的處理。CC2430的ADC有最高14 bit的轉換精度,可以采用內部電壓或者外部電壓。ADCL和ADCH兩個8位寄存器存放采樣到的數據,其中ADCL的有效位是2到7位,所以有效數據是14 bit。通過對READ接口的抽象實現該組件。在adc.h頭文件中配置CC2430 的寄存器 ADCCON1、ADCCON2、ADCCON3,可以設置轉換精度以及采樣到的數據傳輸到芯片的管腳地址。
可以看到這里定義一組宏,對應了寄存器需要的值。這里使用CC2430芯片的單次采樣,由于節點使用了外部傳感器這里將ADC的參考電壓設為外部電壓,精度設為14 bit,將P0_4引腳的電壓值數模轉換后傳入芯片處理器。
(4)定時器。CC2430有一個16位定時器Timer1和兩個8位定時器Timer3和Timer4,以及一個MAC定時器 Timer2。這里完成了 Timer1的移植。在HplCC2430Timer1P文件中定制相關配置,通過HplCC2430Timer16接口實現基本的計時功能。
(5)射頻模塊。傳感器節點采集到數據后需要通過無線射頻的方式發送出去,這就需要使用CC2430的射頻功能。TinyOS通過SimpleMac接口實現該功能,SimpleMac接口可以實現簡單的數據收發功能。SimpleMac接口非常適合802.15.4協議,缺點是不支持數據重傳和路由功能。在文件HPLCC2430RadioP文件及相關中對CC2430的的寄存器進行讀寫,HALCC2430RadioP組建對它進行進一步的抽象。
3.3.2 編譯過程修改
為使TinyOS的編譯系統能夠找到目標平臺CC2430,我們需要修改它的編譯環境。基于TinyOS開源代碼的約定,除核心程序外的其余項目開發放在contrib文件中。因此將代碼放于cygwin/opt/tinyos-2.x-contrib/ncepu中。這里需要在此文件夾中添加CC2430的編譯路徑以及具體的編譯方法。
(1)在ncepu文件夾下增加環境定制文件“env”,定制編譯路徑,使編譯系統能夠尋找到編譯平臺。修改后的編譯工具鏈如圖3所示。程序的編譯結果如圖4所示。
(2)在ncepu/support/make文件下增加“cc2430em.target”文件。


將編譯好的app.hex下載到CC2430上,程序即可運行。
為檢驗TinyOS在CC2430上的運行效果,設計了一個簡單無線傳感器數據采集網絡。傳感器節點的檢測功能較為簡單,僅完成環境的亮度測量。
節點的硬件框圖如圖5所示。節點上的亮度傳感器為光敏電阻,環境亮度通過該器件以及信號調理電路轉換為電壓信號,該信號被傳輸到CC2430的A/D轉換器輸入端,經A/D轉換變為數字信號,該數字信號即為采集的亮度數據。

圖5 傳感器節點硬件框圖
傳感器節點的軟件流程如圖6所示。其大體工作過程為:接通電源后,節點自動尋找通信范圍的協調器,如果找到就建立網絡連接,當按鈕按下時觸發ADC采樣,傳感器節點開始采集數據并向協調器發送數據。當節點接受到關閉信號時,進入休眠狀態并停止向協調器發送數據。

圖6 節點軟件設計流程圖
協調器負責無線傳感器網絡的組網、路由以及數據收集等功能。同時,協調器也是網路與PC機之間連接的一個橋梁,通過協調器可以監控節點探測到的數據并可以對傳感器節點進行控制。
協調器設備打開后,會自動接收通信范圍內的節點信號,這個信號包括節點采集到的數據以及節點本身的地址。當協調器接收到信號時,對該信號進行判斷,如果該信號已經存在于網絡列表,則直接接收節點的數據。如果這個信號不存在于網絡列表當中,則將該節點加入網絡列表。然后將網絡列表中的節點發送來的數據都通過串口傳輸至PC機。當協調器接收到PC發送的指令后,根據指令內容將指令信號發送給相應的傳感器節點。由此,通過協調器可以實現PC機對傳感器節點的監控和操作。軟件的設計流程如圖7所示。

圖7 協調器的設計流程圖
各節點發送到協調器的測量數據為一個16位的正整數值,協調器每接收到一個測量數據,即通過RS232接口電路將該數據傳輸至PC機,協調器的硬件框圖如圖8所示。

圖8 協調器硬件框圖
節點使用無線射頻技術(RFID)與協調器進行通信。隨著技術的發展,RFID技術已經成為人們日常生活中一個重要工具。但RFID技術也存在一些技術問題需要解決,其中標簽防碰撞問題(Anti-collision)是RFID技術的關鍵問題之一。當多個節點同時向協調器發送信號時,要防止信號的碰撞。為解決這一問題,有空分多址、頻分多址、碼分多址和時分多址4種方法。文中選用基于CSMA/CA協議的無線射頻防碰撞算法。
CSMA算法是傳統TDMA(Time Division Multiple Access,動態時分多址)的調度分配算法ALOHA的改進。傳統的ALOHA算法在標簽視圖發送數據是,并不考慮信道當前的忙閑狀態,完全隨機接入。可以看到。這種算法有很大的盲目性,當存在大量節點或信息量過大時,會使信道重疊現象加劇,數據碰撞頻繁出現,傳輸性能嚴重下降。為解決這一問題,提出了在發送數據前,對信道進行偵聽,這就是廣泛使用的CSMA算法。CSMA算法的基本思路是:
(1)標簽產生新的數據,等待發送。
(2)偵聽信道是否空閑,若空閑則發送數據,發送完成后返回第一步;若信道正忙則產生一個隨機數,進入延時操作。假定隨機數的取值范圍為min~max之間,初始化時,值為min,每次重傳,隨機數逐漸增大,當達到max值時保持不變。沒成功傳輸之后,回復到初始值min。
(3)延時操作結束后,返回步驟(2)。
由于無線網絡的特殊性,很難確實地偵聽是否有碰撞發生,所以采用帶沖突避免的載波偵聽多路訪問即CSMA/CA算法。標簽發送數據前,先發送一段請求發送幀RTS(Request to Send)給目標端,等待目標端回應的清除發送幀CTS(Clear to Send)后,才開始傳送。通過RTS與CTS的握手(handshake)避免發送數據時發生碰撞。
協調器與節點上電后,即可實現自動組網。組網成功后,節點可將采樣到的數據發送給協調器,協調器接收信號,一方面會觸發自身的LED燈閃爍,同時通過RS232接口電路將采集到的數據通過串口發送給PC機。實驗結果如圖9所示。

圖9 無線通信實驗結果圖
每個節點與協調器上均設置有控制按鈕,用于通信的驗證與控制。在節點上,每按一次按鈕采集一個數據,同時將該數據發送到協調器。這些過程,通過實驗得到了有效的驗證。在PC機上,通過串口助手軟件來觀察接收的數據。其中,通信的波特率設置為9600 bit·s-1,PC機屏幕上顯示信息如圖 10所示。其中Device表示節點ID,最后的數值是經過處理的節點的探測值。這里使用兩個節點均置于室內環境,其中一個用不透光的黑膠帶遮蓋住傳感器的光敏元件。可以看到,協調器共接收到了兩個節點的信號,兩個信號的值均比較平穩,其中一個節點的采樣值明顯大于另一個,與實際情況相符。實驗證明系統各項功能運行良好,網絡通信穩定。

圖10 PC機顯示的亮度信息
在對TinyOS操作系統詳細分析的基礎上,提出了TinyOS的移植方法以及具體實現過程,并將其移植于CC2430硬件平臺。其中移植的功能模塊包括UART通信、定時器和RF無線射頻通信等。實驗結果表明,移植后的TinyOS可以健壯地運行于CC2430平臺,并能可靠地實現傳感器之間的無線組網。該系統可作為一個原型,經進一步性能完善或部分功能擴充即可實現實際應用。
[1] DEBORAH E,DAVID C,KRIS P.Connecting the physical world with pervasive networks[J].IEEE Pervasive Computing,2002,12(1):59 -69.
[2] 孫利民,李建中,陳渝,等.無線傳感器網絡[M].北京:清華大學出版社,2005.
[3] 郭慶磊.基于SOS內核的無線傳感器網絡節點操作系統設計:[D].合肥:中國科學技術大學,2008.
[4] 孫毅,王雷,杜曉通.基于TinyOS-2.x的無線傳感器網絡數據包傳輸機制的研究[J].電子器件,2007,30(5):1954-1958.
[5] 陳德富,陶正蘇,周迪.基于TinyOS的CC2430無限數據收發設計[J].電子設計工程,2010,18(3):94-98.
[6] 徐敬懂,賴錫盛.TinyOS 2.0在 CC2430上的移植[J].計算機工程,2011,37(2):256 -260.
[7] 李偉躍.基于CC2430的無線傳感器網絡中協調器的設計[J].電子設計工程,2011,19(20):133-135.