Contiki-系統移植課件_第1頁
Contiki-系統移植課件_第2頁
Contiki-系統移植課件_第3頁
Contiki-系統移植課件_第4頁
Contiki-系統移植課件_第5頁
已閱讀5頁,還剩125頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

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

溫馨提示

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

評論

0/150

提交評論