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

提交评论