STM32和CC2520的TinyOS移植與驅動分析
摘要:TinyOS系統(tǒng)以其組件結構模型、事件驅動、并發(fā)型等優(yōu)點成為目前最受關注的無線傳感器網絡操作系統(tǒng)。但TinyOS不支持STM32和CC2 520芯片。因此在分析TinyOS基本原理、NesC編程語言實現(xiàn)機制及其編譯過程的基礎上,介紹了基于STM32和CC2520的TinyOS移植方法,完成了STM32的I/O組件、Timer組件、USART組件、SPI組件和CC2520芯片驅動的移植。在實現(xiàn)CC2520的基本通信功能基礎上,實現(xiàn)簡單MAC協(xié)議。最后測試了各組件的移植效果。實驗測試結果表明,節(jié)點可以穩(wěn)定可靠地通信。
關鍵詞:無線傳感器網絡;TinyOS;STM32;CC2520;移植;驅動
引言
無線傳感器網絡(Wireless Sensor Network,WSN)是一種應用相關的網絡。需要對某些操作系統(tǒng)進行移植。本文采用TinyOS作為軟件平臺,成功移植了Radio、Timer、USART、SPI和General I/O等5個底層模塊。測試結果表明,移植的5個底層模塊能夠正常工作。
1 MCU和無線模塊介紹
STM32系列按性能分成兩個系列:STM32F103“增強型”系列和STM32F101“基本型”系列,時鐘頻率達到72 MHz,是同類產品中性能最高的產品。本項目采用芯片STM32F103RBT6。CC2520選用第二代ZigBee/IEEE 802.15.4無線電頻率(RF)收發(fā)器。
2 TinyOS操作系統(tǒng)和NesC分析
2.1 NesC介紹
NesC是專門為網絡嵌入式系統(tǒng)設計的編程語言,是對C的擴展,它基于TinyOS的結構化概念和執(zhí)行模型而設計。主要編程模式包括:事件驅動、彈性并發(fā)型和面向組件程序設計等。NesC編譯器進行數(shù)據競爭檢測(提高可靠性)、積極的函數(shù)內聯(lián)(降低資源消耗)等整體程序分析,簡化了應用程序的開發(fā)。
2.2 TinyOS分析
TinyOS(Tiny Micro Threading Operating System)是由加州大學伯克利分校開發(fā)的開源的傳感器網絡操作系統(tǒng),其本身是由NesC語言編寫。TinyOS的組件模型體系結構如圖1所示。上層組件對下層組件發(fā)命令,下層組件向上層組件發(fā)信號通知事件,最底層的硬件抽象組件直接和硬件打交道。
TinyOS的硬件抽象層通常是3級抽象結構,稱作HAA(Hardware Abstraction Architecture)。整個硬件抽象層分為硬件表示層(HPL)、硬件適配層(HAL)和硬件接口層(HIL)。
硬件表示層(Hardware Presentation Layer,HPL)是對硬件平臺的功能性描述,主要通過存儲單元和I/O映射端口訪問硬件和通過硬件中斷來實現(xiàn)以下功能:能量管理、控制硬件、硬件中斷開閉、提供硬件中斷服務程序等。
在HPL上的是硬件適配層(Hardware Adaptation Layer,HAL),該層是整個硬件抽象層的核心,利用HPL提供的原始接口建立硬件描述資源,并通過狀態(tài)來反映硬件的使用情況以實現(xiàn)對硬件的仲裁控制,提高系統(tǒng)性能。
硬件抽象層的最高層是硬件接口層(Hardware Interface Layer,HIL),該層把HAL層提供的接口轉換成硬件獨立的接口,隱藏了平臺之間的差異,并向上層提供統(tǒng)一的硬件API接口。
3 基于STM32和CC2520平臺的TinyOS實現(xiàn)
由上文所述,將TinyOS移植到STM32核處理器和CC2520上的關鍵問題是硬件抽象層組件的定制和編譯器工具鏈的配置?;赥inyOS開源代碼的約定,主要修改代碼放置在/tos/chips/STM32和tos/platforms/STM32p103。
3. 1 修改芯片文件
每個芯片都通過多個接口或組件提供它所實現(xiàn)的功能,這些接口或組件組成芯片的驅動。將芯片的結構抽象文件放于tos/chips。如果芯片有子系統(tǒng)則建立子目錄,如:tos/chips/STM32/timer。需要改寫的TinyOS和MCU相關模塊如下所述。
3.1.1 STM32核處理器
為了同其他外圍設備的驅動分開,需要在MCU相關的文件中增加兩個定義;原子操作的開始和結束,在頭文件hardware.h中定義;低功耗工作模式,由組件MCUSleepC定義。具體可以參考其他MCU文件編寫。
TinyOS通過一些接口管理MCU的狀態(tài),決定MCU何時進入低功耗狀態(tài)。MCUSleepC組件向上層提供McuSleep和McuPowerState接口。TinyOS調度器在原子操作中調用McuSleep.sleep(),保證在進入低功耗狀態(tài)前處于開中斷狀態(tài)。在sleep狀態(tài),可以關閉一些高耗能的模塊,比如:高頻時鐘、PLL等。
評論