999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

Contiki系統(tǒng)進(jìn)程與事件剖析

2017-01-14 20:57:45馮韜朱立才
計(jì)算機(jī)時(shí)代 2016年12期
關(guān)鍵詞:進(jìn)程

馮韜+朱立才

摘 要: Contiki在物聯(lián)網(wǎng)中的應(yīng)用越來廣泛,但用戶對(duì)系統(tǒng)的認(rèn)識(shí)卻相對(duì)滯后。Contiki是一款適用于資源受限無線傳感網(wǎng)操作系統(tǒng),支持IPv6協(xié)議。在事件驅(qū)動(dòng)的基礎(chǔ)上,提供protothread線程模型,從而有效節(jié)省內(nèi)存空間。文章介紹了Contiki的特點(diǎn),結(jié)合main函數(shù)的執(zhí)行流程深入剖析了Contiki的進(jìn)程與事件以及事件與進(jìn)程的關(guān)系。通過實(shí)例在Cooja下進(jìn)行了仿真,并對(duì)結(jié)果進(jìn)行了分析。

關(guān)鍵詞: Contiki; 進(jìn)程; 事件; protothread

中圖分類號(hào):TP316 文獻(xiàn)標(biāo)志碼:A 文章編號(hào):1006-8228(2016)12-01-04

Analysis of process and event of Contiki system

Feng Tao, Zhu Licai

(School of Information Science and Technology, Yancheng teacher's University, Yancheng, Jiangsu 224002, China)

Abstract: The application of Contiki system in the Internet of Things is more and more extensive, but the user's cognition of the system is relatively backward. Contiki is suitable for resource constrained wireless sensor networks, supports the IPv6 protocol, and on the basis of event driven, provides the protothreads threading model, which can effectively save memory space. In this paper, the characteristics of Contiki are introduced, combined with the execution process of the main function, the process and event of Contiki, and the relationship between them are analyzed. And an example is simulated with Cooja, the results are analyzed.

Key words: Contiki; process; event; protothreads

0 引言

無線傳感器是無線傳感網(wǎng)的核心部件,一般的無線傳感器具有低能量、低處理能力、低存儲(chǔ)能力和低數(shù)據(jù)傳輸速率的特點(diǎn)。因此,傳統(tǒng)的操作系統(tǒng)不適用于無線傳感網(wǎng),需要研制適用的操作系統(tǒng)。目前應(yīng)用于無線傳感網(wǎng)的操作系統(tǒng)有TinyOS,μC/OS-Ⅱ,Contiki[1]等。Contiki是一款開源的、高度可移植的多任務(wù)操作系統(tǒng),適用于需聯(lián)網(wǎng)的嵌入式系統(tǒng)和無線傳感器。該系統(tǒng)適用于資源受限的嵌入式單片機(jī)系統(tǒng),典型情況下只需2K的RAM和40K的FLASH存儲(chǔ)器,可移植到多種平臺(tái)上。Contiki是基于事件驅(qū)動(dòng)內(nèi)核操作系統(tǒng),在該內(nèi)核上,應(yīng)用程序可以在運(yùn)行時(shí)動(dòng)態(tài)加載。在事件驅(qū)動(dòng)內(nèi)核的基礎(chǔ)上,提供了protothead線程模型,使多個(gè)線程共享一個(gè)任務(wù)棧,從而減少內(nèi)存占用。具體來說,Contiki具有以下特點(diǎn):事件驅(qū)動(dòng)的多任務(wù)內(nèi)核,多個(gè)任務(wù)可以共享一個(gè)棧;支持全I(xiàn)P網(wǎng)絡(luò),如IPv4,UDP,TCP和HTTP[2],支持低功耗有損網(wǎng)絡(luò)協(xié)議,如6lowpan,RPL,CoAP[3]等;提供了能量耗費(fèi)評(píng)估機(jī)制[2];支持運(yùn)行時(shí)模塊的動(dòng)態(tài)鏈接和加載;提供內(nèi)存塊分配、托管內(nèi)存分配器和標(biāo)準(zhǔn)的C內(nèi)存分配器[2]三種內(nèi)存分配方法;集成無線傳感網(wǎng)絡(luò)仿真工具Cooja[4]和MSP430[5];提供CFS文件系統(tǒng)[6]。

正因?yàn)镃ontiki系統(tǒng)具有的優(yōu)越性,使其在學(xué)術(shù)界和工業(yè)界得到越來越廣泛的重視。但Contiki的運(yùn)行機(jī)制比較特殊,源碼編寫技巧性強(qiáng),研究者往往無從入手。本文深入剖析Contiki的進(jìn)程與事件,闡述兩者之間的關(guān)系,并對(duì)之進(jìn)行仿真,以便為Contiki的研究人員和開發(fā)人員提供一定的參考。

1 Contiki進(jìn)程

Contiki使用事件驅(qū)動(dòng)和Protothread兩個(gè)主要的機(jī)制[1],前者能達(dá)到降低功耗的目的,后者可有效節(jié)省內(nèi)存空間。

傳統(tǒng)操作系統(tǒng)每個(gè)進(jìn)程需要一個(gè)獨(dú)立的棧,這個(gè)特點(diǎn)不適用于內(nèi)存資源極度受限的無線傳感設(shè)備。Contiki提供的Protothread機(jī)制解決了這個(gè)問題,通過保存被阻塞的進(jìn)程行數(shù)來實(shí)現(xiàn)進(jìn)程切換,而這在系統(tǒng)中只需兩個(gè)字節(jié)即可實(shí)現(xiàn)。當(dāng)該進(jìn)程下一次被調(diào)用時(shí),通過switch(_LINE_)進(jìn)行跳轉(zhuǎn),恢復(fù)進(jìn)程的執(zhí)行[7]。通過這種機(jī)制,能有效節(jié)省內(nèi)存空間。

1.1 Contiki編程模型

本文結(jié)合Contiki2.7中提供的例程Hello World給出Contiki的編程模型。

在該結(jié)構(gòu)中包含進(jìn)程名稱(*name)、執(zhí)行進(jìn)程的宏(PT_THREAD)、用于保存程序被中斷行數(shù)的結(jié)構(gòu)體(pt)、程序狀態(tài)(state)和進(jìn)程優(yōu)先級(jí)。

分別表示進(jìn)程已退出,但還沒有從進(jìn)程鏈表中刪除;進(jìn)程已放于執(zhí)行隊(duì)列,還沒有取得執(zhí)行權(quán);進(jìn)程取得執(zhí)行權(quán)并投入運(yùn)行。

進(jìn)程優(yōu)先級(jí)needspoll,即當(dāng)系統(tǒng)調(diào)用process_run()函數(shù)時(shí),有所needspoll標(biāo)志為1的進(jìn)程投入運(yùn)行,之后才會(huì)從事件隊(duì)列取出下一個(gè)事件傳遞給相應(yīng)的監(jiān)聽進(jìn)程。

1.3 進(jìn)程鏈表

Contiki將進(jìn)程組織成一個(gè)鏈表結(jié)構(gòu),一個(gè)頭指針process_list指向該表頭,通過遍歷鏈表處理進(jìn)程。

2 Contiki事件

為了節(jié)省能耗,嵌入式系統(tǒng)將周圍環(huán)境的變化看成一個(gè)個(gè)事件,事件到來,系統(tǒng)進(jìn)程處理,否則,系統(tǒng)就處于休眠狀態(tài)。

Contiki將所有事件存放于一個(gè)全局的靜態(tài)數(shù)組中,數(shù)組采用環(huán)形結(jié)構(gòu)。事件數(shù)目在系統(tǒng)運(yùn)行之前就要指定(用戶可以通過PROCESS_CONF_NUMEVENTS配置其大小),通過數(shù)組下標(biāo)可以快速訪問事件。系統(tǒng)還定義兩個(gè)全局靜態(tài)變量nevents和fevent,分別用于記錄未處理事件總數(shù)及下一個(gè)待處理的位置。

因此對(duì)于Contiki系統(tǒng)而言,事件遵循先到先服務(wù)策略。

2.1 事件產(chǎn)生

Conitki有兩種產(chǎn)生事件的方式,即同步方式和異步方式。同步事件通過process_post_synch函數(shù)產(chǎn)生,事件觸發(fā)后直接處理(調(diào)用call_process函數(shù))。而異步事件產(chǎn)生是由process_post產(chǎn)生,產(chǎn)生后放入事件隊(duì)列等待處理。

2.2 事件調(diào)度

do_event函數(shù)用于處理事件。它首先取出該事件,由于采用環(huán)形數(shù)組存放待處理的事件,所以在計(jì)算未處理事件總數(shù)及下一個(gè)待處理事件的數(shù)組下標(biāo)時(shí),需用取余操作。然后判斷事件是否為廣播事件PROCESS_BROADCAST,由于處理廣播事件可能需要更多的時(shí)間,為保證系統(tǒng)實(shí)時(shí)性,先運(yùn)行高優(yōu)先級(jí)的進(jìn)程,然后再去處理事件(調(diào)用call_process函數(shù))。如果事件是初始化事件PROCESS_EVENT_INIT(創(chuàng)建進(jìn)程的時(shí)候會(huì)觸發(fā)此事件),需要將進(jìn)程狀態(tài)設(shè)為PROCESS_STATE_RUNNING。

2.3 事件處理

call_process會(huì)調(diào)用thread函數(shù)處理事件。

2.4 事件的數(shù)據(jù)結(jié)構(gòu)

struct event_data

{ process_event_t ev;

process_data_t data;

struct process *p;

};

typedef unsigned char process_event_t;

typedef void * process_data_t;

上述結(jié)構(gòu)體含義為:標(biāo)識(shí)產(chǎn)生的事件(ev)、給進(jìn)程傳輸?shù)臄?shù)據(jù)(data)以及監(jiān)聽該事件的進(jìn)程(p)。

2.5 事件的分類

Contiki系統(tǒng)的事件可分為三類:時(shí)鐘事件、外部事件和內(nèi)部事件。時(shí)鐘事件可以看成是特殊的內(nèi)部事件。

⑴ 系統(tǒng)事件

系統(tǒng)定義了10個(gè)事件,以0x80~0x8a標(biāo)識(shí)。如:

⑵ 定時(shí)器事件

Contiki系統(tǒng)包括五種定時(shí)器:

timer和stimer:提供了最簡(jiǎn)單的時(shí)鐘操作,即檢查時(shí)鐘周期是否已經(jīng)結(jié)束。兩種時(shí)鐘最大的不同在于,tmier使用系統(tǒng)時(shí)鐘的ticks,而stimer是使用的秒。

ctimer:活動(dòng)時(shí)鐘。當(dāng)它過期時(shí),調(diào)用一個(gè)函數(shù)。

etimer:活動(dòng)時(shí)鐘。當(dāng)它過期時(shí),發(fā)送一個(gè)事件。

rtimer:實(shí)時(shí)時(shí)鐘。在某個(gè)確定的時(shí)間調(diào)用一個(gè)函數(shù)。

3 進(jìn)程、事件和etimer之間的關(guān)系

3.1 事件與etimer關(guān)系

etimer_process執(zhí)行時(shí),會(huì)遍歷整個(gè)etimer鏈表,檢查etimer是否有到期的,如有到期的就把事件PROCESS_EVENT_TIMER加入到事件隊(duì)列中,并將該etimer成員變量p指向PROCESS_NONE。PROCESS_NONE用于標(biāo)識(shí)該etimer是否到期,函數(shù)etimer_expired會(huì)根據(jù)etimer的p是否指向PROCESS_NONE來判斷該etimer是否到期。

3.2 進(jìn)程與etimer關(guān)系

etimer是一種特殊事件。etimer與process并不是一一對(duì)應(yīng)的關(guān)系,即一個(gè)etimer必定綁定一個(gè)process,但process不一定非得綁定etimer。

3.3 進(jìn)程與事件關(guān)系

當(dāng)有事件傳遞給進(jìn)程時(shí),就新建一個(gè)事件加入事件隊(duì)列,并綁定該進(jìn)程,所以一個(gè)進(jìn)程可以對(duì)應(yīng)于多個(gè)事件,而一個(gè)事件可以廣播給所有進(jìn)程,即該事件成員變量p指向空。當(dāng)調(diào)用do_event函數(shù)時(shí),將進(jìn)程鏈表所有進(jìn)程投入運(yùn)行。

在Contiki中每一種硬件平臺(tái)都對(duì)一個(gè)相應(yīng)的main源程序,在該程序中含有main函數(shù),嵌入式系統(tǒng)不斷運(yùn)行著main函數(shù)中的循環(huán)。本文以Contiki 2.7中的

main()函數(shù)的主要執(zhí)行過程如下。

⑴ 硬件初始化:根據(jù)不同的硬件平臺(tái),對(duì)相關(guān)的硬件進(jìn)行初始化,包括串口、網(wǎng)絡(luò)等。

⑵ 時(shí)鐘初始化:對(duì)系統(tǒng)時(shí)鐘進(jìn)行初始化,不同的平臺(tái)所使用的時(shí)鐘會(huì)有所不同。

⑶ 進(jìn)程初始化:Process_init()函數(shù)主要是完成事件隊(duì)列和進(jìn)程鏈表初始化。

⑷ 啟動(dòng)系統(tǒng)進(jìn)程:特別是與時(shí)鐘相關(guān)的進(jìn)程,完成系統(tǒng)的特定功能。

⑸ 啟動(dòng)用戶指定自動(dòng)運(yùn)行的進(jìn)程。

⑹ 進(jìn)入事件處理的循環(huán):遍歷所有高優(yōu)先級(jí)的進(jìn)程并執(zhí)行,然后轉(zhuǎn)去處理事件隊(duì)列的一個(gè)事件,將該事件與進(jìn)程綁定。主要包括如下階段。

創(chuàng)建進(jìn)程:由宏P(guān)ROCESS完成,主要包括兩個(gè)方面,一是定義一個(gè)進(jìn)程控制塊,二是定義進(jìn)程執(zhí)行體的函數(shù)。

啟動(dòng)進(jìn)程:由process_start()函數(shù)啟動(dòng)一個(gè)進(jìn)程,如果進(jìn)程不在鏈表中,將進(jìn)程加入進(jìn)程鏈表,并給該進(jìn)程發(fā)一個(gè)初始化事件PROCESS_EVENT_ INIT,初始化進(jìn)程的運(yùn)行狀態(tài),將lc設(shè)為0。

進(jìn)程退出:執(zhí)行退出進(jìn)行函數(shù)exit_process。先進(jìn)行參數(shù)驗(yàn)證,確保進(jìn)程在進(jìn)程鏈表中并且不是PROCESS_STATE_NONE狀態(tài),向所有進(jìn)程發(fā)一個(gè)同步事件PROCESS_EVENT_EXITED。

4 仿真與分析

為驗(yàn)證進(jìn)程的交互過程,本實(shí)驗(yàn)設(shè)置了兩個(gè)進(jìn)程First和Second,同時(shí)使用了etime事件。在Cooja下的仿真結(jié)果如圖1所示。

系統(tǒng)啟動(dòng)時(shí),會(huì)進(jìn)行一系列初始化工作,接著啟動(dòng)系統(tǒng)進(jìn)程etimer_process,進(jìn)而啟動(dòng)進(jìn)程First和Second。當(dāng)進(jìn)程First執(zhí)行到PROCESS_WAIT_EVENT

_UNTIL(ev==PROCESS_EVENT_TIMER),由于etimer還沒到期,進(jìn)程被掛起,轉(zhuǎn)去執(zhí)行Second進(jìn)程,當(dāng)執(zhí)行到PROCESS_系統(tǒng)啟動(dòng)時(shí),會(huì)進(jìn)行一系列初始化工作,接著啟動(dòng)系統(tǒng)進(jìn)程etimer_process,進(jìn)而啟動(dòng)進(jìn)程First和Second。當(dāng)進(jìn)程First執(zhí)行到PROCESS_WAIT

_EVENT_UNTIL(ev==PROCESS_EVENT_TIMER),由于etimer還沒到期,進(jìn)程被掛起,轉(zhuǎn)去執(zhí)行Second進(jìn)程,當(dāng)執(zhí)行到PROCESS_WAIT_EVENT_UNTIL(ev==event_data_ready)時(shí),由第一個(gè)進(jìn)程還沒有執(zhí)行post事件,該進(jìn)程也被掛起。而后再轉(zhuǎn)去執(zhí)行系統(tǒng)進(jìn)程etimer_process,直到檢測(cè)到etimer到期,輸出Etime expired,然后輸出First process,并傳遞事件event_ data_ready給Second進(jìn)程,重新初始化timer,再次執(zhí)行First進(jìn)程,由于etime沒有到期,而post事件已執(zhí)行,所以會(huì)轉(zhuǎn)去執(zhí)行Second進(jìn)程,輸出Second process。待執(zhí)行到PROCESS_WAIT_EVENT_UNTIL(ev==event

_data_ready)又被掛起,再次執(zhí)行系統(tǒng)進(jìn)程etimer_process。如此反復(fù)在兩個(gè)進(jìn)程間進(jìn)行調(diào)度[8]。

5 結(jié)束語(yǔ)

Contiki的事件驅(qū)動(dòng)機(jī)制和Protothread線程模型非常適用于資源受限的無線傳感器網(wǎng)絡(luò)。本文在給出Contiki系統(tǒng)特點(diǎn)的基礎(chǔ)上,詳細(xì)分析了Contiki的事件結(jié)構(gòu),進(jìn)程結(jié)構(gòu),以及進(jìn)程和事件的關(guān)系,并通過main函數(shù)剖析了Contiki程序的執(zhí)行流程,進(jìn)一步闡述了事件和進(jìn)程的關(guān)系。通過Cooja下對(duì)兩個(gè)進(jìn)程交互過程仿真,以及etime事件的應(yīng)用,直觀地反映三者之間的關(guān)系。接下來的工作將對(duì)系統(tǒng)源碼作進(jìn)一步分析,為系統(tǒng)的移植和使用Cooja進(jìn)行協(xié)議的仿真打下基礎(chǔ)。

參考文獻(xiàn)(References):

[1] Dunkels A, Gronvall B, Voigt T.Contiki-a lightweight and

flexible operating system for tiny networked sensors.Local Computer Networks[C].Washington, USA: IEEE,2004:455-462

[2] Contiki community. Why Choose Contiki?http:// www.

contiki-os.org/index.html#why

[3] Kovatsch M, Duquennoy S, Dunkels A.A low-power coap

for contiki. Adhoc and Sensor Systems (MASS)[C].Valencia, Spanish: IEEE,2011:855-860

[4] Kugler P, Nordhus P, Eskofier B. Shimmer, Cooja and

Contiki: A new toolset for the simulation of on-node signal processing algorithms. Sensor Networks[C]. Cambridge, Massachusetts, USA: IEEE,2013:1-6

[5] Eriksson J, Osterlind F, Voigt T, Finne N, Raza S, Tsiftes

N, Dunkels A.Demo abstract: Accurate power profiling of sensornets with the cooja/mspsim simulator. Mobile Adhoc and Sensor Systems[C]. Macau, China: IEEE,2009:1060-1061

[6] Tsiftes N, Dunkels A, He Z, Voigt T.Enabling large-scale

storage in sensor networks with the coffee file system. Information Processing in Sensor Networks[C]. San Francisco, USA:IEEE,2009:349-360

[7] 蘇鉛坤.無線傳感器網(wǎng)絡(luò)文件系統(tǒng)與重編程技術(shù)研究[D].電

子科技大學(xué),2013.

[8] Oikonomou G, Phillips I. Experiences from porting the

Contiki operating system to a popular hardware platform. Distributed Computing in Sensor Systems and Workshops[C]. Barcelona, Spanish: IEEE,2011:1-6

猜你喜歡
進(jìn)程
債券市場(chǎng)對(duì)外開放的進(jìn)程與展望
改革開放進(jìn)程中的國(guó)際收支統(tǒng)計(jì)
快速殺掉頑固進(jìn)程
社會(huì)進(jìn)程中的新聞學(xué)探尋
我國(guó)高等教育改革進(jìn)程與反思
Linux僵死進(jìn)程的產(chǎn)生與避免
講效率 結(jié)束進(jìn)程要批量
電腦迷(2012年24期)2012-04-29 00:44:03
男女平等進(jìn)程中出現(xiàn)的新矛盾和新問題
俄羅斯現(xiàn)代化進(jìn)程的阻礙
論文萊的民族獨(dú)立進(jìn)程
主站蜘蛛池模板: 欧美一级一级做性视频| 亚洲中文字幕无码爆乳| 国产成人av一区二区三区| 青青青国产精品国产精品美女| 综合社区亚洲熟妇p| 日韩天堂视频| 91福利免费| 国产福利小视频高清在线观看| 伊人久久久久久久| 欧美在线中文字幕| 亚洲VA中文字幕| 国产日韩精品欧美一区喷| 六月婷婷精品视频在线观看| 日韩成人免费网站| 午夜无码一区二区三区| 亚洲天堂精品视频| 天天综合亚洲| 被公侵犯人妻少妇一区二区三区| aⅴ免费在线观看| 91色综合综合热五月激情| 国产在线精品美女观看| 美女一区二区在线观看| 久久亚洲国产最新网站| 国产精品视频a| 中文纯内无码H| 久久香蕉国产线看观看亚洲片| 国产精品污视频| 91热爆在线| 精品久久久久久中文字幕女| 国产不卡网| 欧美午夜视频| 久久精品国产国语对白| 国产在线视频导航| 国产成人高清精品免费| 国产日本一线在线观看免费| 欧美综合成人| 九九久久精品国产av片囯产区| 国产Av无码精品色午夜| 亚洲中文字幕97久久精品少妇| 最新精品久久精品| 在线观看91精品国产剧情免费| 日韩一区二区三免费高清| 99re在线免费视频| 1024你懂的国产精品| 99re在线视频观看| 欧美日韩精品在线播放| 免费在线a视频| 99视频全部免费| 国产精品亚洲天堂| 99热这里只有精品国产99| 国产一区二区福利| 日韩精品毛片| 色偷偷av男人的天堂不卡| 欧美一区二区三区国产精品| 亚洲黄色高清| 成人另类稀缺在线观看| 国产日本欧美在线观看| 呦女精品网站| 国产a v无码专区亚洲av| 成人福利在线看| 伊人激情综合| 欧美国产精品不卡在线观看| 亚洲资源在线视频| 欧美视频在线观看第一页| 国精品91人妻无码一区二区三区| 成人伊人色一区二区三区| 无码免费的亚洲视频| 一级做a爰片久久免费| 国产xx在线观看| 99re在线免费视频| 国产精品任我爽爆在线播放6080| 欧美伦理一区| 久久永久精品免费视频| 欧美第九页| 久久香蕉欧美精品| 国产在线麻豆波多野结衣| 91视频日本| 国产最新无码专区在线| 国产SUV精品一区二区| 欧美精品亚洲精品日韩专区| 美女一级毛片无遮挡内谢| 久996视频精品免费观看|