




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、TinyOS系統(tǒng)與nesC程序設(shè)計課內(nèi)實驗指導(dǎo)書一、 課內(nèi)實驗項目一覽表序號實驗項目學(xué)時類型每組人數(shù)基本教學(xué)要求1編程環(huán)境的建立221熟悉TinyOS安裝過程,了解系統(tǒng)環(huán)境2BlinkTinyOS編程的“Hello World”221通過Blink程序,理解TinyOS編程結(jié)構(gòu)3TinyOS任務(wù)及應(yīng)用舉例221通過實驗了解任務(wù)的建立、調(diào)度及其作用4節(jié)點間的無線通信221通過實驗了解和使用基本通信接口和組件5節(jié)點與PC的通信221了解數(shù)據(jù)包源和串口通信6傳感221了解節(jié)點如何從環(huán)境中采集數(shù)據(jù)并顯示在PC上 7存儲221了解TinyOS上永久數(shù)據(jù)存儲方法及應(yīng)用8多線程程序設(shè)計221了解線程工作原理
2、和實現(xiàn)方法二、詳細實驗指導(dǎo)書實驗一:編程環(huán)境建立一 實驗?zāi)康?、掌握Java基本開發(fā)環(huán)境(JDK)的安裝和配置方法。2、掌握cygwin程序的安裝,在建立windows下類似Unix環(huán)境。3、 掌握Linux基本命令及cygwin下安裝TinyOS的方法。二 實驗原理無三 實驗環(huán)境1、運行Windows的PC機,能夠連接Internet2、PC機配置要求:CPU最低CR 1GHz,建議P4 2.0以上內(nèi)存最低256M,建議512M以上硬盤容量10G以上,cygwin安裝盤符大于2 G操作系統(tǒng)Windows 2000 系列、Windows XP 系列四 實驗內(nèi)容和步驟1、 java jdk安裝首
3、先,我們安裝JAVA 開發(fā)工具JAVA JDK 1.6 官方下載地址:/javase/downloads/. 安裝過程只需下一步下一步便可,默認安裝路徑是C:Program FilesJava上圖是TinyOS 2.0.2 安裝時截取的JAVA JDK1.5的圖,只供參考。然后,我們需要設(shè)置電腦的環(huán)境變量,需要新建兩個環(huán)境變量,以便使用JDK具體過程如下:右擊我的電腦屬性高級環(huán)境變量先新建或編輯系統(tǒng)變量:變量名(N):JAVA_HOME 變量值(V):JDK安裝的路徑,其默認的路徑為:C:Program FilesJavajdk1.6.0_10變量名(N):
4、CLASSPATH變量值(V):.;%JAVA_HOME%libdt.jar;%JAVA_HOME%libtools.jar;%JAVA_HOME%bin;%JAVA_HOME%jrebin; 在系統(tǒng)變量(S)欄選中變量為Path的選項,點編輯在變量值(V)的末尾添加:;%JAVA_HOME%bin; ;%JAVA_HOME%jrebin;然后新建或編輯用戶變量:同樣再設(shè)置一個JAVA_HOME,變量值也一樣。在用戶變量的PATH中添加:;%JAVA_HOME%bin:$PATH;%JAVA_HOME%jrebin:$PATH;這樣,我們的環(huán)境變量已經(jīng)設(shè)置完畢了。我們可以編個JAVA小程序簡單
5、地測試一下:打開記事本,輸入下面這個小程序,另存為HelloWorld.java(注意擴展名是java,不是txt文本文件)。public class HelloWorld public static void main(String args) System.out.println(Hello, World!); 運行cmd,到HelloWorld.java所在目錄,執(zhí)行命令:javac HelloWorld.java javaHelloWorld如果能正確輸出Hello, World! 說明環(huán)境變量設(shè)置成功。2、 cygwin軟件平臺安裝我們需要安裝Cygwin這個軟件來虛擬Linux平臺
6、,運行TinyOS-2.X。下載地址1:. 下載地址2:rmatik.uni-freiburg.de/people/aslam/cygwin-files.zip安裝時,最好先將安裝包下載到本地,然后選擇Install from Local Directory安裝。緊接著需要設(shè)置安裝目錄,默認是C:cygwin然后是選擇下載的本地安裝包源文件的文件路徑安裝包策略選擇:“Keep”、“Prev”、“Curr”、“Exp”等等選項Keep, 意思就是說保持目前已經(jīng)安裝的版本不動,不替換你目前的版本。升級時比較方便。Prev,意思是說安裝上一個
7、版本。Curr,意思就是說把最新的版本下載下來安裝,第一次安裝時默認選項View按鈕是用來選擇顯示方式的在選擇安裝包時候,一般默認,點下一步即可。最后我們可以通過桌面上添加Cygwin的快捷方式或者運行安裝目錄下的cwgwin.bat文件,來運行該軟件平臺。第一次運行Cygwin會稍微慢點。Cygwin啟動界面如下圖:下面我們可以先來嘗試一些簡單的Linux命令:help: 幫助命令。例如 ls -help 。顯示ls命令使用說明。pwd:顯示所在路徑。rpm qa :查看已經(jīng)安裝的程序,剛安裝的Cygwin是沒有安裝任何系統(tǒng)的。 rpm ivh 文件名:rpm文件安裝。rpm ignoreo
8、s force或者rpm -ivh -force -ignoreos:忽略錯誤,安裝rpm文件-ignoreos選項是用于忽略cygwin的版本號rpm uvh 文件名:rpm文件升級安裝。cd:切換目錄 比如:cd /tmp 進入tmp文件。cp:cp -R Blink BlinkSingle:復(fù)制文件或目錄,復(fù)制Blink為BlinkSingle。ls:顯示當前目錄下的文件。whoami:顯示登陸Windows帳號uname a: 顯示版本信息echo $PATH: 顯示執(zhí)行程式的搜索路徑ps ax: 顯示process list ,顯示目前有哪些process 執(zhí)行ctrl-D或exit
9、 或logout:結(jié)束bash 視窗motelist 查詢當前設(shè)備,Yang:命令不可用3、 本地編譯器安裝當你給低功耗微控制器編譯代碼時,你需要可以產(chǎn)生適當?shù)拇a的編譯器。如果你使用mica系列無線傳感器節(jié)點,你需要的AVR工具;如果你使用的是telos系列節(jié)點,則需要的MSP430工具。先以AVR為例,在根目錄下創(chuàng)建文件夾avr,把下面所有rpm文件放在這個文件夾里。l avr-binutils-2.17tinyos-3.cygwin.i386.rpm :/dist-2.1.0/tools/windows/avr-binutils-2.17tinyo
10、s-3.cygwin.i386.rpml avr-gcc-4.1.2-1.cygwin.i386.rpm :/dist-2.1.0/tools/windows/avr-gcc-4.1.2-1.cygwin.i386.rpml avr-libc-1.4.7-1.cygwin.i386.rpm :/dist-2.1.0/tools/windows/avr-libc-1.4.7-1.cygwin.i386.rpml avarice-2.4-1.cygwin.i386.rpm :/d
11、ist-2.1.0/tools/windows/avarice-2.4-1.cygwin.i386.rpml avr-insight-6.3-1.cygwin.i386.rpm :/dist-2.1.0/tools/windows/avr-insight-6.3-1.cygwin.i386.rpml avrdude-tinyos-5.6cvs-1.cygwin.i386.rpm :/dist-2.1.0/tools/windows/avrdude-tinyos-5.6cvs-1.cygwin.i386.rpm用cd
12、命令進入該文件夾目錄,輸入:rpm -ivh -ignoreos rpmname.rpm 可以選擇安裝rpmname這個rpm包。如果碰到missing /bin/sh的錯誤信息,則rpm ivh -ignoreos -force -nodeps rpmname.rpm最簡單的方法是,同時安裝這個文件夾下所有的rpm包,輸入命令:$ cd /avr$ rpm -ivh -ignoreos -force -nodeps *.rpmMSP430工具包的安裝方法也是一樣的。其rpm包如下:l msp430tools-base-0.1-20050607.cygwin.i386.rpm :http:/w
13、/dist-2.0.0/tools/windows/msp430tools-base-0.1-20050607.cygwin.i386.rpml msp430tools-python-tools-1.0-1.cygwin.noarch.rpm :/dist-2.0.0/tools/windows/msp430tools-python-tools-1.0-1.cygwin.noarch.rpml msp430tools-binutils-2.16-20050607.cygwin.i386.rpm :http:/www.tinyos
14、.net/dist-2.0.0/tools/windows/msp430tools-binutils-2.16-20050607.cygwin.i386.rpml msp430tools-gcc-3.2.3-20050607.cygwin.i386.rpm :/dist-2.0.0/tools/windows/msp430tools-gcc-3.2.3-20050607.cygwin.i386.rpml msp430tools-libc-20080808-1.cygwin.i386.rpm :/dist-2.1.0
15、/tools/windows/msp430tools-libc-20080808-1.cygwin.i386.rpm在根目錄下新建的MSP430文件夾,將所有rpm下載后全部放到這里,運行:$ cd /msp430$ rpm -ivh -ignoreos -force -nodeps *.rpm安裝成功。(若提示安裝不了,可以先安裝第四步的TinyOS工具包再回頭安裝這里)。4、 TinyOS工具包安裝下載rpm包:l Nesc :/dist-2.1.0/tinyos/windows/nesc-1.3.0-1.cygwin.i386.rpml deput
16、y :/dist-2.1.0/tinyos/windows/tinyos-deputy-1.1-1.cygwin.i386.rpml tinyos-tools :/dist-2.1.0/tinyos/windows/tinyos-tools-1.3.0-1.cygwin.i386.rpm安裝方法同上面一樣。將rpm下載后全部放到一個根目錄下新建的tinyos_tools文件夾,運行:$ cd /tinyos_tools$ rpm -ivh -ignoreos *.rpm注:在win7或者是vista下安裝nesC時
17、可能會報錯如下:unpacking of archive failed on file /usr: cpio: chmod failed - Permission denied解決方法:運行cygwim的時候右鍵選擇 “以管理員身份運行”5、 TinyOS 2.x安裝下載rpm包:/dist-2.1.0/tinyos/windows/tinyos-2.1.0-2.cygwin.noarch.rpm安裝方法同上面一樣$ cd /tinyosrpm -ivh -ignoreos *.rpm安裝成功。6、 設(shè)置TinyOS2.x環(huán)境變量2011-11-27 下
18、午到此Environment VariableWindowsLinuxTOSROOT/opt/tinyos-2.xsame as in CygwinTOSDIR$TOSROOT/tossame as in CygwinCLASSPATHC:cygwinopttinyos-2.xsupportsdkjavatinyos.jar;.$TOSROOT/support/sdk/java/tinyos.jar:.MAKERULES$TOSROOT/support/make/Makerulessame as in CygwinPATH/opt/msp430/bin:/opt/jflashmm:$PATHs
19、ame as in Cygwin注:只有在使用msp430平臺時才有必要設(shè)置PATH變量用UltraEdit創(chuàng)建C:cygwinetcprofile.dtinyos.sh,輸入以下內(nèi)容:(使用UNIX換行符-LF保存,這一步很關(guān)鍵,字符是有區(qū)別的)(配置文件已經(jīng)寫好了)# script for profile.d for bash shells, adjusted for each users# installation by substituting /opt for the actual tinyos tree# installation point.export TOSROOT=/opt
20、/tinyos-2.xexport TOSDIR=$TOSROOT/tosexport CLASSPATH=C:cygwinopttinyos-2.xsupportsdkjavatinyos.jarexport CLASSPATH=$CLASSPATH;.export MAKERULES=$TOSROOT/support/make/Makerulesexport PATH=/opt/msp430/bin:$PATHexport PATH=/cygdrive/c/Program Files/Java/jdk1.6.0_10/bin:$PATH執(zhí)行命令: tos-install-jni如果出現(xiàn)一下
21、錯誤信息:Installing 32-bit Java JNI code in /cygdrive/c/Program Files/Java/jdk1.6.0_10/jre/bin .install: cannot stat /usr/lib/tinyos/*-32.dll: No such file or directory我們需要將以下目錄中的toscomm.dll,重命名為:toscomm-32.dllC:cygwinlibtinyos C:Program FilesJavajdk1.6.0_10jrebintoscomm.dll toscomm-32.dll重新tos-install-
22、jni命令。7、 安裝 Graphviz下載地址:/tos/dist-1.1.0/tools/windows/graphviz-1.10.exe,默認安裝到C:Program FilesATT目錄下。一直點NEXT就可以完成安裝。8、 測試安裝1環(huán)境測試: 運行cygwin,輸入命令: $ tos-check-env 如果上述安裝成功,可能會出現(xiàn)WARNING:java 1.4 or java1.5,tos-check-env completed without error等,這是JAVA版本的問題,不必理會。 $ which java正常情
23、況出現(xiàn):/cygdrive/c/Program Files/Java/jdk1.6.0_10/bin/java如果出現(xiàn)/cygdrive/c/WINDOWS/system32/java則嘗試輸入:export PATH=/cygdrive/c/Program Files/Java/jdk1.6.0_10/bin:$PATH2、檢查己經(jīng)讓TinyOS build system環(huán)境可運行的.輸入如下命令:$ printenv MAKERULES如果看到:/opt/tinyos-2.x/support/make/Makerules這是正確的五 實驗報告要求實驗名稱實驗內(nèi)容說明程序源代碼實驗步驟,實驗
24、中出現(xiàn)的問題,觀察到的結(jié)果實驗總結(jié)實驗二:BlinkTinyOS編程的“Hello World”一 實驗?zāi)康?、掌握Linux基本命令及其使用。2、掌握安裝應(yīng)用程序到節(jié)點(如telosb)的方法。3、 掌握nesC語言語法風(fēng)格、組織、命名和連接組件的機制。4、 掌握組件中命令(command)和事件(event)接口的使用。5、 掌握模塊(module)和配件(configuration)的作用及使用方法。二 實驗原理TinyOS操作系統(tǒng)、庫和程序服務(wù)程序是用nesC寫的。 nesC是一種開發(fā)組件式結(jié)構(gòu)程序的語言。nesC是一種C語法風(fēng)格的語言,但是支持TinyOS的并發(fā)模型,以及組織、命名和
25、連接組件成為健壯的嵌入式網(wǎng)絡(luò)系統(tǒng)的機制。 nesC應(yīng)用程序是由有良好定義的雙向接口的組件構(gòu)建的。 nesC定義了一個基于任務(wù)和硬件事件處理的并發(fā)模型,并能在編譯時檢測數(shù)據(jù)流組件。規(guī)范 nesC應(yīng)用程序由一個或多個組件連接而成 一個組件可以提供或使用接口 組件中command接口由組件本身實現(xiàn) 組件中event接口由調(diào)用者實現(xiàn) 接口是雙向的,調(diào)用command接口必須實現(xiàn)其event接口實現(xiàn)modules 包含應(yīng)用程序代碼,實現(xiàn)接口configurations裝配模塊,連接模塊使用的接口到其提供者每個nesC應(yīng)用程序都有一個頂級configuration連接內(nèi)部模塊并發(fā)模型TinyOS只能運行單
26、個由所需的系統(tǒng)模塊和自定義模塊構(gòu)成的應(yīng)用程序兩個線程任務(wù) 一次運行完成,非搶占式硬件事件處理 處理硬件中斷 一次運行完成,搶占式用于硬件中斷處理的command和event必須用async關(guān)鍵字聲明執(zhí)行流程(race conditions)nesC要避免任務(wù)排他性訪問共享數(shù)據(jù)nesC要避免所有共享數(shù)據(jù)訪問都通過原子語句nesC在編譯過程中要檢測數(shù)據(jù)流,但可能誤報,可用norace關(guān)鍵字聲明不檢測,但對其使用應(yīng)格外小心三 實驗環(huán)境1、JDK1.6 for windows2、Cygwin with TinyOS 2.x3、UltraEdit / EditPlus四 實驗內(nèi)容和步驟1、實驗內(nèi)容:(1
27、) 進入tmp文件夾并創(chuàng)建文件夾,取名Blink,進入這個文件夾。cd /tmpmkdir Blinkcd Blink(2) 定義一個Blink配件BlinkAppC.nc。configuration BlinkAppC implementation components MainC, BlinkC, LedsC; components new TimerMilliC() as Timer0; components new TimerMilliC() as Timer1; components new TimerMilliC() as Timer2; BlinkC - MainC.Boot;
28、BlinkC.Timer0 - Timer0; BlinkC.Timer1 - Timer1; BlinkC.Timer2 - Timer2; BlinkC.Leds - LedsC;(3) 定義一個Blink配件BlinkC.nc。#include Timer.hmodule BlinkC uses interface Timer as Timer0; uses interface Timer as Timer1; uses interface Timer as Timer2; uses interface Leds; uses interface Boot;implementation e
29、vent void Boot.booted() call Timer0.startPeriodic( 250 ); call Timer1.startPeriodic( 500 ); call Timer2.startPeriodic( 1000 ); event void Timer0.fired() call Leds.led0Toggle(); event void Timer1.fired() call Leds.led1Toggle(); event void Timer2.fired() call Leds.led2Toggle(); (4) 新建一個Makefile文件。COMP
30、ONENT=BlinkAppCinclude $(MAKERULES) (5)新建一個說明文檔README(可選) (6)編譯程序make telosb (7)下載到telosb節(jié)點,觀察實驗結(jié)果make telosb reinstall.ID bsl,serialport. (8) 用nesdoc顯示程序結(jié)構(gòu)和配件組成,然后進入/tinyos-2.x/doc/nesdoc,打開index.htmlmake telosb docs(9)編寫實驗報告 五 實驗報告要求實驗名稱實驗內(nèi)容說明程序源代碼實驗步驟,實驗中出現(xiàn)的問題,觀察到的結(jié)果實驗總結(jié)實驗三:TinyOS任務(wù)及應(yīng)用舉例一 實驗?zāi)康?、了
31、解TinyOS兩層調(diào)度策略:任務(wù)和硬件事件句柄。2、掌握任務(wù)(Task)的建立、提交及其作用。3、 掌握nesC語法中的分相操作(split-phase operation)。4、 理解BlinkTask應(yīng)用程序。二 實驗原理1、任務(wù)(Task)TinyOS 提供任務(wù)和硬件事件句柄組成的兩層調(diào)度策略。關(guān)鍵字 async 聲明了可被硬件事件句柄執(zhí)行的命令或事件。這意味著它可以在任何時候執(zhí)行(可能會搶占其它代碼的執(zhí)行)。因此,用 async 聲明的命令和事件所做的工作應(yīng)該做盡量少,且要快速完成。此外,還得注意被異步命令或事件訪問的數(shù)據(jù)可能存在的數(shù)據(jù)競爭。任務(wù)則被用來處理一些較長時間的操作,例如:后
32、臺數(shù)據(jù)處理,但任務(wù)可以被硬件事件句柄搶占。 一個任務(wù)可以用以下語法在你的實現(xiàn)模塊中聲明: task void taskname() / 其中,taskname 是程序員任意指定的任務(wù)的標識,也就是“函數(shù)名”。一個任務(wù)的返回值類型必須是void,并且不能有任何參數(shù)。而向操作系統(tǒng)提交任務(wù)則可以用以下語法: post taskname(); 一個任務(wù)可以在命令、事件或其它任務(wù)內(nèi)部向操作系統(tǒng)提交。post 操作把任務(wù)放置到一個以先進先出為處理方式的內(nèi)部任務(wù)隊列中去。當一個任務(wù)開始執(zhí)行的時候,只有它運行結(jié)束,下一個任務(wù)才能開始運行;因此,一個任務(wù)不應(yīng)該占用或阻塞太長時間。任務(wù)之間不可以互相搶占,但是會被
33、硬件事件句柄搶占。如果你的任務(wù)需要執(zhí)行一系列長時間的操作,最好把任務(wù)分成幾個而不是使用一個大的任務(wù)。2、分相(split-phase)操作在TinyOS中每一個長時間運行的操作都是分相的。在阻塞系統(tǒng)中,當一個調(diào)用長時間運行的操作時,只有操作完成時調(diào)用才會返回;而在分相系統(tǒng)中,調(diào)用會立即返回,當操作完成會發(fā)出callback。分相操作相對于順序代碼有些復(fù)雜,但他可以使操作并行并且節(jié)省內(nèi)存。Timer.StartOneShot就是一個分相調(diào)用的例子。if (send() = SUCCESS) sendCount+;/ start phasesend();/completion phasevoid
34、sendDone(error_t err) if (err = SUCCESS) sendCount+; 阻塞(Blocking)分相(Split-Phase)三 實驗環(huán)境1、JDK1.6 for windows2、Cygwin with TinyOS 2.x3、UltraEdit / EditPlus四 實驗內(nèi)容和步驟 (1) 進入tmp文件夾并創(chuàng)建文件夾,取名BlinkTask,進入這個文件夾。cd /tmpmkdir BlinkTaskcd BlinkTask(2) 把Blink文件夾里的所有文件復(fù)制到BlinkTask中。cp r /opt/tinyos-2.x/apps/Blink/
35、* /tmp/(3) 現(xiàn)給程序設(shè)置一個較長的計算任務(wù)。用UltraEdit打開模塊文件BlinkC.nc,并修改如下:#include Timer.hmodule BlinkC uses interface Timer as Timer0; uses interface Timer as Timer1; uses interface Timer as Timer2; uses interface Leds; uses interface Boot;implementation event void Boot.booted() call Timer0.startPeriodic( 250 );
36、call Timer1.startPeriodic( 500 ); call Timer2.startPeriodic( 1000 ); event void Timer0.fired() uint32_t i; for (i = 0; i 400001; i+) call Leds.led0Toggle(); event void Timer1.fired() call Leds.led1Toggle(); event void Timer2.fired() call Leds.led2Toggle(); (4) 編譯程序并把它下載到節(jié)點觀察三盞燈情況,記錄結(jié)果。若第一盞燈沒有閃爍,則將值改
37、成20001,100001再觀察結(jié)果。400001:沒有閃爍。第一盞燈一直亮,后面兩盞不亮20001:紅燈有閃爍,綠燈的閃爍頻率是黃燈的兩倍100001:紅燈一直亮,沒有閃爍 (5)一個長的計算操作會一直占用CPU,從而阻塞其他操作的執(zhí)行。所以,我們需要使用建立任務(wù)(Task)任務(wù)的方法來解決上述問題,重新修改程序。implementationtask void computeTask() uint32_t i; for (i = 0; i 400001; i+) event void Timer0.fired() call Leds.led0Toggle(); post computeTas
38、k();記錄:沒有閃爍 (6)編譯、安裝程序,觀察記錄結(jié)果。若第一盞燈仍然沒有閃爍(想想為什么?),則將代碼再次修改如下:uint32_t i;task void computeTask() uint32_t start = i; for (;i start + 10000 & i = 400000) i = 0; else post computeTask(); 記錄:三站燈都閃爍 (7)再次編譯并安裝程序,觀察記錄結(jié)果。(8)編寫實驗報告 五 實驗報告要求實驗名稱實驗內(nèi)容說明程序源代碼實驗步驟,實驗中出現(xiàn)的問題,觀察到的結(jié)果實驗總結(jié)實驗四:節(jié)點間的無線通信一 實驗?zāi)康?、了解TinyOS消
39、息緩沖抽象message_t。2、掌握用于抽象底層通信服務(wù)的基本通信接口名稱及它們所實現(xiàn)的功能。3、 掌握活動消息(AM)接口。4、 掌握基本通信組件。5、 理解BlinkToRadio程序代碼,實現(xiàn)節(jié)點間的無線通信。二 實驗原理1、message_t:TinyOS的消息緩沖(1)TinyOS提供了許多接口去抽象底層通信服務(wù),所有的這些接口以及許多提供這些接口的組件使用共同的消息緩沖抽象:message_t(底層通信數(shù)據(jù)的結(jié)構(gòu)),用nesC結(jié)構(gòu)體實現(xiàn)。(2)message_t結(jié)構(gòu):typedef nx_struct message_t nx_uint8_t headersizeof(messa
40、ge_header_t); nx_uint8_t dataTOSH_DATA_LENGTH; nx_uint8_t footersizeof(message_footer_t); nx_uint8_t metadatasizeof(message_metadata_t); message_t;2、通信接口與組件 基本通信接口:(1)Packet:提供對message_t的基本訪問a. 清除消息內(nèi)容(命令)b. 得到有效載荷的長度(命令)c. 得到指向有效載荷地址的指針(命令)(2)Send:提供與地址無關(guān)的發(fā)送接口a. 發(fā)送消息內(nèi)容(命令)b. 取消掛起消息的發(fā)送(命令)c. 消息是否發(fā)送成功
41、(事件)d. 得到有效載荷的長度(函數(shù))e. 得到指向有效載荷地址的指針(函數(shù))(3)Receive:提供基本消息的接收接口a. 接收消息(事件)b. 得到有效載荷的長度(命令)c. 得到指向有效載荷地址的指針(命令)(4)PacketAcknowledgements:為每個包的請求確認提供機制(5)RadioTimeStaming:提供時間戳 活動消息接口(1)AM層次實現(xiàn)了對radio的多路訪問。“AM tpye”涉及到多路復(fù)用的領(lǐng)域。(2)支持AM服務(wù)的接口:a. AMPacket:提供基本的AM訪問b. AMSend:提供基本的AM發(fā)送接口(3)一個節(jié)點的AM地址可以在初始化的時候設(shè)置
42、:make install.n or meke reinstall.n 通信組件:許多組件實現(xiàn)了基本通信接口與AM接口(1)AMReceiverC - Provides: Receive, Packet, and AMPacket. (2)AMSenderC-Provides: AMSend, Packet, AMPacket, RacketAcknowledgements as Acks. (3)AMSnooperC - Provides Receive, Packet, and AMPacket. (4)AMSnoopingReceiverC - Provides Receive, Pac
43、ket, and AMPacket. (5)ActiveMessageAddressC 提供用來得到或設(shè)置節(jié)點AM地址的命令(少用)三 實驗環(huán)境1、JDK1.6 for windows2、Cygwin with TinyOS 2.x3、UltraEdit / EditPlus四 實驗內(nèi)容和步驟1、重新實現(xiàn)Blink(1)進入tmp文件夾并創(chuàng)建文件夾,取名BlinkToRadio,進入這個文件夾。cd /tmpmkdir BlinkToRadiocd BlinkToRadio(2)新建模塊文件BlinkToRadio.nc#include #include BlinkToRadio.hmodul
44、e BlinkToRadioC uses interface Boot; uses interface Leds; uses interface Timer as Timer0;implementation uint16_t counter = 0; event void Boot.booted() call Timer0.startPeriodic(TIMER_PERIOD_MILLI); event void Timer0.fired() counter+; call Leds.set(counter); (3)TIMER_PERIOD_MILLI的值被定義頭文件BlinkToRadio.
45、h中#ifndef BLINKTORADIO_H#define BLINKTORADIO_H enum TIMER_PERIOD_MILLI = 250;#endif(4)編寫配件BlinkToRadioApp.nc,連接提供和使用各接口的組件#include #include BlinkToRadio.h configuration BlinkToRadioAppC implementation components MainC; components LedsC; components BlinkToRadioC as App; components new TimerMilliC() a
46、s Timer0; App.Boot - MainC; App.Leds - LedsC; App.Timer0 - Timer0;(5)最后創(chuàng)建Makefile文件COMPONENT=BlinkToRadioAppCinclude $(MAKERULES)2、定義消息結(jié)構(gòu)typedef nx_struct BlinkToRadioMsg nx_uint16_t nodeid; nx_uint16_t counter; BlinkToRadioMsg;除了struct和uint16_t前面的nx_前綴之外,上面的消息結(jié)構(gòu)與C語言結(jié)構(gòu)體基本一樣。它是nesC所特有的,表示struct和uint1
47、6_t為外部類型(external types)。nx_前綴表示數(shù)據(jù)為外部類型的大端(big-endian)數(shù)據(jù),小端(little-endian)前綴為nxle_。不同類型的節(jié)點會采用不同類型的處理器,它們對于字節(jié)、字等的存儲機制有所不同,因而會引發(fā)計算機通信領(lǐng)域中一個很重要的問題,即通信雙方交流的信息單元應(yīng)該以什么樣的順序進行傳送。如果不達成一致的規(guī)則,通信雙方將無法進行正確的編/譯碼從而導(dǎo)致通信失敗。TCP/IP各層協(xié)議將字節(jié)序定義為big-endian,因此TCP/IP協(xié)議中使用的字節(jié)序通常稱之為網(wǎng)絡(luò)字節(jié)序。nesC語言定義了外部類型,可以讓程序員不必考慮字節(jié)序的重新排列。3、發(fā)送數(shù)據(jù)
48、包定義好消息的數(shù)據(jù)結(jié)構(gòu),我們接下去要學(xué)習(xí)怎么把指定結(jié)構(gòu)的數(shù)據(jù)包發(fā)送出去。首先我們因明確程序要完成的功能:在定時器每次觸發(fā)的時候(i)計數(shù)器+1;(ii)把計數(shù)器值的最低三位顯示在三盞燈上;(iii)把由發(fā)送節(jié)點的節(jié)點號和計數(shù)器值組成數(shù)據(jù)包通過無線收發(fā)器發(fā)送出去。為了完成上述功能,我們將程序分成以下幾步:(1)找出相應(yīng)的接口和組件,使我們能夠控制收發(fā)器(radio)并對message_t進行操作。我們使用AMSend接口來發(fā)送數(shù)據(jù)包,Packet和AMPacket接口進入message_t抽象數(shù)據(jù)類型。這些接口都用組件AMSendC來提供,雖然它們也可以由ActiveMessageC來提供,但是
49、AMSendC提供了虛擬抽象(virtualized abstraction)。因為收發(fā)器是一個公共資源,不同的組件都可以使用,所以需要將它虛擬化以避免不同組件間的相互干擾(后面課程會講)。同時,我們使用由組件ActiveMessageC提供的SplitControl來開啟和關(guān)閉收發(fā)器。(2)更新BlinkToRadio.nc中的module板塊代碼,用uses語句添加上述接口。module BlinkToRadioC .uses interface Packet;uses interface AMPacket;uses interface AMSend;uses interface Spli
50、tControl as AMControl;注意,這里SplitControl被重命名為AMControl,通過as關(guān)鍵字。(3)聲明新變量,并初始化。implementation bool busy = FALSE; /標記無線電收發(fā)器是否忙碌 message_t pkt; .在定時器開始之前,首先要徹底開啟收發(fā)器。event void Boot.booted() call AMControl.start();event void AMControl.startDone(error_t err) if (err = SUCCESS) call Timer0.startPeriodic(TIM
51、ER_PERIOD_MILLI); else call AMControl.start();event void AMControl.stopDone(error_t err) (4)添加程序邏輯。首先要檢查busy標記,保證沒有數(shù)據(jù)包正在發(fā)送。然后用一個指針指向一個數(shù)據(jù)包的payload部分,往payload里面各個域填寫數(shù)據(jù)。最后通過send命令把數(shù)據(jù)包發(fā)送給所有接受范圍內(nèi)的節(jié)點(因為目的地址為AM_BROADCAST_ADDR)。如果成功(返回SUCCESS),則證實AM層已經(jīng)收到數(shù)據(jù)包,準備發(fā)送。event void Timer0.fired() .if (!busy) BlinkTo
52、RadioMsg* btrpkt = (BlinkToRadioMsg*)(call Packet.getPayload(&pkt,NULL); sizeof (BlinkToRadioMsg);btrpkt-nodeid = TOS_NODE_ID;btrpkt-counter = counter;if (call AMSend.send(AM_BROADCAST_ADDR, &pkt, sizeof(BlinkToRadioMsg) = SUCCESS)SUCCESS) busy = TRUE;(5)實現(xiàn)所有用到的接口中所包含的事件(events)。通過觀察Packet,AMPacket,AMSend接口,發(fā)現(xiàn)只
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 亞馬遜雨傘訂購合同范本
- 農(nóng)村住房修建合同范例
- 廠區(qū)工人雇傭合同范本
- 企業(yè)采購紅酒合同范本
- 吧臺主理人合同范本
- 品牌供貨合作合同范例
- 前臺課程顧問合同范本
- 壓手續(xù)不押車合同范本
- 北京二手房服務(wù)合同范本
- 危險建筑拆除合同范本
- 2024年新蘇教版六年級下冊科學(xué)全冊知識點(精編版)
- 華為十六字方針解析以崗定級-以級定薪-人崗匹配、易崗易薪
- 食堂遇特殊天氣應(yīng)急預(yù)案
- 礦山機電專業(yè)課程標準范本
- 食品風(fēng)味化學(xué)(第二版) 課件 第8、9章 風(fēng)味物質(zhì)的提取與分析、食品中風(fēng)味的釋放和穩(wěn)定化
- 自考《組織行為學(xué)》全
- 變電站建設(shè)工程造價影響因素分析及控制策略研究
- 【銅版畫“飛塵”技法實踐研究4900字(論文)】
- 人教版道德與法治五年級下冊全冊課件(完整版)
- 角磨機施工方案
- 施耐德ATS互投柜說明書WTSA、B控制器說明書
評論
0/150
提交評論