实验15—基于ipv6模块的进程间交互的实验

上传人:第*** 文档编号:31417186 上传时间:2018-02-07 格式:DOC 页数:14 大小:678KB
返回 下载 相关 举报
实验15—基于ipv6模块的进程间交互的实验_第1页
第1页 / 共14页
实验15—基于ipv6模块的进程间交互的实验_第2页
第2页 / 共14页
实验15—基于ipv6模块的进程间交互的实验_第3页
第3页 / 共14页
实验15—基于ipv6模块的进程间交互的实验_第4页
第4页 / 共14页
实验15—基于ipv6模块的进程间交互的实验_第5页
第5页 / 共14页
点击查看更多>>
资源描述

《实验15—基于ipv6模块的进程间交互的实验》由会员分享,可在线阅读,更多相关《实验15—基于ipv6模块的进程间交互的实验(14页珍藏版)》请在金锄头文库上搜索。

1、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)、外部事件、内部事件。那么,Co

3、ntiki核心数据结构就只有进程和事件了,把etimer理解成一种特殊的事件。3、 事件队列Contiki用环形队列组织所有事件(用数组存储),如下:static struct event_data eventsPROCESS_CONF_NUMEVENTS;图示事件队列如下:24、 系统定义的事件系统定义了10个事件,源码和注释如下:#ifndef PROCESS_CONF_NUMEVENTS#define PROCESS_CONF_NUMEVENTS 32#endif#define PROCESS_EVENT_NONE 0x80 / 函数dhcpc_request 调用handle_dhcp

4、(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 /PRO

5、CESS_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用于分配一个新的事件*/注:PROCE

6、SS_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_3BROADCAST,则让进程链表process_list所有进程投入运行。部分源码如下:#define PROCESS_BROADCAST NULL /广播进程/*保存待处理事件的成员变量*/ev = eventsfevent.ev;data = eventsfevent.data;receiver=eventsfevent.p;if(receiver=PROCESS_BROADCAST)for(p = process_list

8、; 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 libra

10、ry 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 syst

11、emsEvent-driven protocol stacksSmall embedded systemsSensor network nodes4Portable C applications3. 编程提示谨慎使用局部变量。当进程切换时,因protothread没有保存堆栈上下文(只使用两个字节保存被中断的行号),故局部变量得不到保存。这就要求使用局部变量要特别小心,一个好的解决方法,使用局部静态变量(加static修饰符),如此,该变量在整个生命周期都存在。4. 调度A protothread is driven by repeated calls to the function in w

12、hich 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 wor

13、ld。当进入到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 中进程概念进程结构体5进程结构体源码如下: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类型的函数。这是进程的主体,当进程执行时,主要是执行这个函数的内容。另,声明一个进程包含在宏PROCESS(name, strname) 里,通过宏AUTOSTART_PROCESSES(.) 将进

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 其它办公文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号