实验15—基于IPv6模块的进程间交互的实验讲解(共15页).doc
《实验15—基于IPv6模块的进程间交互的实验讲解(共15页).doc》由会员分享,可在线阅读,更多相关《实验15—基于IPv6模块的进程间交互的实验讲解(共15页).doc(15页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、精选优质文档-倾情为你奉上实验题目:实验15基于IPv6模块的进程间交互的实验 实验时间:2016.1.4一、 实验目的:了解Cygwin开发环境及Contiki系统相关内容。了解Contiki系统进程间交互的理论掌握IPv6模块的编程及下载使用方法。二、 实验原理及程序分析:1、Contiki 中事件驱动和protothread机制Contiki的两个主要机制:事件驱动和protothread机制,前者是为了降低功耗,后者是为了节省内存。事件驱动嵌入式系统常常被设计成响应周围环境的变化,而这些变化可以看成一个个事件。事件来了,操作系统处理之,没有事件到来,就跑去休眠了(降低功耗),这就是所谓
2、的事件驱动,类似于中断。1、 事件结构体事件也是Contiki重要的数据结构,其定义如下:struct event_dataprocess_event_t ev;process_data_t data;structprocess*p;typedef unsigned char process_event_t;typedef void * process_data_t;各成员变量含义如下:ev-标识所产生事件data-保存事件产生时获得的相关信息,即事件产生后可以给进程传递的数据p-指向监听该事件的进程2、 事件分类事件可以被分为三类:时钟事件(timer events)、外部事件、内部事件。那
3、么,Contiki核心数据结构就只有进程和事件了,把etimer理解成一种特殊的事件。3、 事件队列Contiki用环形队列组织所有事件(用数组存储),如下:static struct event_data eventsPROCESS_CONF_NUMEVENTS;图示事件队列如下:4、 系统定义的事件系统定义了10个事件,源码和注释如下:#ifndef PROCESS_CONF_NUMEVENTS#define PROCESS_CONF_NUMEVENTS 32#endif#define PROCESS_EVENT_NONE 0x80 / 函数dhcpc_request 调用handle_d
4、hcp(PROCESS_EVENT_NONE,NULL)#define PROCESS_EVENT_INIT 0x81 /启动一个进程process_start,通过传递该事件#define PROCESS_EVENT_POLL 0x82 /在PROCESS_THREAD(etimer_process, ev, data)使用到#define PROCESS_EVENT_EXIT 0x83 /进程退出,传递该事件给进程主体函数thread#define PROCESS_EVENT_SERVICE_REMOVED 0x84#define PROCESS_EVENT_CONTINUE 0x85 /
5、PROCESS_PAUSE宏用到这个事件#define PROCESS_EVENT_MSG 0x86#define PROCESS_EVENT_EXITED 0x87 /进程退出,传递该事件给其他进程#define PROCESS_EVENT_TIMER 0x88 /etimer到期时,传递该事件#define PROCESS_EVENT_COM 0x89#define PROCESS_EVENT_MAX 0x8a /*进程初始化时,让lastevent=PROCESS_EVENT_MAX,即新产生的事件从0x8b开始,函数process_alloc_event用于分配一个新的事件*/注:PR
6、OCESS_EVENT_EXIT 与PROCESS_EVENT_EXITED区别事件PROCESS_EVENT_EXIT 用于传递给进程的主体函数thread,如在exit_process函数中的p-thread(&p-pt, PROCESS_EVENT_EXIT, NULL)。而PROCESS_EVENT_EXITED用于传递给进程,如call_process(q, PROCESS_EVENT_EXITED, (process_data_t)p)。(助记:EXITED 是完成式,发给进程,让整个进程结束。而g一般式EXIT,发给进程主体thread,只是使其退出thread)5、 一个特殊事
7、件如果事件结构体event_data的成员变量p指向PROCESS_BROADCAST,则该事件是一个广播事件。在do_event函数中,若事件的p指向的是PROCESS_BROADCAST,则让进程链表process_list所有进程投入运行。部分源码如下:#define PROCESS_BROADCAST NULL /广播进程/*保存待处理事件的成员变量*/ev = eventsfevent.ev;data = eventsfevent.data;receiver=eventsfevent.p;if(receiver=PROCESS_BROADCAST)for(p = process_li
8、st; p != NULL; p = p-next)if(poll_requested)do_poll();call_process(p, ev, data);protothread 机制1. 概述protothread是contiki的进程控制模型,是contiki关于进程的精华知识。传统的操作系统使用栈保存进程上下文,每个进程需要一个栈,这对于内存极度受限的传感器设备将难以忍受。protothread机制恰解决了这个问题,通过保存进程被阻塞处的行数(进程结构体的一个变量,unsiged short类型,只需两个字节),从而实现进程切换,当该进程下一次被调度时,通过switch(_LINE_
9、)跳转到刚才保存的点,恢复执行。整个Contiki只用一个栈,当进程切换时清空,大大节省内存。2. 特点protothread(- Lightweight, Stackless Threads in C)最大特点就是轻量级,每个protothread不需要自己的堆栈,所有的protothread使用同一个堆栈,而保存程序断点用两个字节保存被中断的行数即可。具体特点如下:Very small RAM overhead - only two bytes per protothread and no extra stacksHighly portable - the protothreads lib
10、rary is 100% pure C and no architecture specific assembly codeCan be used with or without an OSProvides blocking wait without full multi-threading or stack-switchingFreely available under a BSD-like open source licenseprotothread机制很早就有了,Contiki OS只要运用这种机制,protothread机制还可以用于以下情形:Memory constrained sy
11、stemsEvent-driven protocol stacksSmall embedded systemsSensor network nodesPortable C applications3. 编程提示谨慎使用局部变量。当进程切换时,因protothread没有保存堆栈上下文(只使用两个字节保存被中断的行号),故局部变量得不到保存。这就要求使用局部变量要特别小心,一个好的解决方法,使用局部静态变量(加static修饰符),如此,该变量在整个生命周期都存在。4. 调度A protothread is driven by repeated calls to the function in
12、which the protothread is running.Each time the function is called, the protothread will run until it blocks or exits. Thus the scheduling ofprotothreads is done by the application that uses protothreads.5. protothread模型之代码分析6. 当第一次执行这个函数时,便会执行PT_YIELD_FLAG = 1。因为(process_pt)-lc被初始化为0,所以就直接输出hello wo
13、rld。当进入到while循环时:while(1)/* Wait for an event. */PROCESS_WAIT_EVENT();doPT_YIELD_FLAG = 0;(process_pt)-lc = _LINE_; case _LINE_: ;if(PT_YIELD_FLAG = 0)return 1; while(0);/* Got the timers event */当这个process收到一个事件再次被执行的时候,首先会进行初始化,让PT_YIELD_FLAG = 1,接着进入switch语句,因为(process_pt)-lc已经被保存,所以这次process直接跳到
14、了上次的执行结束的地方重新开始执行了,因为PT_YIELD_FLAG 已经是1了,所以就不会return了。就会继续执行上次执行的代码。所以(process_pt)-lc相当于保持了现场,下次函数再运行的时候就可以通过switch语句迅速找到执行代码语句的入口,恢复现场,继续执行。执行完毕后,接着while循环,return后,再等待事件,一直循环。2、Contiki 中进程概念进程结构体进程结构体源码如下:struct processstructprocess*next;/指向下一个进程/*进程名称*/#if PROCESS_CONF_NO_PROCESS_NAMES#define PROC
15、ESS_NAME_STRING(process) #elseconstchar*name;#define PROCESS_NAME_STRING(process) (process)-name#endifPT_THREAD(*thread)(struct pt *, process_event_t, process_data_t); /structpt pt; /unsigned char state; /unsigned char needspoll; /;1、 进程名称运用C 语言预编译指令,可以配置进程名称,宏PROCESS_NAME_STRING(process)用于返回进程proce
16、ss名称,若系统无配置进程名称,则返回空字符串。在以后讨论中,均假设配有进程名称。2、 PT_THREAD宏PT_THREAD宏定义如下:#define PT_THREAD(name_args) char name_args故“PT_THREAD(*thread)(struct pt *, process_event_t, process_Data_t); ”语句展开如下:char (*thread)(struct pt *, process_event_t, process_data_t);声明一个函数指针thread,指向的是一个含有3个参数,返回值为char类型的函数。这是进程的主体,当
17、进程执行时,主要是执行这个函数的内容。另,声明一个进程包含在宏PROCESS(name, strname) 里,通过宏AUTOSTART_PROCESSES(.) 将进程加入自启动数组中。3、 Ptpt结构体一步步展开如下:struct ptlc_t lc;typedef unsigned short lc_t;如此,可以把struct pt pt直接理解成unsigned short lc,以后如无特殊说明,pt就直接理解成lc。lc(localcontinuations)用于保存程序被中断的行数(只需两个字节,这恰是protothread轻量级的集中体现),被中断的地方,保存行数(s=_L
18、INE_)接着是语句case _LINE_。当该进程再次被调度时,从PROCESS_BEGIN()开始执行,而该宏展开含有这条语句switch(process_pt-pt),从而跳到上一次被中断的地方(即case_LINE_),继续执行。4、 进程状态进程共3个状态,宏定义如下:#define PROCESS_STATE_NONE 0 /*类似于Linux系统的僵尸状态,进程已退出,只是还没从进程链表删除*/#define PROCESS_STATE_RUNNING 1 /*进程正在执行*/#define PROCESS_STATE_CALLED 2 /*实际上是返回,并保存lc值*/5、 N
19、eedspoll简而言之,needspoll为1的进程有更高的优先级。具体表现为,当系统调用process_run()函数时,把所有needspoll标志为1的进程投入运行,而后才从事件队列取出下一个事件传递给相应的监听进程。与needspoll相关的另一个变量poll_requested,用于标识系统是否存在高优先级进程,即标记系统是否有进程的needspoll为1。static volatile unsigned char poll_requested;进程链表基于上述分析,将代码展开或简化,得到如下进程链表process_list:创建进程及启动进程创建进程主要由PROCESS 宏(声明
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验 15 基于 IPv6 模块 进程 交互 讲解
限制150内