Contiki-系統(tǒng)移植課件_第1頁(yè)
Contiki-系統(tǒng)移植課件_第2頁(yè)
Contiki-系統(tǒng)移植課件_第3頁(yè)
Contiki-系統(tǒng)移植課件_第4頁(yè)
Contiki-系統(tǒng)移植課件_第5頁(yè)
已閱讀5頁(yè),還剩60頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第11章Contiki系統(tǒng)移植11.1認(rèn)識(shí)Contiki開(kāi)發(fā)套件11.2搭建Contiki開(kāi)發(fā)環(huán)境11.3Contiki系統(tǒng)移植實(shí)例返回11.1認(rèn)識(shí)Contiki開(kāi)發(fā)套件進(jìn)行6LoWPAN嵌入式物聯(lián)網(wǎng)應(yīng)用開(kāi)發(fā),需要相關(guān)硬件和軟件。在硬件方面,本章基于聯(lián)創(chuàng)中控(北京)科技有限公司自主研發(fā)的UI-IOT-IPv6教學(xué)科研平臺(tái),用于了解6LoWPAN開(kāi)發(fā)套件各個(gè)模塊的硬件資源、使用說(shuō)明及各種運(yùn)行模式,同時(shí)介紹6LoWPAN嵌入式物聯(lián)網(wǎng)應(yīng)用開(kāi)發(fā)環(huán)境的搭建方法。11.1.1Contiki開(kāi)發(fā)套件介紹UI-IOT-IPv6平臺(tái)在硬件設(shè)計(jì)上分成兩個(gè)區(qū)域:移動(dòng)互聯(lián)網(wǎng)網(wǎng)關(guān)板、物聯(lián)網(wǎng)無(wú)線節(jié)點(diǎn)板,其中物聯(lián)網(wǎng)無(wú)線節(jié)點(diǎn)板采用UI-WSN系列物聯(lián)網(wǎng)套件,如圖11-1和圖11-2所示。11.1.2跳線設(shè)置及硬件連接(1)無(wú)線協(xié)調(diào)器直接安裝到實(shí)驗(yàn)主板對(duì)應(yīng)插槽中,跳線使用如圖11-3所示。下一頁(yè)返回11.1認(rèn)識(shí)Contiki開(kāi)發(fā)套件①模式一:調(diào)試STM32F103,STM32F103串口連接到網(wǎng)關(guān)(默認(rèn))。②模式二:調(diào)試STM32F103,STM32F103串口連接到調(diào)試擴(kuò)展板。(2)無(wú)線節(jié)點(diǎn)板上提供了兩組跳線用于選擇調(diào)試不同的處理器,跳線使用如圖11-4所示。①模式一:調(diào)試CC2530,CC2530串口連接到調(diào)試擴(kuò)展板。②模式二:調(diào)試STM32F103,STM32F103串口連接到調(diào)試擴(kuò)展板(默認(rèn))。(3)通過(guò)調(diào)試接口板的轉(zhuǎn)接,無(wú)線節(jié)點(diǎn)可以使用仿真器進(jìn)行調(diào)試,同時(shí)還可以使用RS232串口。調(diào)試接口板的連接如圖11-5所示。上一頁(yè)返回11.2搭建Contiki開(kāi)發(fā)環(huán)境11.2.1Contiki源代碼結(jié)構(gòu)Contiki是一個(gè)高度可移植的操作系統(tǒng),它的設(shè)計(jì)就是為了獲得良好的可移植性,因此其源代碼的組織很有特點(diǎn)。下面簡(jiǎn)單介紹Contiki的源代碼組織結(jié)構(gòu)以及各部分代碼的作用。打開(kāi)Contiki源文件目錄,可以看到主要有以下部分。1.appsapps目錄下是一些應(yīng)用程序,例如ftp、shell、webserver等,在項(xiàng)目程序開(kāi)發(fā)過(guò)程中可以直接使用。使用這些應(yīng)用程序的方式為,在項(xiàng)目的Makefile中,定義APPS=[應(yīng)用程序名稱]。在以后的示例中會(huì)具體看到如何使用apps。下一頁(yè)返回11.2搭建Contiki開(kāi)發(fā)環(huán)境2.corecore目錄下是Contiki的核心源代碼,包括網(wǎng)絡(luò)(net)、文件系統(tǒng)(cfs)、外部設(shè)備(dev)、鏈接庫(kù)(lib)等,并且包含了時(shí)鐘、I/O、ELF裝載器、網(wǎng)絡(luò)驅(qū)動(dòng)等的抽象。3.cpucpu目錄下是Contiki目前支持的微處理器,例如arm、avr、msp430等。如果需要支持新的微處理器,可以在這里添加相應(yīng)的源代碼。4.docdoc目錄是Contiki幫助文檔目錄,對(duì)Contiki應(yīng)用程序開(kāi)發(fā)很有參考價(jià)值。使用前需要先用Doxygen進(jìn)行編譯。上一頁(yè)下一頁(yè)返回11.2搭建Contiki開(kāi)發(fā)環(huán)境5.examplesexamples目錄下是針對(duì)不同平臺(tái)的示例程序。6.platformplatform目錄下是Contiki支持的硬件平臺(tái),例如mx231cc、micaz、sky、win32等。Contiki的平臺(tái)移植主要在這個(gè)目錄下完成。這一部分的代碼與相應(yīng)的硬件平臺(tái)相關(guān)。7.toolstools目錄下是開(kāi)發(fā)過(guò)程中常用的一些工具,例如CFS相關(guān)的makefsdata、網(wǎng)絡(luò)相關(guān)的tunslip、模擬器Cooja和Mspsim等。為了獲得良好的可移植性,除了CPU和platform中的源代碼與硬件平臺(tái)相關(guān)以外,其他目錄中的源代碼都盡可能與硬件無(wú)關(guān)。編譯時(shí),根據(jù)指定的平臺(tái)來(lái)鏈接對(duì)應(yīng)的代碼。上一頁(yè)返回11.2搭建Contiki開(kāi)發(fā)環(huán)境11.2.2Contiki系統(tǒng)移植過(guò)程嵌入式的操作系統(tǒng)在硬件平臺(tái)上的移植,一直以來(lái)讓很多新手望而卻步,因?yàn)橐浦惨粋€(gè)操作系統(tǒng)比寫(xiě)一個(gè)C語(yǔ)言程序復(fù)雜多了。那么究竟怎樣移植Contiki系統(tǒng)到STM32上呢?移植過(guò)程中需要修改源碼的哪個(gè)部分呢?通過(guò)下面的分析,讀者就知道了。Contiki采用事件驅(qū)動(dòng)機(jī)制,通常有兩種方法產(chǎn)生事件:一是通過(guò)時(shí)鐘定時(shí),定時(shí)時(shí)間到就產(chǎn)生一個(gè)事件;二是通過(guò)某種中斷,某個(gè)中斷發(fā)生,就產(chǎn)生某個(gè)事件,例如外部中斷。由于Contiki是非搶占的操作系統(tǒng),所以移植時(shí)時(shí)鐘一定是必要的,移植Contiki系統(tǒng)的重點(diǎn)就在SysTick上。下面以一個(gè)實(shí)例詳細(xì)介紹Contiki系統(tǒng)移植的整個(gè)過(guò)程。下一頁(yè)返回11.2搭建Contiki開(kāi)發(fā)環(huán)境1.創(chuàng)建IARforARM空工程將本書(shū)配套的軟件資源包中“03-系統(tǒng)代碼”目錄下的contiki-2.6解壓后整個(gè)文件夾拷貝到PC機(jī)任意目錄下,比如D:\根目錄,進(jìn)入Contiki系統(tǒng)源碼的contiki-2.6\zonesion\example\iar目錄下,創(chuàng)建testSample目錄,然后在testSample目錄下創(chuàng)建一個(gè)IARforARM空工程,工程名稱以及工作空間的名稱為“testSample”,過(guò)程如下:(1)創(chuàng)建一個(gè)空的ARM工程,將之命名為“testSample”。單擊“開(kāi)始”->“程序”->“IARSystems”->“IAREmbeddedWorkbenchforARM5.41”->“IAREmbeddedWorkbench”,單擊“Project”選項(xiàng),選擇“CreateNewProject”,創(chuàng)建工程,如圖11-6所示。上一頁(yè)下一頁(yè)返回11.2搭建Contiki開(kāi)發(fā)環(huán)境(2)保存工作空間并將之命名為“testSample”。單擊“File”->“Saveworkspace”,保存工程,創(chuàng)建完工程后,在testSample工程目錄下即可看到新增了幾個(gè)文件,如圖11-7所示。2.給工程添加組目錄在工程名上單擊鼠標(biāo)右鍵,選擇“Add”->“AddGroup”,填寫(xiě)組目錄名稱。按照添加組目錄的方法,依次添加如圖11-8所示的組目錄結(jié)構(gòu)。添加子目錄的方法,以core目錄下的子目錄sys為例,只要在core文件夾上單擊鼠標(biāo)右鍵,選擇“Add”->“Group”即可。3.在組目錄里添加.c等文件(1)添加Contiki系統(tǒng)文件。在工程sys目錄名上單擊鼠標(biāo)右鍵。選擇“Add”->“AddFiles...”。添加Contiki的系統(tǒng)文件:autostart.c、ctimer.c、etimer.c、process.c、timer.c。這幾個(gè)文件位于Contiki系統(tǒng)源碼的contiki-2.6\core\sys目錄下。上一頁(yè)下一頁(yè)返回11.2搭建Contiki開(kāi)發(fā)環(huán)境(2)添加STM32官方庫(kù)文件。將STM32F10x_StdPeriph_Lib_V3.5.0(ST公司提供的STM32標(biāo)準(zhǔn)庫(kù)文件,3.5版本庫(kù)放在Contiki系統(tǒng)源碼的contiki-2.6\cpu\arm\stm32f10x目錄下。(3)在工程的cpu組目錄下添加Contiki系統(tǒng)時(shí)鐘文件clock.c,該文件所在目錄為:contiki-2.6\cpu\arm\stm32f10x。4.創(chuàng)建contiki-main.c文件移植Contiki系統(tǒng)所需要的Contiki系統(tǒng)文件、STM32官方庫(kù)所需文件都添加完畢后,若想讓程序執(zhí)行就必須有main()函數(shù),因?yàn)?~3步添加的都是一些相應(yīng)的支持文件,下面在工程的zonesion\proj組目錄下新建一個(gè)contiki-main.c文件,創(chuàng)建方法如下:上一頁(yè)下一頁(yè)返回11.2搭建Contiki開(kāi)發(fā)環(huán)境單擊“File”->“New”->“File”或者直接單擊“File”下面的“NewDocument”按鈕創(chuàng)建一個(gè)空白文件。按下“Ctrl+S”組合鍵保存,保存路徑選擇當(dāng)前工程testSample根目錄,保存文件名為“contiki-main.c”。然后將已創(chuàng)建的contiki-main.c文件添加到工程的zonesion\proj組目錄下。添加完成后整個(gè)工程目錄結(jié)構(gòu)如圖11-9所示。添加完.c文件后,就需要配置工程,如硬件芯片型號(hào)選擇、頭文件路徑等。配置方法及步驟如下:在工程名上單擊鼠標(biāo)右鍵,選擇“Options”->“GeneralOptions”配置頁(yè)面,勾選“Device”,然后選擇“ST”->“STM32F10xxB”。在“Debugger”配置頁(yè)面,將“Driver”選項(xiàng)設(shè)置成“J-Linker/J-Trace”。配置完工程選項(xiàng)之后,就需要在工程配置選項(xiàng)里面添加頭文件路徑和宏定義,否則在編譯.c文件時(shí)就找不到相應(yīng)頭文件,會(huì)出現(xiàn)編譯錯(cuò)誤。上一頁(yè)下一頁(yè)返回11.2搭建Contiki開(kāi)發(fā)環(huán)境添加方法:將頭文件路徑復(fù)制到“C/C++Compiler”配置選項(xiàng)中的“Additionnalincludederectories”輸入框中;將宏定義添加到“Definedsymbols”輸入框中,如圖11-10所示。5.系統(tǒng)時(shí)鐘移植沒(méi)有系統(tǒng)時(shí)鐘,系統(tǒng)就跑不起來(lái),在本次移植過(guò)程中并不需要修改clock.c文件,因?yàn)樵揷lock.c文件已修改好,直接拿過(guò)來(lái)使用即可。下面對(duì)clock.c源碼進(jìn)行相應(yīng)解析。1)系統(tǒng)時(shí)鐘初始化系統(tǒng)時(shí)鐘初始化是整個(gè)STM32工作的核心,根據(jù)STM32的主頻,以及CLOCK_SENCOND的參數(shù),可以設(shè)置系統(tǒng)時(shí)鐘中斷的時(shí)間。上一頁(yè)下一頁(yè)返回11.2搭建Contiki開(kāi)發(fā)環(huán)境2)系統(tǒng)時(shí)鐘中斷處理函數(shù)要讓Contiki操作系統(tǒng)運(yùn)行起來(lái),關(guān)鍵就是啟動(dòng)系統(tǒng)時(shí)鐘,對(duì)應(yīng)到Contiki系統(tǒng)的進(jìn)程就是啟動(dòng)etimer進(jìn)程。etimer_process由Contiki系統(tǒng)提供,這里只需對(duì)系統(tǒng)時(shí)鐘進(jìn)行初始化并定時(shí)更新系統(tǒng)時(shí)鐘(用戶自定義current_clock),并判斷etimer的下一個(gè)定時(shí)時(shí)刻是否已到(通過(guò)比較current_clock與etimer的定時(shí)時(shí)刻來(lái)判定)。如果時(shí)鐘等待序列中有等待時(shí)鐘的進(jìn)程,那么就調(diào)度etimer進(jìn)程執(zhí)行,通過(guò)其來(lái)喚醒相關(guān)進(jìn)程。6.實(shí)驗(yàn)結(jié)果系統(tǒng)移植結(jié)束后,將程序燒寫(xiě)到STM32無(wú)線節(jié)點(diǎn)開(kāi)發(fā)板上驗(yàn)證Contiki系統(tǒng)是否移植成功。具體步驟為:上一頁(yè)下一頁(yè)返回11.2搭建Contiki開(kāi)發(fā)環(huán)境(1)正確連接JLINK仿真器、串口線到PC機(jī)和STM32開(kāi)發(fā)板(見(jiàn)圖11-5),在PC機(jī)上打開(kāi)串口調(diào)試助手或者超級(jí)終端,設(shè)置接收的波特率為115200。(2)在IARforARM開(kāi)發(fā)環(huán)境中打開(kāi)移植工程文件(或雙擊testSample.eww文件)。(3)通過(guò)5V電源適配器給STM32開(kāi)發(fā)板通電(將STM32電源開(kāi)關(guān)撥到“ON”,讓STM32開(kāi)發(fā)板上電,下同),然后打開(kāi)J-FlashARM軟件,單擊“Target”->“Connect”,連接成功后,LOG窗口會(huì)提示“ConnectedSuccessfully”,接下來(lái)通過(guò)IAR選擇“Project”->“Downloadanddebug”,將程序下載到STM32開(kāi)發(fā)板中。上一頁(yè)下一頁(yè)返回11.2搭建Contiki開(kāi)發(fā)環(huán)境(4)下載完后可以單擊“Debug”->“Go”讓程序全速運(yùn)行;也可以將STM32開(kāi)發(fā)板重新上電或者按下復(fù)位按鈕讓剛才下載的程序重新運(yùn)行。(5)程序成功運(yùn)行后,若在串口顯示區(qū)顯示“HelloWorld!”,即表明Contiki系統(tǒng)已成功移植到STM32開(kāi)發(fā)板。上一頁(yè)返回11.3Contiki系統(tǒng)移植實(shí)例本節(jié)通過(guò)6個(gè)實(shí)例進(jìn)一步介紹基于Contiki系統(tǒng)的嵌入式物聯(lián)網(wǎng)應(yīng)用的關(guān)鍵技術(shù)。11.3.1LED控制基于Contiki系統(tǒng),學(xué)習(xí)使用Contiki進(jìn)程控制LED燈以及掌握其相關(guān)原理。1.實(shí)例要求實(shí)現(xiàn)一個(gè)blink_process進(jìn)程,該進(jìn)程可使STM32開(kāi)發(fā)板上的D4、D5燈閃爍。LED燈的顯示一共有3種狀態(tài):D4點(diǎn)亮、D5點(diǎn)亮、D4和D5同時(shí)點(diǎn)亮。2.實(shí)例代碼blink_process進(jìn)程定義在工程根目錄下的blink.c文件中,源代碼如下:下一頁(yè)返回11.3Contiki系統(tǒng)移植實(shí)例#include"contiki.h"#include"dev/leds.h"#include<stdio.h>staticstructetimeret_blink;staticuint8_tblinks;PROCESS(blink_process,"blinkledprocess");//定義blink進(jìn)程AUTOSTART_PROCESSES(&blink_process);//將blink進(jìn)程定義成自啟動(dòng)PROCESS_THREAD(blink_process,ev,data){PROCESS_BEGIN();//進(jìn)程開(kāi)始上一頁(yè)下一頁(yè)返回11.3Contiki系統(tǒng)移植實(shí)例blinks=0;while(1){etimer_set(&et_blink,CLOCK_SECOND);//設(shè)置定時(shí)器1sPROCESS_WAIT_EVENT_UNTIL(ev==PROCESS_EVENT_TIMER);leds_off(LEDS_ALL);//關(guān)燈leds_on(blinks&LEDS_ALL);//開(kāi)燈blinks++;printf("Blink...(state%0.2X)\n\r",leds_get());}PROCESS_END();//進(jìn)程結(jié)束}上一頁(yè)下一頁(yè)返回11.3Contiki系統(tǒng)移植實(shí)例代碼中l(wèi)eds_on(blinks&LEDS_ALL)函數(shù)實(shí)現(xiàn)兩個(gè)LED燈點(diǎn)亮的不同方式,其中函數(shù)參數(shù)實(shí)現(xiàn)具體選擇哪一個(gè)LED燈點(diǎn)亮。在實(shí)例中,LED燈的顯示一共有3種狀態(tài):D4點(diǎn)亮、D5點(diǎn)亮、D4和D5同時(shí)點(diǎn)亮。盡管讀者對(duì)blink_process進(jìn)程的基本功能已有初步了解,但對(duì)進(jìn)程定義,以及進(jìn)程執(zhí)行難以理解。另外聲明變量最好不要放在PROCESS_BEGIN之前,因?yàn)檫M(jìn)程再次被調(diào)用,總是從頭開(kāi)始執(zhí)行,直到PROCESS_BEGIN宏中的switch判斷才跳轉(zhuǎn)到斷點(diǎn)case_LINE_。也就是說(shuō),進(jìn)程被調(diào)用時(shí)總是會(huì)執(zhí)行PROCESS_BEGIN之前的代碼。上一頁(yè)下一頁(yè)返回11.3Contiki系統(tǒng)移植實(shí)例3.實(shí)例結(jié)果(1)正確連接JLINK仿真器、串口線到PC機(jī)和STM32開(kāi)發(fā)板,在PC機(jī)上打開(kāi)串口調(diào)試助手或者超級(jí)終端,設(shè)置接收的波特率為115200。(2)在IARforARM開(kāi)發(fā)環(huán)境中打開(kāi)例程文件(或雙擊blink.eww文件,注意事先將blink整個(gè)文件夾拷貝到系統(tǒng)源碼目錄的D:\contiki-2.6\zonesion\example\iar文件夾下,下同)。(3)通過(guò)5V電源適配器給STM32開(kāi)發(fā)板通電,然后打開(kāi)J-FlashARM軟件,單擊“Target”->“Connect”,連接成功后,LOG窗口會(huì)提示“ConnectedSuccessfully”,接下來(lái)通過(guò)IAR選擇“Project”->“Downloadanddebug”,將程序下載到STM32開(kāi)發(fā)板中。上一頁(yè)下一頁(yè)返回11.3Contiki系統(tǒng)移植實(shí)例(4)下載完后可以單擊“Debug”->“Go”,讓程序全速運(yùn)行;也可以將STM32開(kāi)發(fā)板重新上電或者按下復(fù)位按鈕讓剛才下載的程序重新運(yùn)行。(5)程序成功運(yùn)行后,此時(shí)在STM32開(kāi)發(fā)板可觀察到D4和D5有規(guī)則地點(diǎn)亮,同時(shí)在串口顯示區(qū)有如下顯示:StartingContiki2.6onSTM32F10xautostart_start:startingprocess'blinkledprocess'Blink...(state00)Blink...(state01)Blink...(state02)Blink...(state03)上一頁(yè)下一頁(yè)返回11.3Contiki系統(tǒng)移植實(shí)例11.3.2Contiki多線程基于Contiki系統(tǒng),學(xué)習(xí)使用Contiki多線程編程以及掌握其相關(guān)原理。1.實(shí)例要求實(shí)現(xiàn)兩個(gè)進(jìn)程:一個(gè)是顯示“HelloWorld!”的進(jìn)程,設(shè)置成4秒顯示1次;另一個(gè)是使LED燈閃爍的blink進(jìn)程,設(shè)置成1秒執(zhí)行1次。2.實(shí)例代碼源碼實(shí)現(xiàn)過(guò)程如下:(1)定義helloworld進(jìn)程:PROCESS(helloworld_process,"Helloworldprocess");上一頁(yè)下一頁(yè)返回11.3Contiki系統(tǒng)移植實(shí)例(2)定義LED燈閃爍進(jìn)程:PROCESS(blink_process,"LEDblinkprocess");(3)兩個(gè)進(jìn)程定義結(jié)束之后在自動(dòng)啟動(dòng)進(jìn)程的參數(shù)列表里面加上兩個(gè)進(jìn)程名:AUTOSTART_PROCESSES(&hello_world_process,&blink_process);(4)編寫(xiě)helloworld_process進(jìn)程和blink_process進(jìn)程的執(zhí)行體:PROCESS_THREAD(hello_world_process,ev,data){PROCESS_BEGIN();etimer_set(&et_hello,CLOCK_SECOND*4);//設(shè)置定時(shí)器4s上一頁(yè)下一頁(yè)返回11.3Contiki系統(tǒng)移植實(shí)例while(1){PROCESS_WAIT_EVENT();if(ev==PROCESS_EVENT_TIMER){printf("HelloWorld!\n\r");etimer_reset(&et_hello);}}PROCESS_END();}//LED燈閃爍進(jìn)程PROCESS_THREAD(blink_process,ev,data)上一頁(yè)下一頁(yè)返回11.3Contiki系統(tǒng)移植實(shí)例{PROCESS_BEGIN();blinks=0;while(1){etimer_set(&et_blink,CLOCK_SECOND);//設(shè)置定時(shí)器1sPROCESS_WAIT_EVENT_UNTIL(ev==PROCESS_EVENT_TIMER);leds_off(LEDS_ALL);leds_on(blinks&LEDS_ALL);blinks++;printf("Blink...(state%0.2X)\n\r",leds_get());}PROCESS_END();}上一頁(yè)下一頁(yè)返回11.3Contiki系統(tǒng)移植實(shí)例3.實(shí)例結(jié)果(1)正確連接JLINK仿真器、串口線到PC機(jī)和STM32開(kāi)發(fā)板,在PC機(jī)上打開(kāi)串口調(diào)試助手或者超級(jí)終端,設(shè)置接收的波特率為115200。(2)在IARforARM開(kāi)發(fā)環(huán)境中打開(kāi)例程文件(或雙擊blink-hello.eww文件)。(3)通過(guò)5V電源適配器給STM32開(kāi)發(fā)板通電,然后打開(kāi)J-FlashARM軟件,單擊“Target”->“Connect”,連接成功后,LOG窗口會(huì)提示“ConnectedSuccessfully”,接下來(lái)通過(guò)IAR選擇“Project”->“Downloadanddebug”,將程序下載到STM32開(kāi)發(fā)板中。(4)下載完后可以單擊“Debug”->“Go”讓程序全速運(yùn)行;也可以將STM32開(kāi)發(fā)板重新上電或者按下復(fù)位按鈕讓剛才下載的程序重新運(yùn)行。上一頁(yè)下一頁(yè)返回11.3Contiki系統(tǒng)移植實(shí)例(5)程序成功運(yùn)行后,在串口顯示區(qū)顯示:StartingContiki2.6onSTM32F10xautostart_start:startingprocess'Blinkledprocess'autostart_start:startingprocess'LEDblinkprocess'Blink...(state01)Blink...(state02)Blink...(state03)HelloWorld!Blink...(state00)Blink...(state01)Blink...(state02)上一頁(yè)下一頁(yè)返回11.3Contiki系統(tǒng)移植實(shí)例Blink...(state03)HelloWorld!….串口顯示區(qū)的信息表示兩個(gè)進(jìn)程開(kāi)始運(yùn)行,顯示“Blink…(state01)”時(shí),STM32開(kāi)發(fā)板上D4點(diǎn)亮,顯示“Blink…(state02)”時(shí),可看到D5點(diǎn)亮,顯示“Blink…(state03)”時(shí),D4和D5同時(shí)點(diǎn)亮。串口顯示區(qū)顯示“HelloWorld!”時(shí),表明helloworld進(jìn)程已開(kāi)始工作。上一頁(yè)下一頁(yè)返回11.3Contiki系統(tǒng)移植實(shí)例11.3.3Contiki進(jìn)程間的通信進(jìn)程通信的方式有多種,本次實(shí)驗(yàn)基于Contiki系統(tǒng),使用的是共享內(nèi)存的方式。共享內(nèi)存的方式是指相互通信的進(jìn)程間設(shè)有公共內(nèi)存,一組進(jìn)程向公共內(nèi)存中寫(xiě),另一組進(jìn)程從公共內(nèi)存中讀,通過(guò)這種方式實(shí)現(xiàn)兩組進(jìn)程間的信息交換。共享內(nèi)存是最有用的進(jìn)程間通信方式,也是最快的進(jìn)程間通信形式。兩個(gè)不同進(jìn)程A、B共享內(nèi)存本質(zhì)上是同一塊物理內(nèi)存被映射到進(jìn)程A、B各自的進(jìn)程地址空間。進(jìn)程A可以即時(shí)看到進(jìn)程B對(duì)共享內(nèi)存中數(shù)據(jù)段的更新。上一頁(yè)下一頁(yè)返回11.3Contiki系統(tǒng)移植實(shí)例1.實(shí)例要求實(shí)現(xiàn)兩個(gè)進(jìn)程:一個(gè)count進(jìn)程,另一個(gè)print進(jìn)程。在count進(jìn)程中添加LED燈翻轉(zhuǎn)效果,以便觀看count進(jìn)程是否執(zhí)行,同時(shí)設(shè)置一個(gè)靜態(tài)變量count,只要count的值發(fā)生變化,print進(jìn)程可即時(shí)看到count數(shù)值的變化,并將其通過(guò)串口顯示出來(lái)。2.實(shí)例代碼兩個(gè)進(jìn)程的實(shí)現(xiàn)源碼如下:staticprocess_event_tevent_data_ready;/*定義count進(jìn)程和print進(jìn)程*/PROCESS(count_process,"countprocess");PROCESS(print_process,"printprocess");/*將兩個(gè)進(jìn)程設(shè)置成自啟動(dòng)*/上一頁(yè)下一頁(yè)返回11.3Contiki系統(tǒng)移植實(shí)例AUTOSTART_PROCESSES(&count_process,&print_process);PROCESS_THREAD(count_process,ev,data)//count進(jìn)程執(zhí)行體{staticstructetimercount_timer;staticintcount=0;PROCESS_BEGIN();event_data_ready=process_alloc_event();etimer_set(&count_timer,CLOCK_SECOND/2);//設(shè)置定時(shí)器2sleds_init();//LED初始化leds_on(1);//點(diǎn)亮LED1while(1){上一頁(yè)下一頁(yè)返回11.3Contiki系統(tǒng)移植實(shí)例PROCESS_WAIT_EVENT_UNTIL(ev==PROCESS_EVENT_TIMER);//2s結(jié)束后leds_toggle(LEDS_ALL);//LED反轉(zhuǎn)count++;//將event_data_ready事件?count數(shù)據(jù)傳遞給print進(jìn)程process_post(&print_process,event_data_ready,&count);etimer_reset(&count_timer);}//復(fù)位count_timer,相當(dāng)于繼續(xù)延時(shí)2sPROCESS_END();}PROCESS_THREAD(print_process,ev,data)//打印進(jìn)程執(zhí)行體{PROCESS_BEGIN();上一頁(yè)下一頁(yè)返回11.3Contiki系統(tǒng)移植實(shí)例while(1){PROCESS_WAIT_EVENT_UNTIL(ev==event_data_ready);printf("counteris%d\n\r",(*(int*)data));}PROCESS_END();}3.實(shí)例結(jié)果(1)正確連接JLINK仿真器、串口線到PC機(jī)和STM32開(kāi)發(fā)板,在PC機(jī)上打開(kāi)串口調(diào)試助手或者超級(jí)終端,設(shè)置接收的波特率為115200。(2)在IARforARM開(kāi)發(fā)環(huán)境中打開(kāi)例程文件(或雙擊event-post.eww文件)。上一頁(yè)下一頁(yè)返回11.3Contiki系統(tǒng)移植實(shí)例(3)通過(guò)5V電源適配器給STM32開(kāi)發(fā)板通電,然后打開(kāi)J-FlashARM軟件,單擊“Target”->“Connect”,連接成功后,LOG窗口會(huì)提示“ConnectedSuccessfully”,接下來(lái)通過(guò)IAR選擇“Project”->“Downloadanddebug”,將程序下載到STM32開(kāi)發(fā)板中。(4)下載完后可以單擊“Debug”->“Go”讓程序全速運(yùn)行;也可以將STM32開(kāi)發(fā)板重新上電或者按下復(fù)位按鈕讓剛才下載的程序重新運(yùn)行。(5)程序成功運(yùn)行后,在串口顯示區(qū)顯示:StartingContiki2.6onSTM32F10xautostart_start:startingprocess'countprocess'autostart_start:startingprocess'printprocess'上一頁(yè)下一頁(yè)返回11.3Contiki系統(tǒng)移植實(shí)例counteris1counteris2counteris3counteris4counteris5counteris6counteris7….上一頁(yè)下一頁(yè)返回11.3Contiki系統(tǒng)移植實(shí)例11.3.4按鍵位檢測(cè)從第4章的實(shí)例可知,按下K1鍵或者K2鍵就會(huì)觸發(fā)1個(gè)按鍵中斷服務(wù)程序,那么在本實(shí)例中,其實(shí)也是一樣的,因?yàn)榘存I中斷服務(wù)程序是最底層的程序,基于Contiki系統(tǒng)要實(shí)現(xiàn)按鍵實(shí)驗(yàn),也脫離不開(kāi)最底層的按鍵中斷服務(wù)程序,Contiki系統(tǒng)沒(méi)有中斷,而是各種各樣的事件,當(dāng)某一事件來(lái)臨時(shí),就會(huì)執(zhí)行相應(yīng)的進(jìn)程代碼。1.實(shí)例要求實(shí)現(xiàn)一個(gè)buttons_test進(jìn)程,在buttons_test進(jìn)程中實(shí)現(xiàn)按鍵位操作即可。2.實(shí)例代碼buttons_test進(jìn)程關(guān)鍵源碼如下:上一頁(yè)下一頁(yè)返回11.3Contiki系統(tǒng)移植實(shí)例PROCESS(buttons_test_process,"ButtonTestProcess");//buttons_test進(jìn)程的定義AUTOSTART_PROCESSES(&buttons_test_process);//button_test進(jìn)程設(shè)置成自啟動(dòng)PROCESS_BEGIN();while(1){PROCESS_WAIT_EVENT_UNTIL(ev==sensors_event);//在sensors_event到來(lái)之前將此進(jìn)程掛起sensor=(structsensors_sensor*)data;if(sensor==&button_1_sensor){//如果檢測(cè)到按鈕1PRINTF("Button1Press\n\r");上一頁(yè)下一頁(yè)返回11.3Contiki系統(tǒng)移植實(shí)例leds_toggle(LEDS_1);//翻轉(zhuǎn)D4}if(sensor==&button_2_sensor){//如果檢測(cè)到按鈕2PRINTF("Button2Press\n\r");leds_toggle(LEDS_2);//翻轉(zhuǎn)D5}}PROCESS_END();為了更好地理解這個(gè)按鍵流程,給出按鍵進(jìn)程部分流程,如圖11-11所示。上一頁(yè)下一頁(yè)返回11.3Contiki系統(tǒng)移植實(shí)例3.實(shí)例結(jié)果(1)正確連接JLINK仿真器、串口線到PC機(jī)和STM32開(kāi)發(fā)板,在PC機(jī)上打開(kāi)串口調(diào)試助手或者超級(jí)終端,設(shè)置接收的波特率為115200。(2)在IARforARM開(kāi)發(fā)環(huán)境中打開(kāi)例程文件(或雙擊key-detect.eww文件)。(3)通過(guò)5V電源適配器給STM32開(kāi)發(fā)板通電,然后打開(kāi)J-FlashARM軟件,單擊“Target”->“Connect”,連接成功后,LOG會(huì)提示“ConnectedSuccessfully”,接下來(lái)通過(guò)IAR選擇“Project”->“Downloadanddebug”將程序下載到STM32開(kāi)發(fā)板中。(4)下載完后可以單擊“Debug”->“Go”讓程序全速運(yùn)行;也可以將STM32開(kāi)發(fā)板重新上電或者按下復(fù)位按鈕讓剛才下載的程序重新運(yùn)行。上一頁(yè)下一頁(yè)返回11.3Contiki系統(tǒng)移植實(shí)例(5)程序成功運(yùn)行后,在STM32開(kāi)發(fā)板上按下K1鍵和K2鍵,可觀察到D4和D5燈點(diǎn)亮,同時(shí)在串口顯示區(qū)有如下顯示:StartingContiki2.6onSTM32F10xautostart_start:startingprocess'ButtonTestProcess'Button1PressButton2Press串口顯示區(qū)的“StartingContiki2.6onSTM32F10x”表明Contiki-OS成功移植到STM32開(kāi)發(fā)板中,“Button1Press”表明button_test進(jìn)程成功被調(diào)用,并執(zhí)行相應(yīng)按鍵檢測(cè)操作。上一頁(yè)下一頁(yè)返回11.3Contiki系統(tǒng)移植實(shí)例11.3.5Timer實(shí)例Contiki系統(tǒng)提供一組timer庫(kù),除用于Contiki系統(tǒng)本身,也可用于應(yīng)用程序。timer庫(kù)包含一些實(shí)用功能,例如檢查一個(gè)時(shí)間周期是否過(guò)期、在預(yù)定時(shí)間將系統(tǒng)從低功耗模式喚醒以及實(shí)時(shí)任務(wù)的調(diào)度。定時(shí)器也可在應(yīng)用程序中使用,以使系統(tǒng)與其他任務(wù)協(xié)調(diào)工作,或使系統(tǒng)在恢復(fù)運(yùn)行前的一段時(shí)間內(nèi)進(jìn)入低功耗模式。Contiki有一個(gè)時(shí)鐘模塊和一組定時(shí)器模塊:timer、stimer、ctimer、etimer、rtimer。其中etimer庫(kù)主要用于調(diào)度事件按預(yù)定時(shí)間周期來(lái)觸發(fā)Contiki系統(tǒng)的進(jìn)程,其可使進(jìn)程等待一段時(shí)間,以便于系統(tǒng)的其他功能運(yùn)行,或在這段時(shí)間讓系統(tǒng)進(jìn)入低功耗模式。上一頁(yè)下一頁(yè)返回11.3Contiki系統(tǒng)移植實(shí)例etimer提供時(shí)間事件,etimer成員的timer包含起始時(shí)刻和間隔時(shí)間,故此timer只記錄到期時(shí)間。通過(guò)比較到期時(shí)間和新的當(dāng)前時(shí)鐘,從而判斷是否到期。當(dāng)etimer時(shí)間到期,會(huì)給相應(yīng)的進(jìn)程傳遞PROCEE_EVENT_TIMER事件,從而使該進(jìn)程運(yùn)行。Contiki系統(tǒng)有一個(gè)全局靜態(tài)變量timerlist,保存各etimer,其是etimer鏈,從第一個(gè)etimer到最后的NULL。1.實(shí)例要求應(yīng)用etimer定時(shí)器模塊,實(shí)現(xiàn)一個(gè)clock_test進(jìn)程,需要在clock_test的執(zhí)行體中實(shí)現(xiàn)定時(shí)器的操作。2.實(shí)例代碼clock_test進(jìn)程關(guān)鍵源碼如下:PROCESS(clock_test_process,"Clocktestprocess");上一頁(yè)下一頁(yè)返回11.3Contiki系統(tǒng)移植實(shí)例AUTOSTART_PROCESSES(&clock_test_process);PROCESS_BEGIN();etimer_set(&et,2*CLOCK_SECOND);PROCESS_YIELD();printf("Clocktickandetimertest,1sec(%uclockticks):\n\r",CLOCK_SECOND);i=0;etimer_reset(&et);sec=clock_seconds();printf("%luseconds\n\r",sec);leds_toggle(LEDS_GREEN);i++;}上一頁(yè)下一頁(yè)返回11.3Contiki系統(tǒng)移植實(shí)例printf("Done!\n\r");PROCESS_END();3.實(shí)例結(jié)果(1)正確連接JLINK仿真器、串口線到PC機(jī)和STM32開(kāi)發(fā)板,在PC機(jī)上打開(kāi)串口調(diào)試助手或者超級(jí)終端,設(shè)置接收的波特率為115200。(2)在IARforARM開(kāi)發(fā)環(huán)境中打開(kāi)例程文件(或雙擊timer-test.eww文件)。(3)通過(guò)5V電源適配器給STM32開(kāi)發(fā)板通電,然后打開(kāi)J-FlashARM軟件,單擊“Target”->“Connect”,連接成功后,LOG窗口會(huì)提示“ConnectedSuccessfully”,接下來(lái)通過(guò)IAR選擇“Project”->“Downloadanddebug”將程序下載到STM32開(kāi)發(fā)板中。上一頁(yè)下一頁(yè)返回11.3Contiki系統(tǒng)移植實(shí)例(4)下載完后可以單擊“Debug”->“Go”讓程序全速運(yùn)行;也可以將STM32開(kāi)發(fā)板重新上電或者按下復(fù)位按鈕讓剛才下載的程序重新運(yùn)行。(5)程序成功運(yùn)行后,此時(shí)在串口顯示區(qū)有如下實(shí)驗(yàn)結(jié)果:StartingContiki2.6onSTM32F10xautostart_start:startingprocess'Clocktestprocess'Clocktickandetimertest,1sec(100clockticks):300ticks400ticks500ticks600ticks700ticks上一頁(yè)下一頁(yè)返回11.3Contiki系統(tǒng)移植實(shí)例800ticks900ticks1000ticks1100ticks1200ticksClocksecondstest(5s):17seconds22seconds27seconds32seconds37seconds上一頁(yè)下一頁(yè)返回11.3Contiki系統(tǒng)移植實(shí)例42seconds47seconds52seconds57seconds62secondsDone!串口顯示“StartingContiki2.6onSTM32F10x”表明Contiki-OS成功移植到STM32開(kāi)發(fā)板。上一頁(yè)下一頁(yè)返回11.3Contiki系統(tǒng)移植實(shí)例11.3.6LCD屏顯示實(shí)例基于Contiki系統(tǒng)的LCD屏顯示,主要分成兩部分:LCD屏驅(qū)動(dòng)的實(shí)現(xiàn)、LCD屏顯示進(jìn)程的實(shí)現(xiàn)。LCD屏驅(qū)動(dòng)的實(shí)現(xiàn)參見(jiàn)本書(shū)第6.4節(jié)實(shí)例內(nèi)容,本節(jié)主要實(shí)現(xiàn)LCD屏顯示進(jìn)程。1.實(shí)例要求實(shí)現(xiàn)LCD屏驅(qū)動(dòng)和LCD屏顯示進(jìn)程,讓LCD屏分行顯示不同顏色的“ThisisaLCDexample”。2.實(shí)例代碼下面是LCD屏顯示進(jìn)程的實(shí)現(xiàn)源碼:PROCESS(lcd_process,"lcdprocess");//定義LC

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論