android、virtualbox跨界编译及动态迁移云平台系统研发大学本科毕业论文.doc

上传人:知****量 文档编号:91620331 上传时间:2023-05-27 格式:DOC 页数:44 大小:1.19MB
返回 下载 相关 举报
android、virtualbox跨界编译及动态迁移云平台系统研发大学本科毕业论文.doc_第1页
第1页 / 共44页
android、virtualbox跨界编译及动态迁移云平台系统研发大学本科毕业论文.doc_第2页
第2页 / 共44页
点击查看更多>>
资源描述

《android、virtualbox跨界编译及动态迁移云平台系统研发大学本科毕业论文.doc》由会员分享,可在线阅读,更多相关《android、virtualbox跨界编译及动态迁移云平台系统研发大学本科毕业论文.doc(44页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、本科毕业设计(论文)题目:Android/VirtualBox跨界编译 及动态迁移云平台系统研发 学 院 电子与信息学院 专 业 信息工程 学生姓名 学生学号 指导教师 陆以勤 提交日期 2015 年 5 月 20 日 摘 要Contiki微操作系统作为一种小型的,开源的,极易移植的微操作系统。由于其对硬件平台要求较低,所以被广泛地用于无线网络传感器等低功耗应用场景。另外由于其小型化,给系统跨平台迁移提供了可能性。本文首先简要介绍了Contiki操作系统、GCC编译、交叉编译、TCP/IP通信和通信加密算法等跨界编译和调度的基础,并对Contiki系统架构、源代码和进程调度做了研究分析。接着详

2、细介绍了Contiki系统在Linux和Android虚拟机的跨平台编译,以及Contiki系统在不同Linux虚拟机之间、Linux和Android之间的动态迁移,为以后在大型并发运算系统架构上提供一个可行的参考方案。先将大计算量分解成若干个小的计算量,通过Contiki进程触发机制,让其运行在每个Contiki上。再通过平台的迁移自动运行,可实现多个Contiki的多方位交叉与计算并发,这对于Contiki系统的多平台运行有着重要意义,也这为以后物联网时代奠定一个新的系统解决方案。 实验结果及截图表明,本文建立相应的跨平台编译链,通过系统调用,在程序中实现了自动编译功能。并且通过建立网络传

3、输通道,实现了不同平台间的动态迁移。这些也进一步验证了以Contiki为基础的计算并发系统解决方案的可行性。关键词:Contiki微操作系统;Linux;安卓虚拟机;跨平台编译;迁移AbstractMicro Contiki operating system is a small, open-source, easy-to-transplant micro operating system.Because of its lower requirements for hardware platform, it is widely used in wireless network sensors

4、and other low-power application scenarios.And because of its miniaturization, it provides the possibility for the system cross platform migration.This paper first briefly introduces some basic knowledge of cross compilation and scheduling,such as Contiki operating system,GCC compilation,cross compil

5、ation,TCP/IP communication and so on.Next the Contiki system architecture, source code and process scheduling are studied and analyzed.Then this paper mainly introduces the automatic compiling and migrating of Contiki system between different Android/Linux virtual machines, which provides a feasible

6、 scheme for reference for the future in large-scale concurrent computing system architecture .First, the large amount of computation is decomposed into a number of small computational quantities.Using Contiki process trigger mechanism, it runs on each Contiki.Then through the migration of the platfo

7、rm automatically, the multi directions and computing concurrency of multiple Contiki can be realized.This is important for the multi platform operation of the Contiki system, and it also lays a new system solution for the future IOT era.Experimental results and screenshots show that this paper reali

8、zes the automatic compiling function in the program through establishing the cross platform compile chain, and then the system call.And through the establishment of the network transmission channel, the dynamic transfer between different platforms is realized.These are also further verified the feas

9、ibility of Contiki based computing concurrent system solution.Keyword: Micro Contiki operating system; Linux; Android virtual machine; cross compilation; transplantationII目 录摘 要IAbstractII第一章 绪 论11.1 课题背景和意义11.2 课题的国内外发展现状11.3 课题研究主要目标及工作21.4 论文内容安排2第二章 动态迁移系统设计32.1 系统架构32.2 系统设计52.2.1 Contiki系统说明52

10、.2.2 Linux下GCC编译52.2.3 交叉编译的介绍62.2.4 TCP/IP简介72.2.5 信息加密简介82.3 本章小结8第三章 Contiki微型虚拟机研究93.1 Contiki源码分析93.2 Contiki进程触发示例103.2.1 Protothreads103.2.2 进程控制模块113.2.3 进程调度123.3 本章小结17第四章 Linux/Android跨平台编译研究184.1 Contiki在Linux下的编译184.2 Contiki在Android环境下的编译224.2.1 交叉编译工具链的建立224.2.2 Makefile文件编写234.2.3 编译

11、过程244.2.4 自动编译254.3 本章小结25第五章 系统动态迁移研究265.1 网络传输研究265.1.1 TCP协议265.1.2 Socket套接字265.2 RSA_AES加密算法研究275.2.1 RSA加密算法研究275.2.2 AES加密算法研究275.3 动态迁移框架研究28III5.4 本章小结32第六章 系统测试与评价336.1 运行测试336.2 系统评价356.3 本章小结35结 论36致 谢37参考文献38IV第一章 绪 论1.1 课题背景和意义随着网络通信技术的发展和趋于成熟,人类社会正向全面的信息化时代迈进,跟随着时代的步伐,物联网技术也慢慢发展起来1。所谓

12、物联网,即物物连接的互联网,它是利用局部网络或互联网等通信技术把传感器、控制器、机器、人员和物等通过新的方式联在一起,形成人与物、物与物相联,实现信息化、远程管理控制和智能化的网络,通过物联网,人类可以实现无处不在的计算机和网络连接,对人类社会的发展产生重大贡献,而Contiki就是专门为物联网开发的开源操作系统。Contiki 是一个小型的,开源的,极易移植的多任务电脑操作系统。它专门设计以适用于一系列的内存有限的网络系统,包括从8位电脑到微型控制器的嵌入系统,适用于联网嵌入式系统和无线传感器网络。Contiki只需几KB的代码和几百字节的内存就能提供多任务环境和内建TCP/IP支持。Con

13、tiki完全C语言开发、易于移植、支持大量的硬件平台和开发工具、事件驱动机制占用内存小、集成了多种无线传感器网络协议、无专利和版权费、集成仿真工具等特点和优势,已经成为无线传感器网络学术研究和产品开发的理想平台,在欧洲已经得到广泛应用,并逐渐得到其它地区开发人员的支持。随着物联网、无线传感器网络的发展,IP地址将耗尽,骨干网络必将升级到IPv6,因此6Lowpan标准被越来越多的标准化组织所采纳,研发6lowpan的人员将越来越多,这将使得Contiki很可能成为嵌入系统中的Linux,在物联网领域得到广泛应用,发挥重要作用。1.2 课题的国内外发展现状目前,随着物联网的发展,基于IPv6的无

14、线传感器网络的可行得到了一系列的标准,比如6LoWPAN,是一种基于IPv6的低耗无线个人区域网络规格。Contiki嵌入式操作系统是一个重要的开源系统,多平台特定设备工作实现6LoWPAN功能2。它的RFC兼容TCP/IP堆栈功能,提供支持6LoWPAN和很多关联标准。同时,uIP堆栈被整合进Contiki移植操作系统,也增强支持IPv6(uIPv6)。另外,Contiki操作系统包含了一个RPL路由协议的实现,相当于成熟的6LoWPAN支持(IPv6数据包解压和压缩)。Contiki已经被设计的以轻便为主,成功地用于多种硬件平台。Contiki成为无线传感器网络学术研究和产品开发的理想平台

15、,在欧洲已经得到广泛应用,并逐渐得到其它地区开发人员的支持。随着物联网、无线传感器网络的发展,IP地址将耗尽,骨干网络必将升级到IPv6,因此6LoWPAN标准被越来越多的标准化组织所采纳,研发6LoWPAN的人员将越来越多,这将使得Contiki很可能成为嵌入系统中的Linux,在物联网领域得到广泛应用,发挥重要作用。1.3 课题研究主要目标及工作本课题研究的主要任务是在云平台服务器上安装部署一种称为“方舟”的Linux+GCC系统的虚拟机,能够对C语言编写的Cell(计算机细胞)进行Android虚拟机VirtualBox虚拟机平台的交叉编译;并且用C语言开发一套自动迁移程序,能够把Cel

16、l的源代码在“方舟”之间加密传输,并且自动编译运行。其中,Cell(计算机细胞)就是指在Contiki操作系统。要实现以上目标,需要进行如下研究工作:1)了解Contiki操作系统、Android/VirtualBox跨界交叉编译、操作系统进程调度的概念。2)安装两个VirtualBox虚拟机,在此基础上分别配置Linux和Android for x86。3)在上述安装的Linux平台中,手工编译Contiki操作系统。4)在Linux虚拟机上编译出Android上运行的可执行代码(交叉编译),然后手工复制可执行代码到Android平台上运行。5)Linux虚拟机之间的Contiki编译与迁移

17、自动化6)实现Linux到Android平台的可执行代码自动迁移和运行。1.4 论文内容安排本文主要研究了Contiki微操作系统在Android/VirtualBox的跨界编译及动态迁移,第一章绪论主要对Contiki微操作系统以及关于Contiki微操作系统的发展现状做简单的介绍,第二章介绍了Contiki操作系统、GCC编译、交叉编译、TCP/IP通信和通信加密算法等跨界编译和调度的基础知识,第三章介绍了交叉编译链建立的过程,实现Contiki微操作系统在Android/Linux的跨界编译,第四章介绍了RSA_AES加密算法的原理和加密步骤,并详细介绍了Contiki系统在不同Linu

18、x虚拟机之间、Linux和Android之间动态迁移的实现过程,最后为总结结论,对课题的展望等。第二章 动态迁移系统设计2.1 系统架构 课题的系统框图如图2-1所示。 图2-2 Android/VirtualBox跨界编译及动态 迁移云平台系统框图 系统包括Linux虚拟机、Android虚拟机和虚拟网关三大模块。根据课题目标,制定如下实现方案:1) Linux虚拟机 在windows平台下,采用VirtualBox虚拟机软件安装Linux操作系统,目标使用Ubuntu版本,为以Android为目标机的Contiki源码提供编译环境。 VirtualBox是免费虚拟机软件,它不仅具有丰富的特

19、色,而且性能也很优异。它简单易用,可虚拟的系统包括Windows、Mac OS X、Linux、OpenBSD、Solaris、IBM OS2甚至Android 4.0系统等操作系统使用者可以在VirtualBox上安装并且运行上述的这些操作系统与同性质的VMware及Virtual PC比较下,VirtualBox独到之处包括远端桌面协定(RDP)、iSCSI及USB的支持。 Ubuntu是一个以桌面应用为主的Linux操作系统,十分契合英特尔的超极本定位,支持x86、64位和ppc架构 全面支持网页浏览器 WPS。Ubuntu对GNU/Linux的普及特别是桌面普及作出了巨大贡献,由此使更

20、多人共享开源的成果与精彩。在本系统中,我们使该虚拟机具备虚拟网卡,可与多台android虚拟机及Linux虚拟机通过虚拟网关,通过网络拓扑连接进行网络通信,以便完成整个系统实验。2) 编译环境搭建及编译 Linux虚拟机之间的系统迁移,我们只需编写源码Makefile文件,使用系统自带的GCC编译器实现Contiki的编译。但是为了实现跨平台系统迁移,我们还需要实现Contiki在Android环境下的编译,并编写源码Makefile文件,交叉编译Contiki源码,生成Android目标机的编译文件。最初考虑一下两种方案: 方案一是做安卓下的NDK编译,方案二是建立LINUX-ARM交叉编译

21、链,在底层实现跨界编译。下面就这两种方案进行讨论。方案一:NDK是安卓开发的一个工具集3,集成了Android 的交叉编译环境,并提供了一套比较方便的 Makefile ,可以帮助开发者快速开发 C 或是 C+ 的动态库,并自动的将 so 和java程序打包成 apk ,在 Android 上运行。但是由于Contiki本身没有安卓版本,编译不通过,故该方案失败。方案二:建立LINUX-ARM交叉编译链,将目标程序编译成Android for x86能运行的可执行代码,从而实现Contiki在Android环境下的编译,此过程即是Android/VirtualBox跨界编译。3) 文件迁移及自

22、动加载 Linux集成了uIP协议栈,包含IPv4 和 IPv6 两种协议栈版本,支持 TCP、UDP、ICMP等协议,并有一套完整的uIP API。 本程序采用TCP通信模式,编写核心C程序,通过TCP/IP用RSA+AES加密传输Contiki编译文件到另一台Linux虚拟机,虚拟机间通过虚拟网关进行数据传输。由于Android底层仍为Linux内核,故该传输方法在Android上同样可用。 相应虚拟机接收程序接收到Contiki编译文件后,我们将自动加载Contiki虚拟机进程,执行相应应用程序。2.2 系统设计2.2.1 Contiki系统说明1) Contiki操作系统工作原理 Co

23、ntiki操作系统是基于事件驱动(Event-driven)内核的操作系统,在此内核上,应用程序可以在运行时动态加载,非常灵活4。在事件驱动内核基础上,Contiki实现了一种轻量级的名为protothread的线程模型,来实现线性的、类似于线程的编程风格。该模型类似于Linux和windows中线程的概念,多个线程共享同一个任务栈,从而减少RAM占用。Contiki还提供一种可选的任务抢占机制、基于事件和消息传递的进程间通信机制。Contiki中还包括一个可选的GUI子系统,可以提供对本地串口终端、基于VNC的网络化虚拟显示或者Telnet的图形化支持。 Contiki系统内部集成了两种类型

24、的无线传感器网络协议栈:uIP 和 Rime。uIP是一个小型的符合RFC规范的TCP/IP协议栈,使得Contiki可以直接和Internet通信。uIP包含了IPv4和IPv6两种协议栈版本,支持TCP、UDP、ICMP等协议,但是编译时只能二选一,不可以同时使用。Rime是一个轻量级为低功耗无线传感器网络设计的协议栈,该协议栈提供了大量的通信原语,能够实现从简单的一跳广播通信,到复杂的可靠多跳数据传输等通信功能。2) Contiki操作系统的特点Contiki完全C语言开发、易于移植、支持大量的硬件平台和开发工具、事件驱动机制占用内存小、集成了多种无线传感器网络协议、无专利和版权费、集成

25、仿真工具等特点和优势,已经成为无线传感器网络学术研究和产品开发的理想平台,在欧洲已经得到广泛应用,并逐渐得到其它地区开发人员的支持。2.2.2 Linux下GCC编译1) GCC工作原理 Linux系统下的GCC(GNU C Compiler)是GNU推出的功能强大、性能优越的多平台编译器,是GNU的代表作品之一。gcc是可以在多种硬体平台上编译出可执行程序的超级编译器,其执行效率与一般的编译器相比平均效率要高20%30%。 GCC编译器能将C、C+语言源程序、汇程式化序和目标程序编译、连接成可执行文件,如果没有给出可执行文件的名字,gcc将生成一个名为a.out的文件。在Linux系统中,可

26、执行文件没有统一的后缀,系统从文件的属性来区分可执行文件和不可执行文件。而gcc则通过后缀来区别输入文件的类别,下面我们来介绍gcc所遵循的部分约定规则5。 .c为后缀的文件,C语言源代码文件; .a为后缀的文件,是由目标文件构成的档案库文件; .C,.cc或.cxx 为后缀的文件,是C+源代码文件; .h为后缀的文件,是程序所包含的头文件; .i 为后缀的文件,是已经预处理过的C源代码文件; .ii为后缀的文件,是已经预处理过的C+源代码文件; .m为后缀的文件,是Objective-C源代码文件; .o为后缀的文件,是编译后的目标文件; .s为后缀的文件,是汇编语言源代码文件; .S为后缀

27、的文件,是经过预编译的汇编语言源代码文件。 2)GCC执行过程预处理(也称预编译,Preprocessing)、编译(Compilation)、汇编(Assembly)和连接(Linking)。 3)GCC基本用法GCC最基本的用法是gcc options filenames 其中options就是编译器所需要的参数,filenames给出相关的文件名称。 -c,只编译,不连接成为可执行文件,编译器只是由输入的.c等源代码文件生成.o为后缀的目标文件,通常用于编译不包含主程序的子程序文件。 -o output_filename,确定输出文件的名称为output_filename,同时这个名称不

28、能和源文件同名。如果不给出这个选项,gcc就给出预设的可执行文件a.out。 -g,产生符号调试工具(GNU的gdb)所必要的符号资讯,要想对源代码进行调试,我们就必须加入这个选项。 -O,对程序进行优化编译、连接,采用这个选项,整个源代码会在编译、连接过程中进行优化处理,这样产生的可执行文件的执行效率可以提高,但是,编译、连接的速度就相应地要慢一些。 -O2,比-O更好的优化编译、连接,当然整个编译、连接过程会更慢。 -Idirname,将dirname所指出的目录加入到程序头文件目录列表中,是在预编译过程中使用的参数。2.2.3 交叉编译的介绍 所谓交叉编译就是在一个平台上生成可以再另一个

29、平台上执行的代码,编译的最主要的工作就是在将程序转化成运行该程序的CPU所能识别的机器代码,由于不同的体系结构有不同的指令系统。因此,不同的CPU需要有相应的编译器,而交叉编译就如同翻译一样,把相同的的程序代码翻译成不同CPU的对应可执行二进制文件。要注意的是,编译器本身也是程序,也要在与之对应的某一个CPU平台上运行。 一般将交叉编译的主机称为宿主机,也就是普通的通用PC,而将程序实际的运行环境称为目标机,也就是嵌入式系统环境6。由于一般通用计算机拥有分层丰富的系统资源、使用方便的集成开发环境和调试工具等,而嵌入式系统的系统资源非常紧缺,无法在其上运行相关的编译工具,因此,嵌入式系统的开发需

30、要借助宿主机(通用计算机)来编译出目标机的可执行代码,交叉编译的过程如图2-2所示。图2-2 交叉编译的过程本文移植所用的宿主机环境是virtualbox虚拟机搭建的linux系统,要实现移植需要建立交叉编译工具链,将目标程序编译成Android for arm能运行的可执行代码。2.2.4 TCP/IP简介 TCP/IP 指传输控制协议/网际协议 (TransmissionControlProtocol /Internet Protocol),它是供已连接因特网的计算机进行通信的通信协议,定义了电子设备(比如计算机)如何连入因特网,以及数据如何在它们之间传输的标准。 TCP 和 IP 在一起

31、协同工作7。其中,TCP 负责应用软件(比如你的浏览器)和网络软件之间的通信,它将数据分割并装入 IP 包,然后在它们到达的时候重新组合它们。当应用程序希望通过 TCP 与另一个应用程序通信时,它会发送一个通信请求。这个请求必须被送到一个确切的地址。在双方“握手”之后,TCP 将在两个应用程序之间建立一个全双工 (full-duplex) 的通信。这个全双工的通信将占用两个计算机之间的通信线路,直到它被一方或双方关闭为止。而IP 负责计算机之间的通信,它将包发送至接受者。通过 IP,消息(或者其他数据)被分割为小的独立的包,并通过因特网在计算机之间传送。 在 TCP/IP 中包含一系列用于处理

32、数据通信的协议:TCP (传输控制协议) - 应用程序之间通信UDP (用户数据包协议) - 应用程序之间的简单通信IP (网际协议) - 计算机之间的通信ICMP (因特网消息控制协议) - 针对错误和状态DHCP (动态主机配置协议) - 针对动态寻址2.2.5 信息加密简介 信息安全是非常重要的,与人们的工作、生活有着密切的关系。信息加密技术主要分为传榆加密和存储加密两方面,而信息传输加密常用有链路加密、节点加密和端到端加密这三种主要方式8。信息加密算法是网络传输中最常用的算法,目的是对传输中的数据流加密,以防止通信线路上的窃听、泄漏、篡改和破坏.加密技术分为对称加密和非对称加密两类。1

33、)对称加密技术在对称加密技术中,对信息的加密和解密都使用相同的钥(通常称之为“SessionKey”)。这种加密方法可简化加密处理过程,信息交换双方都不必彼此研究和交换专用的加密算法。常用的算法包括:DES(Data Encryption Standard):数据加密标准,速度较快,适用于加密大量数据的场合。3DES(Triple DES):是基于DES,对一块数据用三个不同的密钥进行三次加密,强度更高。AES(Advanced Encryption Standard):高级加密标准,是下一代的加密算法标准,速度快,安全级别高;2)非对称加密技术非对称加密体系中,密钥被分解为一对(即公钥和私钥

34、)。公钥用于加密,私有密钥用于解密,私钥只能由生成密钥的交换方掌握,公开密钥可广泛公布,但它只对应于生成密钥的交换方。非对称加密方式可以使通信双方无须事先交换密钥就可以建立安全通信,广泛应用于身份认证、数字签名等信息交换领域。常见的算法如下:RSA:由 RSA 公司发明,是一个支持变长密钥的公共密钥算法,需要加密的文件块的长度也是可变的;DSA(Digital Signature Algorithm):数字签名算法,是一种标准的 DSS(数字签名标准);ECC(Elliptic Curves Cryptography):椭圆曲线密码编码学。 本文使用的加密算法主要是通过融合RSA和AES,结合

35、对称加密和非对称加密的优点,使数据保密更加可靠。2.3 本章小结 本章首先介绍了本课题的系统框图,对系统的每个模块的功能和实现过程进行了简要分析。由宿主Linux主机对Contiki进行GCC编译后,加密传输到目的虚拟机执行相应应用程序。接着介绍了Contiki操作系统、GCC编译、交叉编译、TCP/IP通信和通信加密算法等方面的知识,为后续章节跨界编译和动态迁移奠定理论基础。第三章 Contiki微型虚拟机研究3.1 Contiki源码分析Contiki微操作系统架构为模块化架构,内核基于事件驱动模型,对每个单独的进程都提供可选的线程设施,每个应用程序都可以调用服务程序9,Contiki的系

36、统模块化架构如图3 - 1所示。图3- 1 Contiki系统模块化架构 接下来对Contiki源代码进行分析,本文研究的Contiki - 2.7为例,打开Contiki源文件目录,可以看到主要有apps、core、cpu、doc、examples、platform、tools等目录。下面将分别对各个目录进行介绍。Core:core目录下是Contiki的核心源代码,包括网络(net)、文件系统(cfs)、外部设备(dev)、链接库(lib)等等,并且包含了时钟、I/O、ELF装载器、网络驱动等的抽象。 Cpu:cpu目录下是Contiki目前支持的微处理器,例如arm、avr、msp430

37、等等。如果需要支持新的微处理器,可以在这里添加相应的源代码。 Platform:platform目录下是Contiki支持的硬件平台,例如mx231cc、micaz、sky、win32等等。Contiki的平台移植主要在这个目录下完成。这一部分的代码与相应的硬件平台相关。 Apps:apps目录下是一些应用程序,例如ftp、shell、webserver等等,在项目程序开发过程中可以直接使用。使用这些应用程序的方式为,在项目的Makefile中,定义APPS = 应用程序名称。在以后的示例中会具体看到如何使用apps。 Examples:examples目录下是针对不同平台的示例程序。Smes

38、hlink的示例程序也在其中。 Doc:doc目录是Contiki帮助文档目录,对Contiki应用程序开发很有参考价值。使用前需要先用Doxygen进行编译。 Tools:tools目录下是开发过程中常用的一些工具,例如CFS相关的makefsdata、网络相关的tunslip、模拟器cooja和mspsim等等。3.2 Contiki进程触发示例进程无疑是一个系统最重要的概述。Contiki的进程机制是基于protothreads线程模型。为确保高优先级任务尽快得到响应,Contiki采用两级进程调度10。3.2.1 Protothreads Contiki使用Protothreads轻量

39、级线程模型,在Protothreads基础上进行封装。传统的桌面操作系统甚至服务器操作系统,每个进程都拥有自己的栈,在进行进程切换时,将进程相关信息(包括局部变量、断点、寄存器值)存储在栈中。然而,对于嵌入式系统,尤其是内存受限的传感器节点几乎不现实,基于这点考虑,Protothreads巧妙地让所有进程共用一个栈,传统的进程与Protothreads对比示意图如图3-2所示。图3- 2 传统进程与Protothreads对比示意图 从图可以看出,原本需要3个栈的Thread机制,在Protothreads只需要一个栈。当进程在数量很多的时候,由栈空间省下来的内存是相当可观的。保存程序断点在传

40、统的Thread机制很简单,只需要保存私有的栈,然而Protothreads不能将断点保存在公有栈中。Protothreads很巧妙地解决了这个问题,即用一个两字节静态变量存储被中断的行,因为静态变量不从栈上分配空间,所以即使有任务切换也不会影响到该变量,从而达到保存短点的目的。下一次该进程获得执行权的时候,进入函数体后就通过switch语句跳转到上一次被中断的地方。1)保存断点 保存断点是通过保存行数来完成的。在被中断的地方插入编译器关键字_LINE_,编译器便自动记录所中断的行数。展开那些具有中断功能的宏,可以发现最后保存行数是宏LC_SET,取宏PROCESS_WAIT_EVENT()为

41、例,将其展开得到如下代码:#define PROCESS_WAIT_EVENT() PROCESS_YIELD()#define PROCESS_YIELD() PT_YIELD(process_pt)#define PT_YIELD(pt)do PT_YIELD_FLAG=0; LC_SET(pt)-lc); if(PT_YIELD_FLAG=0) return PT_YIELDED; while(0) 值得一提的是,宏LC_SET展开包含语句case_LINE_,用于下次恢复断点,即下次通过switch语句便可跳转到case的下一语句。2)恢复断点被中断程序再次获得执行权时,便从该进程的函

42、数的执行体进入,按照Contiki的进程替换,函数体的第一条语句便是PROCESS_BEGIN宏,该宏包含一条switch语句。用于上一次被中断的行,从而恢复执行,使PROCESS_BEGIN展开的源代码如下:#define PROCESS_BEGIN() PT_BEGIN(process_pt)#define PT_BEGIN(pt) char PT_YIELD_FLAG = 1; LC_RESUME(pt)-lc)#define LC_RESUME(s)switch(s) case 0 ; /switch 语言跳转到被中断的行3.2.2 进程控制模块 正如Linux一样。Contiki也用

43、一个结构来描述整个过程的细节,所不同的是,Contiki进程控制块要简单得多。使用链表将系统所有进程组织起来,如图3-3所示:图3-3 Contiki进程控制块 Contiki系统定义了一个全局变量process_list作为进程链表的头,还定义了一个全局变量process_current用于指向当前进程。成员变量next指向下一个进程,最后一进程的next指向空。Name是进程的名称,可将系统配置(定义变量PROCESS_CONF_NO_ PROCESS _NAMES为0)成没有进程名称,此时name为空字符串。变量state表示进程的状态,共3种,即PROCESS_STATE_RUNNIN

44、G、PROCESS_STATE_CALLED、PROCESS_STATE_NONE。变量needspoll标识进程优先级,只有两个值0和1,needspoll为1意味着进程具有更高的优先级。1)进程变量thread进程的执行体,即进程执行实际上是运行该函数。在实际的进程结构体代码中,该变量由宏PT_THREAD封装,展开即为一个函数指针,关键代码如下:PT_THREAD(*thread)(struct pt *,process_event_t,process_data_t);#define PT_THREAD(name_args) char name_args/*宏展开*/char(*thre

45、ad)(struct pt*,process_event_t,process_data_t);2)成员变量ptContiki的进程是基于Protothreads,所以进程控制模块需要有变量记录被中断的行数。结构体pt只有一个成员变量lc(无符号短整型),可以将pt简单理解成保存行数的,相关源代码如下:struct pt lc_t lc;typedef unsigned short lc_t;3.2.3 进程调度 Contiki只有两种优先级,用进程控制块中变量needspoll标识,默认情况是0,即普通优先级。想要将某进程设为更高优先级,可以在创建之初指定其needspoll为1,或者运行过程

46、中通过设置该变量动态提升其优先级。在实际的调度中,会先运行有高优先级的进程,而后再去处理一个事件,随后又运行所有高优先级的进程。通过遍历整个进程链表,将needspoll为1的进程投入运行,关键代码如下:/*do_poll()关键代码,由process_run调用*/for(p=process_list; p!=NULL;p=p-next) /遍历进程链表 if(p-needspoll) p-state =PROCESS_STATE_RUNNING;p-needspoll=0;Call_process(p,PROCESS_EVENT_POLL,NULL); /将进程投入运行 以上是进程的总体调度

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

当前位置:首页 > 教育专区 > 教案示例

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁