国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

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

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

馮韜+朱立才

摘 要: Contiki在物聯(lián)網(wǎng)中的應(yīng)用越來廣泛,但用戶對系統(tǒng)的認(rèn)識(shí)卻相對滯后。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)行了仿真,并對結(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)系,并對之進(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è)待處理的位置。

因此對于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:提供了最簡單的時(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并不是一一對應(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)程可以對應(yīng)于多個(gè)事件,而一個(gè)事件可以廣播給所有進(jìn)程,即該事件成員變量p指向空。當(dāng)調(diào)用do_event函數(shù)時(shí),將進(jìn)程鏈表所有進(jìn)程投入運(yùn)行。

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

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

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

⑵ 時(shí)鐘初始化:對系統(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,直到檢測到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é)束語

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下對兩個(gè)進(jìn)程交互過程仿真,以及etime事件的應(yīng)用,直觀地反映三者之間的關(guān)系。接下來的工作將對系統(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)程
債券市場對外開放的進(jìn)程與展望
改革開放進(jìn)程中的國際收支統(tǒng)計(jì)
概率論中幾個(gè)事件之間的聯(lián)系與區(qū)分
網(wǎng)絡(luò)輿情反轉(zhuǎn)現(xiàn)象中的“參照點(diǎn)效應(yīng)”
保羅·利科的“話語事件”思想
授之以魚,不如授之以漁
熱點(diǎn)事件中的“輿論搭車”現(xiàn)象探析
嵌入式系統(tǒng)課程“中斷、異常與事件”教學(xué)實(shí)踐及啟示
我國高等教育改革進(jìn)程與反思
Linux僵死進(jìn)程的產(chǎn)生與避免