畢業(yè)論文-AndroidVirtualBox跨界編譯及動(dòng)態(tài) 遷移云平臺系統(tǒng)研發(fā)_第1頁
畢業(yè)論文-AndroidVirtualBox跨界編譯及動(dòng)態(tài) 遷移云平臺系統(tǒng)研發(fā)_第2頁
畢業(yè)論文-AndroidVirtualBox跨界編譯及動(dòng)態(tài) 遷移云平臺系統(tǒng)研發(fā)_第3頁
畢業(yè)論文-AndroidVirtualBox跨界編譯及動(dòng)態(tài) 遷移云平臺系統(tǒng)研發(fā)_第4頁
畢業(yè)論文-AndroidVirtualBox跨界編譯及動(dòng)態(tài) 遷移云平臺系統(tǒng)研發(fā)_第5頁
已閱讀5頁,還剩40頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、 MACROBUTTON MTEditEquationSection2 SEQ MTEqn r h * MERGEFORMAT SEQ MTSec r 1 h * MERGEFORMAT SEQ MTChap r 2 h * MERGEFORMAT 本科畢業(yè)設(shè)計(jì)(論文)題目:Android/VirtualBox跨界編譯及動(dòng)態(tài) 遷移云平臺系統(tǒng)研發(fā) 學(xué) 院 電子與信息學(xué)院 專 業(yè) 學(xué)生姓名 學(xué)生學(xué)號 指導(dǎo)教師 提交日期 2015 年 5 月 20 日 摘 要Contiki微操作系統(tǒng)作為一種小型的,開源的,極易移植的微操作系統(tǒng),在物聯(lián)網(wǎng)日益發(fā)展的今天,因?yàn)樗嗥脚_特定設(shè)備工作實(shí)現(xiàn)6LoWPAN功能,

2、它的RFC兼容TCP/IP堆棧功能,提供支持給6LoWPAN和很多關(guān)聯(lián)標(biāo)準(zhǔn),因此被廣泛地用于無線網(wǎng)絡(luò)傳感器。本文主要詳細(xì)地介紹了Contiki微操作系統(tǒng)在Android/Linux跨界編譯的原理及過程,并且開發(fā)出Contiki系統(tǒng)在不同的Android/Linux虛擬機(jī)之間遷移的調(diào)度程序,這對于Contiki系統(tǒng)的多平臺運(yùn)行有重要的意義。本文首先簡要介紹了Contiki操作系統(tǒng)、GCC編譯、交叉編譯、TCP/IP通信和通信加密算法等跨界編譯和調(diào)度的基礎(chǔ),并對Contiki系統(tǒng)架構(gòu)、源代碼和進(jìn)程調(diào)度做了研究分析,通過建立交叉編譯鏈,實(shí)現(xiàn)Contiki操作系統(tǒng)在Android/Linux的跨界編譯

3、。接著介紹了RSA_AES加密算法的原理和加密步驟,在此基礎(chǔ)上實(shí)現(xiàn)Contiki系統(tǒng)在不同Linux虛擬機(jī)之間、Linux和Android之間的動(dòng)態(tài)遷移。 從實(shí)驗(yàn)結(jié)果以及截圖可知實(shí)現(xiàn)了Contiki系統(tǒng)在Linux和Android虛擬機(jī)的跨平臺編譯,并且實(shí)現(xiàn)了Contiki系統(tǒng)在不同Linux虛擬機(jī)之間、Linux和Android之間的動(dòng)態(tài)遷移,一定程度上解決了題目的要求。關(guān)鍵詞:Contiki微操作系統(tǒng);Linux;安卓虛擬機(jī);跨平臺編譯;遷移Abstract Micro Contiki operating system is a small, open-source, easy-to-tr

4、ansplant micro operating system, in growing things today, because it is more work to achieve a specific device platform 6LoWPAN functionality , and it has a RFC -compliant TCP / IP stack functions provide support for 6LoWPAN and many related standards, which is widely used in wireless sensor network

5、s . This paper describes in detail the principle and process of the micro Contiki operating system to compile in Android/Linux platform.And it also develops the transplantation program between different Android/Linux virtual machines for Contiki system, which is very important for Contiki to run in

6、multi-platform systems.This paper first briefly introduces some basic knowledge of cross compilation and scheduling,such as Contiki operating system,GCC compilation,cross compilation,TCP/IP communication and so on.Next the Contiki system architecture, source code and process scheduling are studied a

7、nd analyzed,using the establishment of cross compile chain, the cross compiling of Contiki operating system in Android/Linux is realized.Then it introduces the RSA, AES encryption algorithm and encryption step, finally the transplantation program between different Android/Linux virtual machines for

8、Contiki system succeeded.The experimental results and the screenshot show that Contiki operating system compiles in Android/Linux platform,and the transplantation program between different Android/Linux virtual machines for Contiki system also succeeded. All is a certain extent to solve the requirem

9、ents of the subject .Keyword: MicroContiki operating system; Linux; Android virtual machine; cross compilation; transplantation目 錄TOC o 1-3 h u HYPERLINK l _Toc316 摘 要 緒 論1.1 課題背景和意義隨著網(wǎng)絡(luò)通信技術(shù)的發(fā)展和趨于成熟,人類社會正向全面的信息化時(shí)代邁進(jìn),跟隨著時(shí)代的步伐,物聯(lián)網(wǎng)技術(shù)也慢慢發(fā)展起來。所謂物聯(lián)網(wǎng),即物物連接的互聯(lián)網(wǎng),它是利用局部網(wǎng)絡(luò)或互聯(lián)網(wǎng)等通信技術(shù)把傳感器、控制器、機(jī)器、人員和物等通過新的方式聯(lián)在一起,形

10、成人與物、物與物相聯(lián),實(shí)現(xiàn)HYPERLINK /view/27.htm信息化、遠(yuǎn)程管理控制和HYPERLINK /view/335547.htm智能化的網(wǎng)絡(luò),通過物聯(lián)網(wǎng),人類可以實(shí)現(xiàn)無處不在的計(jì)算機(jī)和網(wǎng)絡(luò)連接,對人類社會的發(fā)展產(chǎn)生重大貢獻(xiàn),而Contiki就是專門為物聯(lián)網(wǎng)開發(fā)的開源操作系統(tǒng)。Contiki 是一個(gè)小型的,開源的,極易移植的多任務(wù)電腦操作系統(tǒng)。它專門設(shè)計(jì)以適用于一系列的內(nèi)存有限的網(wǎng)絡(luò)系統(tǒng),包括從8位電腦到微型控制器的嵌入系統(tǒng),適用于聯(lián)網(wǎng)嵌入式系統(tǒng)和無線傳感器網(wǎng)絡(luò)。Contiki只需幾KB的代碼和幾百字節(jié)的內(nèi)存就能提供多任務(wù)環(huán)境和內(nèi)建TCP/IP支持。Contiki完全C語言開發(fā)、

11、易于移植、支持大量的硬件平臺和開發(fā)工具、事件驅(qū)動(dòng)機(jī)制占用內(nèi)存小、集成了多種無線傳感器網(wǎng)絡(luò)協(xié)議、無專利和版權(quán)費(fèi)、集成仿真工具等特點(diǎn)和優(yōu)勢,已經(jīng)成為無線傳感器網(wǎng)絡(luò)學(xué)術(shù)研究和產(chǎn)品開發(fā)的理想平臺,在歐洲已經(jīng)得到廣泛應(yīng)用,并逐漸得到其它地區(qū)開發(fā)人員的支持。隨著物聯(lián)網(wǎng)、無線傳感器網(wǎng)絡(luò)的發(fā)展,IP地址將耗盡,骨干網(wǎng)絡(luò)必將升級到IPv6,因此6Lowpan標(biāo)準(zhǔn)被越來越多的標(biāo)準(zhǔn)化組織所采納,研發(fā)6lowpan的人員將越來越多,這將使得Contiki很可能成為嵌入系統(tǒng)中的Linux,在物聯(lián)網(wǎng)領(lǐng)域得到廣泛應(yīng)用,發(fā)揮重要作用。1.2 課題的國內(nèi)外發(fā)展現(xiàn)狀目前,隨著物聯(lián)網(wǎng)的發(fā)展,基于IPv6的無線傳感器網(wǎng)絡(luò)的可行得到了

12、一系列的標(biāo)準(zhǔn),比如6LoWPAN,是一種基于IPv6的低耗無線個(gè)人區(qū)域網(wǎng)絡(luò)規(guī)格。Contiki嵌入式操作系統(tǒng)是一個(gè)重要的開源系統(tǒng),多平臺特定設(shè)備工作實(shí)現(xiàn)6LoWPAN功能。它的RFC兼容TCP/IP堆棧功能,提供支持6LoWPAN和很多關(guān)聯(lián)標(biāo)準(zhǔn)。同時(shí),uIP堆棧被整合進(jìn)Contiki移植操作系統(tǒng),也增強(qiáng)支持IPv6(uIPv6)。另外,Contiki操作系統(tǒng)包含了一個(gè)RPL路由協(xié)議的實(shí)現(xiàn),相當(dāng)于成熟的6LoWPAN支持(IPv6數(shù)據(jù)包解壓和壓縮)。Contiki已經(jīng)被設(shè)計(jì)的以輕便為主,成功地用于多種硬件平臺。Contiki成為無線傳感器網(wǎng)絡(luò)學(xué)術(shù)研究和產(chǎn)品開發(fā)的理想平臺,在歐洲已經(jīng)得到廣泛應(yīng)用,

13、并逐漸得到其它地區(qū)開發(fā)人員的支持。隨著物聯(lián)網(wǎng)、無線傳感器網(wǎng)絡(luò)的發(fā)展,IP地址將耗盡,骨干網(wǎng)絡(luò)必將升級到IPv6,因此6LoWPAN標(biāo)準(zhǔn)被越來越多的標(biāo)準(zhǔn)化組織所采納,研發(fā)6LoWPAN的人員將越來越多,這將使得Contiki很可能成為嵌入系統(tǒng)中的Linux,在物聯(lián)網(wǎng)領(lǐng)域得到廣泛應(yīng)用,發(fā)揮重要作用。1.3 課題研究主要目標(biāo)及工作本課題研究的主要任務(wù)是在云平臺服務(wù)器上安裝部署一種稱為“方舟”的Linux+GCC系統(tǒng)的虛擬機(jī),能夠?qū)語言編寫的Cell(計(jì)算機(jī)細(xì)胞)進(jìn)行Android虛擬機(jī)VirtualBox虛擬機(jī)平臺的交叉編譯;并且用C語言開發(fā)一套自動(dòng)遷移程序,能夠把Cell的源代碼在“方舟”之間加

14、密傳輸,并且自動(dòng)編譯運(yùn)行。其中,Cell(計(jì)算機(jī)細(xì)胞)就是指在Contiki操作系統(tǒng)。要實(shí)現(xiàn)以上目標(biāo),需要進(jìn)行如下研究工作:了解Contiki操作系統(tǒng)、Android/VirtualBox跨界交叉編譯、操作系統(tǒng)進(jìn)程調(diào)度的概念。安裝兩個(gè)VirtualBox虛擬機(jī),在此基礎(chǔ)上分別配置Linux和Android for x86。在上述安裝的Linux平臺中,手工編譯Contiki操作系統(tǒng)。在Linux虛擬機(jī)上編譯出Android上運(yùn)行的可執(zhí)行代碼(交叉編譯),然后手工復(fù)制可執(zhí)行代碼到Android平臺上運(yùn)行。Linux虛擬機(jī)之間的Contiki編譯與遷移自動(dòng)化實(shí)現(xiàn)Linux到Android平臺的可執(zhí)

15、行代碼自動(dòng)遷移和運(yùn)行。1.4 論文內(nèi)容安排本文主要研究了Contiki微操作系統(tǒng)在Android/VirtualBox的跨界編譯及動(dòng)態(tài)遷移,第一章緒論主要對Contiki微操作系統(tǒng)以及關(guān)于Contiki微操作系統(tǒng)的發(fā)展現(xiàn)狀做簡單的介紹,第二章介紹了Contiki操作系統(tǒng)、GCC編譯、交叉編譯、TCP/IP通信和通信加密算法等跨界編譯和調(diào)度的基礎(chǔ)知識,第三章介紹了交叉編譯鏈建立的過程,實(shí)現(xiàn)Contiki微操作系統(tǒng)在Android/Linux的跨界編譯,第四章介紹了RSA_AES加密算法的原理和加密步驟,并詳細(xì)介紹了Contiki系統(tǒng)在不同Linux虛擬機(jī)之間、Linux和Android之間動(dòng)態(tài)遷

16、移的實(shí)現(xiàn)過程,最后為總結(jié)結(jié)論,對課題的展望等。系統(tǒng)框架簡介2.1 系統(tǒng)架構(gòu) 課題的系統(tǒng)框圖如圖2- SEQ 圖 * ARABIC s 1 1所示。 圖2- SEQ 圖 * ARABIC s 1 1 Android/VirtualBox跨界編譯及動(dòng)態(tài) 遷移云平臺系統(tǒng)框圖 系統(tǒng)包括Linux虛擬機(jī)、Android虛擬機(jī)和虛擬網(wǎng)關(guān)三大模塊。根據(jù)課題目標(biāo),制定如下實(shí)現(xiàn)方案:Linux虛擬機(jī) 在windows平臺下,采用VirtualBox虛擬機(jī)軟件安裝Linux操作系統(tǒng),目標(biāo)使用Ubuntu版本,為以Android為目標(biāo)機(jī)的Contiki源碼提供編譯環(huán)境。 VirtualBox是免費(fèi)虛擬機(jī)軟件,它不僅

17、具有豐富的特色,而且性能也很優(yōu)異。它簡單易用,可虛擬的系統(tǒng)包括Windows、Mac OS X、 HYPERLINK /view/1634.htm t _blank Linux、 HYPERLINK /view/337596.htm t _blank OpenBSD、 HYPERLINK /subview/329359/5113665.htm t _blank Solaris、IBM OS2甚至 HYPERLINK /view/4535527.htm t _blank Android 4.0系統(tǒng)等操作系統(tǒng)!使用者可以在VirtualBox上安裝并且運(yùn)行上述的這些操作系統(tǒng)! 與同性質(zhì)的VMwar

18、e及Virtual PC比較下,VirtualBox獨(dú)到之處包括遠(yuǎn)端桌面協(xié)定(RDP)、iSCSI及USB的支持。 Ubuntu是一個(gè)以 HYPERLINK /view/79807.htm t _blank 桌面應(yīng)用為主的 HYPERLINK /view/46577.htm t _blank Linux操作系統(tǒng),十分契合英特爾的超極本定位,支持x86、64位和ppc架構(gòu) 全面支持網(wǎng)頁瀏覽器 WPS。Ubuntu對 HYPERLINK /view/2560767.htm t _blank GNU/Linux的普及特別是桌面普及作出了巨大貢獻(xiàn),由此使更多人共享開源的成果與精彩。在本系統(tǒng)中,我們使該

19、虛擬機(jī)具備虛擬網(wǎng)卡,可與多臺android虛擬機(jī)及Linux虛擬機(jī)通過虛擬網(wǎng)關(guān),通過網(wǎng)絡(luò)拓?fù)溥B接進(jìn)行網(wǎng)絡(luò)通信,以便完成整個(gè)系統(tǒng)實(shí)驗(yàn)。編譯環(huán)境搭建及編譯 Linux虛擬機(jī)之間的系統(tǒng)遷移,我們只需編寫源碼Makefile文件,使用系統(tǒng)自帶的GCC編譯器實(shí)現(xiàn)Contiki的編譯。但是為了實(shí)現(xiàn)跨平臺系統(tǒng)遷移,我們還需要實(shí)現(xiàn)Contiki在Android環(huán)境下的編譯,并編寫源碼Makefile文件,交叉編譯Contiki源碼,生成Android目標(biāo)機(jī)的編譯文件。最初考慮一下兩種方案: 方案一是做安卓下的NDK編譯,方案二是建立LINUX-ARM交叉編譯鏈,在底層實(shí)現(xiàn)跨界編譯。下面就這兩種方案進(jìn)行討論。方

20、案一:NDK是安卓開發(fā)的一個(gè)工具集,集成了 Android 的交叉編譯環(huán)境,并提供了一套比較方便的 Makefile ,可以幫助開發(fā)者快速開發(fā) C 或是 C+ 的動(dòng)態(tài)庫,并自動(dòng)的將 so 和 HYPERLINK /cpro/ui/uijs.php?c=news&cf=5&ch=0&di=8&fv=11&jk=a60069801b9e4eed&k=java&k0=java&kdi0=0&luki=9&n=10&p=baidu&q=baidusiteerror_cpr&rb=0&rs=1&seller_id=1&sid=ed4e9e1b806900a6&ssp2=1&stid=0&t=tpclic

21、ked3_hc&tu=u1615258&u=/html/201207/4690329.html&urlid=0 t /html/201207/_blank java程序打包成 apk ,在 Android 上運(yùn)行。但是由于Contiki本身沒有安卓版本,編譯不通過,故該方案失敗。方案二:建立LINUX-ARM交叉編譯鏈,將目標(biāo)程序編譯成Android for x86能運(yùn)行的可執(zhí)行代碼,從而實(shí)現(xiàn)Contiki在Android環(huán)境下的編譯,此過程即是Android/VirtualBox跨界編譯。文件遷移及自動(dòng)加載 Linux集成了uIP協(xié)議棧,包含IPv4 和 IPv6 兩種協(xié)議棧版本,支持 TC

22、P、UDP、ICMP等協(xié)議,并有一套完整的uIP API。 本程序采用TCP通信模式,編寫核心C程序,通過TCP/IP用RSA+AES加密傳輸Contiki編譯文件到另一臺Linux虛擬機(jī),虛擬機(jī)間通過虛擬網(wǎng)關(guān)進(jìn)行數(shù)據(jù)傳輸。由于Android底層仍為Linux內(nèi)核,故該傳輸方法在Android上同樣可用。 相應(yīng)虛擬機(jī)接收程序接收到Contiki編譯文件后,我們將自動(dòng)加載Contiki虛擬機(jī)進(jìn)程,執(zhí)行相應(yīng)應(yīng)用程序。2.2 系統(tǒng)設(shè)計(jì)2.2.1 Contiki系統(tǒng)說明Contiki操作系統(tǒng)工作原理 Contiki操作系統(tǒng)是基于事件驅(qū)動(dòng)(Event-driven)內(nèi)核的操作系統(tǒng),在此內(nèi)核上,應(yīng)用程序可

23、以在運(yùn)行時(shí)動(dòng)態(tài)加載,非常靈活。在事件驅(qū)動(dòng)內(nèi)核基礎(chǔ)上,Contiki實(shí)現(xiàn)了一種輕量級的名為protothread的線程模型,來實(shí)現(xiàn)線性的、類似于線程的編程風(fēng)格。該模型類似于Linux和windows中線程的概念,多個(gè)線程共享同一個(gè)任務(wù)棧,從而減少RAM占用。Contiki還提供一種可選的任務(wù)搶占機(jī)制、基于事件和消息傳遞的進(jìn)程間通信機(jī)制。Contiki中還包括一個(gè)可選的GUI子系統(tǒng),可以提供對本地串口終端、基于VNC的網(wǎng)絡(luò)化虛擬顯示或者Telnet的圖形化支持。 Contiki系統(tǒng)內(nèi)部集成了兩種類型的無線傳感器網(wǎng)絡(luò)協(xié)議棧:uIP 和 Rime。uIP是一個(gè)小型的符合RFC規(guī)范的TCP/IP協(xié)議棧,

24、使得Contiki可以直接和Internet通信。uIP包含了IPv4和IPv6兩種協(xié)議棧版本,支持TCP、UDP、ICMP等協(xié)議,但是編譯時(shí)只能二選一,不可以同時(shí)使用。Rime是一個(gè)輕量級為低功耗無線傳感器網(wǎng)絡(luò)設(shè)計(jì)的協(xié)議棧,該協(xié)議棧提供了大量的通信原語,能夠?qū)崿F(xiàn)從簡單的一跳廣播通信,到復(fù)雜的可靠多跳數(shù)據(jù)傳輸?shù)韧ㄐ殴δ堋?)Contiki操作系統(tǒng)的特點(diǎn)Contiki完全C語言開發(fā)、易于移植、支持大量的硬件平臺和開發(fā)工具、事件驅(qū)動(dòng)機(jī)制占用內(nèi)存小、集成了多種無線傳感器網(wǎng)絡(luò)協(xié)議、無專利和版權(quán)費(fèi)、集成仿真工具等特點(diǎn)和優(yōu)勢,已經(jīng)成為無線傳感器網(wǎng)絡(luò)學(xué)術(shù)研究和產(chǎn)品開發(fā)的理想平臺,在歐洲已經(jīng)得到廣泛應(yīng)用,并逐

25、漸得到其它地區(qū)開發(fā)人員的支持。2.2.2 Linux下GCC編譯GCC工作原理 Linux系統(tǒng)下的GCC(GNU C Compiler)是GNU推出的功能強(qiáng)大、性能優(yōu)越的多平臺編譯器,是GNU的代表作品之一。gcc是可以在多種硬體平臺上編譯出可執(zhí)行程序的超級編譯器,其執(zhí)行效率與一般的編譯器相比平均效率要高20%30%。 GCC編譯器能將C、C+語言源程序、匯程式化序和目標(biāo)程序編譯、連接成可執(zhí)行文件,如果沒有給出可執(zhí)行文件的名字,gcc將生成一個(gè)名為a.out的文件。在Linux系統(tǒng)中,可執(zhí)行文件沒有統(tǒng)一的后綴,系統(tǒng)從文件的屬性來區(qū)分可執(zhí)行文件和不可執(zhí)行文件。而gcc則通過后綴來區(qū)別輸入文件的類

26、別,下面我們來介紹gcc所遵循的部分約定規(guī)則。 .c為后綴的文件,C語言源代碼文件; .a為后綴的文件,是由目標(biāo)文件構(gòu)成的檔案庫文件; .C,.cc或.cxx 為后綴的文件,是C+源代碼文件; .h為后綴的文件,是程序所包含的頭文件; .i 為后綴的文件,是已經(jīng)預(yù)處理過的C源代碼文件; .ii為后綴的文件,是已經(jīng)預(yù)處理過的C+源代碼文件; .m為后綴的文件,是Objective-C源代碼文件; .o為后綴的文件,是編譯后的目標(biāo)文件; .s為后綴的文件,是匯編語言源代碼文件; .S為后綴的文件,是經(jīng)過預(yù)編譯的匯編語言源代碼文件。 2)GCC執(zhí)行過程預(yù)處理(也稱預(yù)編譯,Preprocessing)

27、、編譯(Compilation)、匯編(Assembly)和連接(Linking)。 3)GCC基本用法GCC最基本的用法是gcc options filenames 其中options就是編譯器所需要的參數(shù),filenames給出相關(guān)的文件名稱。 -c,只編譯,不連接成為可執(zhí)行文件,編譯器只是由輸入的.c等源代碼文件生成.o為后綴的目標(biāo)文件,通常用于編譯不包含主程序的子程序文件。 -o output_filename,確定輸出文件的名稱為output_filename,同時(shí)這個(gè)名稱不能和源文件同名。如果不給出這個(gè)選項(xiàng),gcc就給出預(yù)設(shè)的可執(zhí)行文件a.out。 -g,產(chǎn)生符號調(diào)試工具(GNU的

28、gdb)所必要的符號資訊,要想對源代碼進(jìn)行調(diào)試,我們就必須加入這個(gè)選項(xiàng)。 -O,對程序進(jìn)行優(yōu)化編譯、連接,采用這個(gè)選項(xiàng),整個(gè)源代碼會在編譯、連接過程中進(jìn)行優(yōu)化處理,這樣產(chǎn)生的可執(zhí)行文件的執(zhí)行效率可以提高,但是,編譯、連接的速度就相應(yīng)地要慢一些。 -O2,比-O更好的優(yōu)化編譯、連接,當(dāng)然整個(gè)編譯、連接過程會更慢。 -Idirname,將dirname所指出的目錄加入到程序頭文件目錄列表中,是在預(yù)編譯過程中使用的參數(shù)。2.2.3 交叉編譯的介紹 所謂交叉編譯就是在一個(gè)平臺上生成可以再另一個(gè)平臺上執(zhí)行的代碼,編譯的最主要的工作就是在將程序轉(zhuǎn)化成運(yùn)行該程序的CPU所能識別的機(jī)器代碼,由于不同的體系結(jié)構(gòu)

29、有不同的指令系統(tǒng)。因此,不同的CPU需要有相應(yīng)的編譯器,而交叉編譯就如同翻譯一樣,把相同的的程序代碼翻譯成不同CPU的對應(yīng)可執(zhí)行二進(jìn)制文件。要注意的是,編譯器本身也是程序,也要在與之對應(yīng)的某一個(gè)CPU平臺上運(yùn)行。 一般將交叉編譯的主機(jī)稱為宿主機(jī),也就是普通的通用PC,而將程序?qū)嶋H的運(yùn)行環(huán)境稱為目標(biāo)機(jī),也就是嵌入式系統(tǒng)環(huán)境。由于一般通用計(jì)算機(jī)擁有分層豐富的系統(tǒng)資源、使用方便的集成開發(fā)環(huán)境和調(diào)試工具等,而嵌入式系統(tǒng)的系統(tǒng)資源非常緊缺,無法在其上運(yùn)行相關(guān)的編譯工具,因此,嵌入式系統(tǒng)的開發(fā)需要借助宿主機(jī)(通用計(jì)算機(jī))來編譯出目標(biāo)機(jī)的可執(zhí)行代碼,交叉編譯的過程如圖2-2所示。 圖2-2 交叉編譯的過程本

30、文移植所用的宿主機(jī)環(huán)境是virtualbox虛擬機(jī)搭建的linux系統(tǒng),要實(shí)現(xiàn)移植需要建立交叉編譯工具鏈,將目標(biāo)程序編譯成Android for arm能運(yùn)行的可執(zhí)行代碼。2.2.4 TCP/IP簡介 TCP/IP 指傳輸控制協(xié)議/網(wǎng)際協(xié)議 (TransmissionControlProtocol /Internet Protocol),它是供已連接因特網(wǎng)的計(jì)算機(jī)進(jìn)行通信的通信協(xié)議,定義了電子設(shè)備(比如計(jì)算機(jī))如何連入因特網(wǎng),以及數(shù)據(jù)如何在它們之間傳輸?shù)臉?biāo)準(zhǔn)。 TCP 和 IP 在一起協(xié)同工作。其中,TCP 負(fù)責(zé)應(yīng)用軟件(比如你的瀏覽器)和網(wǎng)絡(luò)軟件之間的通信,它將數(shù)據(jù)分割并裝入 IP 包,然后

31、在它們到達(dá)的時(shí)候重新組合它們。當(dāng)應(yīng)用程序希望通過 TCP 與另一個(gè)應(yīng)用程序通信時(shí),它會發(fā)送一個(gè)通信請求。這個(gè)請求必須被送到一個(gè)確切的地址。在雙方“握手”之后,TCP 將在兩個(gè)應(yīng)用程序之間建立一個(gè)全雙工 (full-duplex) 的通信。這個(gè)全雙工的通信將占用兩個(gè)計(jì)算機(jī)之間的通信線路,直到它被一方或雙方關(guān)閉為止。而IP 負(fù)責(zé)計(jì)算機(jī)之間的通信,它將包發(fā)送至接受者。通過 IP,消息(或者其他數(shù)據(jù))被分割為小的獨(dú)立的包,并通過因特網(wǎng)在計(jì)算機(jī)之間傳送。 在 TCP/IP 中包含一系列用于處理數(shù)據(jù)通信的協(xié)議:TCP (傳輸控制協(xié)議) - 應(yīng)用程序之間通信UDP (用戶數(shù)據(jù)包協(xié)議) - 應(yīng)用程序之間的簡單

32、通信IP (網(wǎng)際協(xié)議) - 計(jì)算機(jī)之間的通信ICMP (因特網(wǎng)消息控制協(xié)議) - 針對錯(cuò)誤和狀態(tài)DHCP (動(dòng)態(tài)主機(jī)配置協(xié)議) - 針對動(dòng)態(tài)尋址2.2.5 信息加密簡介 信息安全是非常重要的,與人們的工作、生活有著密切的關(guān)系.信息加密技術(shù)主要分為傳榆加密和存儲加密兩方面,而信息傳輸加密常用有鏈路加密、節(jié)點(diǎn)加密和端到端加密這三種主要方式,信息加密算法是網(wǎng)絡(luò)傳輸中最常用的算法,目的是對傳輸中的數(shù)據(jù)流加密,以防止通信線路上的竊聽、泄漏、篡改和破壞.加密技術(shù)分為對稱加密和非對稱加密兩類。1)對稱加密技術(shù)在對稱加密技術(shù)中,對信息的加密和解密都使用相同的鑰(通常稱之為“SessionKey”)。這種加密方

33、法可簡化加密處理過程,信息交換雙方都不必彼此研究和交換專用的加密算法。常用的算法包括:DES(Data Encryption Standard):數(shù)據(jù)加密標(biāo)準(zhǔn),速度較快,適用于加密大量數(shù)據(jù)的場合。3DES(Triple DES):是基于DES,對一塊數(shù)據(jù)用三個(gè)不同的密鑰進(jìn)行三次加密,強(qiáng)度更高。AES(Advanced Encryption Standard):高級加密標(biāo)準(zhǔn),是下一代的加密算法標(biāo)準(zhǔn),速度快,安全級別高;2)非對稱加密技術(shù)非對稱加密體系中,密鑰被分解為一對(即公鑰和私鑰)。公鑰用于加密,私有密鑰用于解密,私鑰只能由生成密鑰的交換方掌握,公開密鑰可廣泛公布,但它只對應(yīng)于生成密鑰的交換

34、方。非對稱加密方式可以使通信雙方無須事先交換密鑰就可以建立安全通信,廣泛應(yīng)用于身份認(rèn)證、數(shù)字簽名等信息交換領(lǐng)域。常見的算法如下:RSA:由 RSA 公司發(fā)明,是一個(gè)支持變長密鑰的公共密鑰算法,需要加密的文件塊的長度也是可變的;DSA(Digital Signature Algorithm):數(shù)字簽名算法,是一種標(biāo)準(zhǔn)的 DSS(數(shù)字簽名標(biāo)準(zhǔn));ECC(Elliptic Curves Cryptography):橢圓曲線密碼編碼學(xué)。 本文使用的加密算法主要是通過融合RSA和AES,結(jié)合對稱加密和非對稱加密的優(yōu)點(diǎn),使數(shù)據(jù)保密更加可靠。2.3 本章小結(jié) 本章首先介紹了本課題的系統(tǒng)框圖,對系統(tǒng)的每個(gè)模塊

35、的功能和實(shí)現(xiàn)過程進(jìn)行了簡要分析。由宿主Linux主機(jī)對Contiki進(jìn)行GCC編譯后,加密傳輸?shù)侥康奶摂M機(jī)執(zhí)行相應(yīng)應(yīng)用程序。接著介紹了Contiki操作系統(tǒng)、GCC編譯、交叉編譯、TCP/IP通信和通信加密算法等方面的知識,為后續(xù)章節(jié)跨界編譯和動(dòng)態(tài)遷移奠定理論基礎(chǔ)。 Contiki系統(tǒng)研究3.1 Contiki源碼分析Contiki微操作系統(tǒng)架構(gòu)為模塊化架構(gòu),內(nèi)核基于事件驅(qū)動(dòng)模型,對每個(gè)單獨(dú)的進(jìn)程都提供可選的線程設(shè)施,每個(gè)應(yīng)用程序都可以調(diào)用服務(wù)程序2,Contiki的系統(tǒng)模塊化架構(gòu)如圖3 - 1所示。 圖3- 1 Contiki系統(tǒng)模塊化架構(gòu) 接下來對Contiki源代碼進(jìn)行分析,本文研究的C

36、ontiki - 2.7為例,打開Contiki源文件目錄,可以看到主要有apps、core、cpu、doc、examples、platform、tools等目錄。下面將分別對各個(gè)目錄進(jìn)行介紹。Core:core目錄下是Contiki的核心源代碼,包括網(wǎng)絡(luò)(net)、文件系統(tǒng)(cfs)、外部設(shè)備(dev)、鏈接庫(lib)等等,并且包含了時(shí)鐘、I/O、ELF裝載器、網(wǎng)絡(luò)驅(qū)動(dòng)等的抽象。 Cpu:cpu目錄下是Contiki目前支持的微處理器,例如arm、avr、msp430等等。如果需要支持新的微處理器,可以在這里添加相應(yīng)的源代碼。 Platform:platform目錄下是Contiki支持的

37、硬件平臺,例如mx231cc、micaz、sky、win32等等。Contiki的平臺移植主要在這個(gè)目錄下完成。這一部分的代碼與相應(yīng)的硬件平臺相關(guān)。 Apps:apps目錄下是一些應(yīng)用程序,例如ftp、shell、webserver等等,在項(xiàng)目程序開發(fā)過程中可以直接使用。使用這些應(yīng)用程序的方式為,在項(xiàng)目的Makefile中,定義APPS = 應(yīng)用程序名稱。在以后的示例中會具體看到如何使用apps。 Examples:examples目錄下是針對不同平臺的示例程序。Smeshlink的示例程序也在其中。 Doc:doc目錄是Contiki幫助文檔目錄,對Contiki應(yīng)用程序開發(fā)很有參考價(jià)值。使

38、用前需要先用Doxygen進(jìn)行編譯。 Tools:tools目錄下是開發(fā)過程中常用的一些工具,例如CFS相關(guān)的makefsdata、網(wǎng)絡(luò)相關(guān)的tunslip、模擬器cooja和mspsim等等。3.2 Contiki進(jìn)程觸發(fā)示例進(jìn)程無疑是一個(gè)系統(tǒng)最重要的概述。Contiki的進(jìn)程機(jī)制是基于protothreads線程模型。為確保高優(yōu)先級任務(wù)盡快得到響應(yīng),Contiki采用兩級進(jìn)程調(diào)度。3.2.1 Protothreads Contiki使用Protothreads輕量級線程模型,在Protothreads基礎(chǔ)上進(jìn)行封裝。傳統(tǒng)的桌面操作系統(tǒng)甚至服務(wù)器操作系統(tǒng),每個(gè)進(jìn)程都擁有自己的棧,在進(jìn)行進(jìn)程切

39、換時(shí),將進(jìn)程相關(guān)信息(包括局部變量、斷點(diǎn)、寄存器值)存儲在棧中。然而,對于嵌入式系統(tǒng),尤其是內(nèi)存受限的傳感器節(jié)點(diǎn)幾乎不現(xiàn)實(shí),基于這點(diǎn)考慮,Protothreads巧妙地讓所有進(jìn)程共用一個(gè)棧,傳統(tǒng)的進(jìn)程與Protothreads對比示意圖如圖3-2所示。圖3- 2 傳統(tǒng)進(jìn)程與Protothreads對比示意圖 從圖可以看出,原本需要3個(gè)棧的Thread機(jī)制,在Protothreads只需要一個(gè)棧。當(dāng)進(jìn)程在、數(shù)量很多的時(shí)候,由??臻g省下來的內(nèi)存是相當(dāng)可觀的。保存程序斷點(diǎn)在傳統(tǒng)的Thread機(jī)制很簡單,只需要保存私有的棧,然而Protothreads不能將斷點(diǎn)保存在公有棧中。Protothreads

40、很巧妙地解決了這個(gè)問題,即用一個(gè)兩字節(jié)靜態(tài)變量存儲被中斷的行,因?yàn)殪o態(tài)變量不從棧上分配空間,所以即使有任務(wù)切換也不會影響到該變量,從而達(dá)到保存短點(diǎn)的目的。下一次該進(jìn)程獲得執(zhí)行權(quán)的時(shí)候,進(jìn)入函數(shù)體后就通過switch語句跳轉(zhuǎn)到上一次被中斷的地方。1)保存斷點(diǎn) 保存斷點(diǎn)是通過保存行數(shù)來完成的。在被中斷的地方插入編譯器關(guān)鍵字_LINE_,編譯器便自動(dòng)記錄所中斷的行數(shù)。展開那些具有中斷功能的宏,可以發(fā)現(xiàn)最后保存行數(shù)是宏LC_SET,取宏P(guān)ROCESS_WAIT_EVENT()為例,將其展開得到如下代碼:#define PROCESS_WAIT_EVENT() PROCESS_YIELD()#defin

41、e 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_,用于下次恢復(fù)斷點(diǎn),即下次通過switch語句便可跳轉(zhuǎn)到case的下一語句。2)恢復(fù)斷點(diǎn)被中斷程序再次獲得執(zhí)行權(quán)時(shí),便從該進(jìn)程的函數(shù)的執(zhí)行體進(jìn)入,按照Contiki的進(jìn)

42、程替換,函數(shù)體的第一條語句便是PROCESS_BEGIN宏,該宏包含一條switch語句。用于上一次被中斷的行,從而恢復(fù)執(zhí)行,使PROCESS_BEGIN展開的源代碼如下:#define PROCESS_BEGIN() PT_BEGIN(process_pt)#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 語言跳轉(zhuǎn)到被中斷的行3.2.2 進(jìn)

43、程控制模塊 正如Linux一樣。Contiki也用一個(gè)結(jié)構(gòu)來描述整個(gè)過程的細(xì)節(jié),所不同的是,Contiki進(jìn)程控制塊要簡單得多。使用鏈表將系統(tǒng)所有進(jìn)程組織起來,如圖3-3所示:圖3-3 Contiki進(jìn)程控制塊 Contiki系統(tǒng)定義了一個(gè)全局變量process_list作為進(jìn)程鏈表的頭,還定義了一個(gè)全局變量process_current用于指向當(dāng)前進(jìn)程。成員變量next指向下一個(gè)進(jìn)程,最后一進(jìn)程的next指向空。Name是進(jìn)程的名稱,可將系統(tǒng)配置(定義變量PROCESS_CONF_NO_ PROCESS _NAMES為0)成沒有進(jìn)程名稱,此時(shí)name為空字符串。變量state表示進(jìn)程的狀態(tài),

44、共3種,即PROCESS_STATE_RUNNING、PROCESS_STATE_CALLED、PROCESS_STATE_NONE。變量needspoll標(biāo)識進(jìn)程優(yōu)先級,只有兩個(gè)值0和1,needspoll為1意味著進(jìn)程具有更高的優(yōu)先級。1)進(jìn)程變量thread進(jìn)程的執(zhí)行體,即進(jìn)程執(zhí)行實(shí)際上是運(yùn)行該函數(shù)。在實(shí)際的進(jìn)程結(jié)構(gòu)體代碼中,該變量由宏P(guān)T_THREAD封裝,展開即為一個(gè)函數(shù)指針,關(guān)鍵代碼如下:PT_THREAD(*thread)(struct pt *,process_event_t,process_data_t);PT_THREAD(*thread)(struct pt *,proc

45、ess_event_t,process_data_t);#define PT_THREAD(name_args) char name_args/*宏展開*/char(*thread)(struct pt*,process_event_t,process_data_t);2)成員變量ptContiki的進(jìn)程是基于Protothreads,所以進(jìn)程控制模塊需要有變量記錄被中斷的行數(shù)。結(jié)構(gòu)體pt只有一個(gè)成員變量lc(無符號短整型),可以將pt簡單理解成保存行數(shù)的,相關(guān)源代碼如下:struct ptstruct pt lc_t lc;typedef unsigned short lc_t;3.2.3

46、進(jìn)程調(diào)度 Contiki只有兩種優(yōu)先級,用進(jìn)程控制塊中變量needspoll標(biāo)識,默認(rèn)情況是0,即普通優(yōu)先級。想要將某進(jìn)程設(shè)為更高優(yōu)先級,可以在創(chuàng)建之初指定其needspoll為1,或者運(yùn)行過程中通過設(shè)置該變量動(dòng)態(tài)提升其優(yōu)先級。在實(shí)際的調(diào)度中,會先運(yùn)行有高優(yōu)先級的進(jìn)程,而后再去處理一個(gè)事件,隨后又運(yùn)行所有高優(yōu)先級的進(jìn)程。通過遍歷整個(gè)進(jìn)程鏈表,將needspoll為1的進(jìn)程投入運(yùn)行,關(guān)鍵代碼如下:/*do_poll()關(guān)鍵代碼,由process_run調(diào)用*/*do_poll()關(guān)鍵代碼,由process_run調(diào)用*/for(p=process_list; p!=NULL;p=p-next)

47、/遍歷進(jìn)程鏈表 if(p-needspoll) p-state =PROCESS_STATE_RUNNING;p-needspoll=0;Call_process(p,PROCESS_EVENT_POLL,NULL); /將進(jìn)程投入運(yùn)行 以上是進(jìn)程的總體調(diào)度,具體到單個(gè)進(jìn)程,成員變量state標(biāo)識著進(jìn)程的狀態(tài),共有三個(gè)狀態(tài)PROCESS_STATE_RUNNING、PROCESS_STATE_CALLED、PROCESS_STATE_NONE。Contiki的進(jìn)程狀態(tài)轉(zhuǎn)換如圖3-4所示。圖3-4 Contiki進(jìn)程狀態(tài)轉(zhuǎn)換圖創(chuàng)建進(jìn)程(還未投入運(yùn)行)以及進(jìn)程退出(但此時(shí)還沒有從進(jìn)程列表刪除),進(jìn)

48、程狀態(tài)都為PROCESS_STATE_NONE。通過進(jìn)程啟動(dòng)函數(shù)process_start將新創(chuàng)建的進(jìn)程投入運(yùn)行隊(duì)列(但未必有執(zhí)行權(quán)),真正獲得執(zhí)行權(quán)的進(jìn)程狀態(tài)為PROCESS_STATE_CALLED,處在運(yùn)行隊(duì)列的進(jìn)程(包括正在運(yùn)行和等待運(yùn)行)可以調(diào)用exit_process退出。1)進(jìn)程初始化系統(tǒng)啟動(dòng)后需要先將進(jìn)程初始化,通常在主函數(shù)調(diào)用,進(jìn)程初始化主要完成事件隊(duì)列和進(jìn)程鏈表初始化。將進(jìn)程鏈表頭指向?yàn)榭眨?dāng)前進(jìn)程也設(shè)為空。Process_int源代碼如下:void process_init(void)void process_init(void)/*初始化事件隊(duì)列*/lastevent

49、= PROCESS_EVENT_MAX;nevents=fevent=0;process_maxevent=0;/*初始化進(jìn)程鏈表*/process_current=process_list=NULL;2)創(chuàng)建進(jìn)程創(chuàng)建進(jìn)程實(shí)際上是定義一個(gè)進(jìn)程控制塊和定義進(jìn)程執(zhí)行體的函數(shù)。宏P(guān)ROCESS的功能包括定義一個(gè)結(jié)構(gòu)體,聲明進(jìn)程執(zhí)行體函數(shù),關(guān)鍵源代碼如下:PROCESS(hello_world_process,PROCESS(hello_world_process,”Hello world”);/*PROCESS宏展開*/PROCESS_THREAD(name,ev,data);struct proc

50、ess name=NULL,strname,process_thread_#name/*PROCESS_THREAD宏展開*/static PT_THREAD(process_thread_#name(struct pt *process_pt,process_event_t ev,process_data_t data)#define PT_THREAD(name_args)char name_args/*將參數(shù)代入,PROCESS宏最后展開結(jié)果*/static char process_thread_hello_world_process(struct pt *process_pt,pro

51、cess_event_t ev,process_data_t data);struct process hello_world_process=NULL,”Hello world”,process_thread_hello_world_process 這里假設(shè)進(jìn)程名稱為Hello world。 可見,PROCESS宏實(shí)際上是聲明一個(gè)函數(shù)并定義一個(gè)進(jìn)程控制模塊,新創(chuàng)建的進(jìn)程next指針指向空,進(jìn)程名稱為“Hello world”,進(jìn)程執(zhí)行體函數(shù)指針為process_thread_hello_world_process,保存行數(shù)的pt為0,狀態(tài)為0(即PROCESS_STATE_NONE),優(yōu)先級

52、標(biāo)記位needspoll也為0(即普通優(yōu)先級)。PROCESS定義了結(jié)構(gòu)體并聲明了函數(shù),還需要實(shí)現(xiàn)該函數(shù)。通過宏P(guān)ROCESS_THREAD實(shí)現(xiàn)。值得注意的是,盡管PROCESS宏展開包含了宏P(guān)ROCESS_THREAD,用于聲明函數(shù),而這里是定義函數(shù),區(qū)別在于前者宏展開后前加了個(gè)分號。定義函數(shù)框架代碼如下:PROCESS_THREAD(hello_world_process,ev,data)PROCESS_THREAD(hello_world_process,ev,data)/static char process_thread_hello_world_process(struct pt *

53、process_pt,process_event_t ev,process_data_t data) PROCESS_BAGIN();/函數(shù)開頭必須有 /*代碼放這*/ PROCESS_BAGIN();/函數(shù)末尾必須有欲實(shí)現(xiàn)的代碼必須放在宏P(guān)ROCESS_BEGIN和PROCESS_END之間,這是因?yàn)檫@兩個(gè)宏用于輔助保存斷點(diǎn)信息(即行數(shù)),宏P(guān)ROCESS_BEGIN包含switch(process_pt-lc)語句,這樣被中斷的進(jìn)程再次獲利執(zhí)行便可通過switch語句跳轉(zhuǎn)到相應(yīng)的case,即被中斷的行。3)啟動(dòng)進(jìn)程函數(shù)process_start用于啟動(dòng)一個(gè)進(jìn)程,首先進(jìn)行參數(shù)驗(yàn)證,即判斷進(jìn)程

54、是否已經(jīng)在進(jìn)程鏈表中而后將進(jìn)程加到鏈表,給該進(jìn)程發(fā)一個(gè)初始化事件PROCESS_EVENT_INIT。函數(shù)process_start流程圖如圖3-5所示。圖3-5 process_start流程圖process_start將進(jìn)程狀態(tài)設(shè)為PROCESS_STATE_RUNNING,并調(diào)用PT_INIT宏將保存斷點(diǎn)的變量設(shè)為0(即行數(shù)為0)。調(diào)用process_post_synch給進(jìn)程觸發(fā)一個(gè)同步事件,事件為PROCESS_EVENT_INIT??紤]到進(jìn)程運(yùn)行過程中可能被中斷,在進(jìn)程運(yùn)行前將當(dāng)前進(jìn)程指針保存起來,執(zhí)行完再恢復(fù)。進(jìn)程運(yùn)行是由call_process函數(shù)實(shí)現(xiàn)。函數(shù)call_proce

55、ss流程圖如圖3-6所示。圖3-6 call_process流程圖 call_process首先進(jìn)行參數(shù)驗(yàn)證,即進(jìn)程處于運(yùn)行狀態(tài)(退出尚未刪除的進(jìn)程狀態(tài)為PROCESS_STATE_NONE)并且進(jìn)程的函數(shù)體不為空,接著講進(jìn)程狀態(tài)設(shè)為PROCESS_STATE_CALLED,表示該進(jìn)程擁有執(zhí)行權(quán)。接下來,運(yùn)行進(jìn)程函數(shù)體,根據(jù)返回值判斷進(jìn)程是否結(jié)束(主動(dòng)的)或者退出(被動(dòng)的),若是調(diào)用EXIT_PROCESS將進(jìn)程退出,否則將進(jìn)程狀態(tài)設(shè)為PROCESS_STATE_RUNNING,繼續(xù)放在進(jìn)程鏈表。4)進(jìn)程退出進(jìn)程運(yùn)行完或者收到退出的事件都會導(dǎo)致進(jìn)程退出。根據(jù)Contiki編程規(guī)劃,進(jìn)程函數(shù)體最

56、后一條語句是PROCESS_END(),該宏包含語句return PT_ENDED,表示進(jìn)程運(yùn)行完畢。系統(tǒng)處理事件時(shí)(事件綁定過程,事實(shí)上執(zhí)行進(jìn)程函數(shù)體),倘若該進(jìn)程恰好收到退出事件,thread便返回PT_EXITED,進(jìn)程被動(dòng)退出。還有就是給該進(jìn)程傳遞退出事件PROCESS_EVENT_EXIT也會導(dǎo)致進(jìn)程退出。進(jìn)程退出的函數(shù)exit_process流程圖如圖3-7所示。圖3-7 exit_process流程圖進(jìn)程退出函數(shù)exit_process首先對傳進(jìn)來的進(jìn)程p進(jìn)行參數(shù)驗(yàn)證,確保該進(jìn)程在進(jìn)程鏈表中并且進(jìn)程狀態(tài)為PROCESS_STATE_CALLED/RUNNING(即不能是NONE)

57、,接著將進(jìn)程狀態(tài)設(shè)置為NONE。隨后,向進(jìn)程鏈表的所有其他進(jìn)程觸發(fā)退出事件PROCESS_EVENT_EXIT,此時(shí)其他進(jìn)程依次執(zhí)行處理該事件,其中很重要一部分是取消與該進(jìn)程的關(guān)聯(lián)。進(jìn)程執(zhí)行函數(shù)體thread進(jìn)行善后工作,最后將進(jìn)程從進(jìn)程鏈表刪除。3.3 本章小結(jié)本章主要介紹了Contiki微操作系統(tǒng)的系統(tǒng)結(jié)構(gòu)及源碼架構(gòu),了解Contiki系統(tǒng)的進(jìn)程觸發(fā)機(jī)制及主要函數(shù)的代碼結(jié)構(gòu)和執(zhí)行流程。從實(shí)驗(yàn)結(jié)果可以看出,Contiki的進(jìn)程機(jī)制是基于protothreads線程模型,通過進(jìn)程初始化、創(chuàng)建進(jìn)程、啟動(dòng)進(jìn)程和進(jìn)程退出四個(gè)主要步驟來實(shí)現(xiàn)進(jìn)程出發(fā)。本章研究的幾個(gè)主要進(jìn)程調(diào)度函數(shù),在后續(xù)研究中被廣泛使

58、用。第四章 Linux與Android編譯研究4.1 Contiki在linux下的編譯1)進(jìn)程調(diào)度 新建文件夾src放置Contiki在Linux平臺運(yùn)行所需依賴文件,各目錄所含文件如表4 - 1所示。/srcautostart.c,clock.c,etimer.c,main.c,process.c,procinit.c,timer.c/coreContiki.h/core/sysautostart.h,clock.h,etimer.h,process.h,procinit.h.time.h/platform/nativeContiki - conf.h 表4 - 1 Contiki在Lin

59、ux試運(yùn)行所需源文件 前面提到,Contiki是進(jìn)程驅(qū)動(dòng)型的系統(tǒng),所以對其編譯的關(guān)鍵就是需要編寫一個(gè)進(jìn)程來啟動(dòng)系統(tǒng)調(diào)度。新建一個(gè)文件Main.c,Main.c中的相關(guān)代碼如下:#include #include #include Contiki.h#include #include PROCESS(blink_process, Blink);PROCESS_THREAD(blink_process, ev, data) PROCESS_BEGIN(); printf(Hello World!rn); PROCESS_END(); int main() int i=0; printf(Initi

60、alisingn); process_init(); process_start(&blink_process,NULL); printf(Processes runningn);其中,PROCESS_THREAD是我們系統(tǒng)的進(jìn)程函數(shù),在這個(gè)函數(shù)中定義該進(jìn)程的名稱為“Blink”,代號為blinkproess,主要的工作任務(wù),這里我們只是簡單的讓其打印一句“Hello World”。在main函數(shù)中,用到了兩個(gè)函數(shù): process_init() 初始化進(jìn)程 process_start(&blink_process,NULL)。啟動(dòng)進(jìn)程這樣,我們通過開啟一條進(jìn)程,激活了Contiki操作系統(tǒng),

溫馨提示

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

最新文檔

評論

0/150

提交評論