歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> TinyOS之Blink

TinyOS之Blink

日期:2017/3/1 10:04:06   编辑:Linux編程

對於TinyOS的I/O分析最好的一個分析例子就是apps/Blink。控制Led閃爍的接口Leds來自於模塊LedsC。該模塊(LedsC)位於Tos/System/LedsC.nc文件中定義。實際上Leds接口的實現是在同目錄下的LedsP.nc文件中完成的。而從開始到這個階段都還完全沒有涉及到底層I/O的指定。其實從LedsC.nc和LedsP.nc文件所在的目錄(System)看,也很容易理解:這裡的接口實現也只是單純的通過系統調用完成的,和底層的硬件I/O是完全隔離的。那麼下面我們來看看,底層的I/O是在哪兒指定的呢?

在文件Leds.nc中可以看到模塊PlatformLedsC的引入,該模塊提供了接口les0、led1、led2(實際上均為GeneralIO接口的別名)。該模塊(PlatformLedsC)位於Tos/Platforms/Telosa/PlatformLedsC.nc中(筆者的應用平台是tmote,至於為什麼該文件在telosa平台目錄下,這個要看makefile才能講的清楚了)。而在模塊PlatformLedsC中提供的接口les0、led1、led2(實際上均為GeneralIO接口的別名)來自於 模塊Led0Impl、 Led1Impl、 Led2Impl(模塊Msp430GpioC()的別名)。模塊Msp430GpioC()在tos/chips/msp430/pins/Msp430GpioC.nc中定義實現。本來以為這裡應該是定義了最底層的I/O指定,實際上這裡也只是中間的一步而已。在該文件中很容易發現,Msp430GpioC()模塊提供的接口是通過接口HplMsp430GeneralIO來實現的。那現在的問題是接口HplMsp430GeneralIO又是由誰具體來實現的呢?

要解決這個問題我們還要回到文件Tos/Platforms/Telosa/PlatformLedsC.nc中,在這裡引入了模塊HplMsp430GeneralIOC,同時指定接口來自這個模塊。模塊HplMsp430GeneralIOC實際位於tos/chips/msp430/pins/HplMsp430GeneralIOC.nc,但實際的接口提供者是同目錄下的HplMsp430GeneralIOP模塊。這個模塊可以算是底層I/O指定的終極模塊文件了。到這裡我們的底層I/O挖掘之旅就算是完整的結束啦。

總結下,I/O的調用層次:apps/Blink -> Tos/System/LedsC.nc -> Tos/Platforms/Telosa/PlatformLedsC.nc -> tos/chips/msp430/pins/Msp430GpioC.nc -> tos/chips/msp430/pins/HplMsp430GeneralIOC.nc

ps:在本范例中分析的tinyOS源碼版本為2.1.1

Copyright © Linux教程網 All Rights Reserved