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)用越來(lái)廣泛,但用戶對(duì)系統(tǒng)的認(rèn)識(shí)卻相對(duì)滯后。Contiki是一款適用于資源受限無(wú)線傳感網(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)系。通過(guò)實(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ú)線傳感器是無(wú)線傳感網(wǎng)的核心部件,一般的無(wú)線傳感器具有低能量、低處理能力、低存儲(chǔ)能力和低數(shù)據(jù)傳輸速率的特點(diǎn)。因此,傳統(tǒng)的操作系統(tǒng)不適用于無(wú)線傳感網(wǎng),需要研制適用的操作系統(tǒng)。目前應(yīng)用于無(wú)線傳感網(wǎng)的操作系統(tǒng)有TinyOS,μC/OS-Ⅱ,Contiki[1]等。Contiki是一款開(kāi)源的、高度可移植的多任務(wù)操作系統(tǒng),適用于需聯(lián)網(wǎng)的嵌入式系統(tǒng)和無(wú)線傳感器。該系統(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)存占用。具體來(lái)說(shuō),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ú)線傳感網(wǎng)絡(luò)仿真工具Cooja[4]和MSP430[5];提供CFS文件系統(tǒng)[6]。

正因?yàn)镃ontiki系統(tǒng)具有的優(yōu)越性,使其在學(xué)術(shù)界和工業(yè)界得到越來(lái)越廣泛的重視。但Contiki的運(yùn)行機(jī)制比較特殊,源碼編寫(xiě)技巧性強(qiáng),研究者往往無(wú)從入手。本文深入剖析Contiki的進(jìn)程與事件,闡述兩者之間的關(guān)系,并對(duì)之進(jìn)行仿真,以便為Contiki的研究人員和開(kāi)發(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)存資源極度受限的無(wú)線傳感設(shè)備。Contiki提供的Protothread機(jī)制解決了這個(gè)問(wèn)題,通過(guò)保存被阻塞的進(jìn)程行數(shù)來(lái)實(shí)現(xiàn)進(jìn)程切換,而這在系統(tǒng)中只需兩個(gè)字節(jié)即可實(shí)現(xiàn)。當(dāng)該進(jìn)程下一次被調(diào)用時(shí),通過(guò)switch(_LINE_)進(jìn)行跳轉(zhuǎn),恢復(fù)進(jìn)程的執(zhí)行[7]。通過(guò)這種機(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)程已退出,但還沒(méi)有從進(jìn)程鏈表中刪除;進(jìn)程已放于執(zhí)行隊(duì)列,還沒(méi)有取得執(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)聽(tīng)進(jìn)程。

1.3 進(jìn)程鏈表

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

2 Contiki事件

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

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

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

2.1 事件產(chǎn)生

Conitki有兩種產(chǎn)生事件的方式,即同步方式和異步方式。同步事件通過(guò)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)聽(tīng)該事件的進(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)它過(guò)期時(shí),調(diào)用一個(gè)函數(shù)。

etimer:活動(dòng)時(shí)鐘。當(dāng)它過(guò)期時(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來(lái)判斷該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í)行過(guò)程如下。

⑴ 硬件初始化:根據(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)程的交互過(guò)程,本實(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還沒(méi)到期,進(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還沒(méi)到期,進(jìn)程被掛起,轉(zhuǎn)去執(zhí)行Second進(jìn)程,當(dāng)執(zhí)行到PROCESS_WAIT_EVENT_UNTIL(ev==event_data_ready)時(shí),由第一個(gè)進(jìn)程還沒(méi)有執(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沒(méi)有到期,而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ú)線傳感器網(wǎng)絡(luò)。本文在給出Contiki系統(tǒng)特點(diǎn)的基礎(chǔ)上,詳細(xì)分析了Contiki的事件結(jié)構(gòu),進(jìn)程結(jié)構(gòu),以及進(jìn)程和事件的關(guān)系,并通過(guò)main函數(shù)剖析了Contiki程序的執(zhí)行流程,進(jìn)一步闡述了事件和進(jìn)程的關(guān)系。通過(guò)Cooja下對(duì)兩個(gè)進(jìn)程交互過(guò)程仿真,以及etime事件的應(yīng)用,直觀地反映三者之間的關(guān)系。接下來(lái)的工作將對(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ú)線傳感器網(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ì)外開(kāi)放的進(jìn)程與展望
改革開(kāi)放進(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)的新矛盾和新問(wèn)題
俄羅斯現(xiàn)代化進(jìn)程的阻礙
論文萊的民族獨(dú)立進(jìn)程
主站蜘蛛池模板: 亚洲 日韩 激情 无码 中出| 福利视频99| 美女黄网十八禁免费看| 欧美一区二区丝袜高跟鞋| 久久夜色精品| 五月天香蕉视频国产亚| 欧美亚洲欧美区| 国产一区二区三区免费观看| 无套av在线| 亚洲男女天堂| 亚亚洲乱码一二三四区| 精品在线免费播放| 欧美一区二区精品久久久| 18禁色诱爆乳网站| 欧美成人影院亚洲综合图| 国产美女主播一级成人毛片| 九九香蕉视频| 国产中文一区二区苍井空| 波多野结衣在线一区二区| 亚洲第一色网站| 欧美亚洲国产日韩电影在线| 人妻丰满熟妇啪啪| 亚洲美女视频一区| 四虎国产精品永久一区| 亚洲日韩AV无码精品| 一本一道波多野结衣av黑人在线| 一区二区理伦视频| 99视频在线观看免费| 久久国产免费观看| 青青青国产精品国产精品美女| 久久视精品| 日韩欧美中文| 免费全部高H视频无码无遮掩| 天天摸夜夜操| 女人av社区男人的天堂| 中文字幕无码制服中字| 91久久夜色精品| 女人18一级毛片免费观看| 中文字幕va| 免费看久久精品99| 1级黄色毛片| 亚洲国产精品久久久久秋霞影院| 色吊丝av中文字幕| 国产成人精品高清不卡在线| 中字无码精油按摩中出视频| 在线精品视频成人网| 天天躁夜夜躁狠狠躁躁88| 人妻丰满熟妇αv无码| 97视频精品全国免费观看| 91国内外精品自在线播放| 亚洲无卡视频| 亚洲h视频在线| a天堂视频| 日韩高清中文字幕| 在线欧美国产| 国产手机在线小视频免费观看| 亚洲第一成年人网站| 久久久久久久久亚洲精品| 国产三级毛片| 992tv国产人成在线观看| 一本大道东京热无码av| www精品久久| 国产天天射| 2021国产乱人伦在线播放| 91探花国产综合在线精品| 国产成人久久777777| 亚洲制服丝袜第一页| 欧美自慰一级看片免费| 亚洲美女久久| 欧美精品H在线播放| 久久精品娱乐亚洲领先| 国产香蕉在线视频| 久久免费视频6| 欧美国产成人在线| 国产剧情国内精品原创| 中文字幕欧美日韩| 尤物精品视频一区二区三区| JIZZ亚洲国产| 波多野结衣视频一区二区| 国产激爽大片高清在线观看| 青草娱乐极品免费视频| 亚洲精品成人福利在线电影|