亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        ZigBee協(xié)議棧的OSAL運行機理研究與測試

        2017-09-08 23:22:37張玲麗
        物聯(lián)網(wǎng)技術(shù) 2017年8期
        關(guān)鍵詞:技術(shù)支持

        張玲麗

        摘 要:文中研究分析了ZigBee協(xié)議棧的OSAL運行機理,并在此基礎(chǔ)之上,通過規(guī)范的編程流程,設(shè)計了一個行之有效的測試系統(tǒng),很好地演示了OSAL如何實現(xiàn)多任務(wù)切換和處理機制,對后期基于協(xié)議棧的編程提供了技術(shù)支持。

        關(guān)鍵詞:ZigBee協(xié)議棧;OSAL;任務(wù)事件;技術(shù)支持

        中圖分類號:TP39;TN92 文獻標識碼:A 文章編號:2095-1302(2017)08-00-02

        0 引 言

        從ZigBee 2006協(xié)議棧開始,ZigBee協(xié)議棧內(nèi)加入了實時操作系統(tǒng),主要制定了一個實現(xiàn)任務(wù)間切換、同步與互斥等的機制,而這就是操作系統(tǒng)表象層OSAL (Operating System Abstraction Layer,OSAL)產(chǎn)生的根源。OSAL與標準的操作系統(tǒng)存在一定區(qū)別,它只實現(xiàn)了類似操作系統(tǒng)的某些功能,如任務(wù)切換、內(nèi)存管理等,還不能稱為真正意義上的操作系統(tǒng)[1]。OSAL專門分配了存放所有任務(wù)事件的tasksEvents[]數(shù)組,每一個單元對應(yīng)存放著每一個任務(wù)的所有事件,在這個函數(shù)中首先通過一個do—while循環(huán)來遍歷tasksEvents[],找到一個具有待處理事件的優(yōu)先級最高的任務(wù),序號低的任務(wù)優(yōu)先級高,然后跳出循環(huán),此時,就得到了最高優(yōu)先級任務(wù)的序號idx,然后通過events=tasksEvents[idx]語句將當前具有最高優(yōu)先級的任務(wù)事件取出,接著調(diào)用(tasksArr[idx])(inx,events)函數(shù)來執(zhí)行具體的處理。taskArr[]是一個函數(shù)指針數(shù)組,根據(jù)不同的idx可以執(zhí)行不同的函數(shù)[2],其程序流程圖如圖1所示。

        打開一個ZigBee工程文件,在左側(cè)通??梢钥吹饺齻€文件,分別為“Coordinator.c”、“Coordinator.h”、“OSAL_GenericApp.c”。整個程序所實現(xiàn)的功能都包含在這三個文件中。首先打開Coordinator.c 文件,可以看到兩個比較重要的函數(shù)GenericApp_Init 和 GenericApp_ProcessEvent。GenericApp_Init是任務(wù)的初始化函數(shù),GenericApp_ProcessEvent則負責(zé)判斷由參數(shù)傳遞的事件類型,然后執(zhí)行相應(yīng)的事件處理函數(shù)[3]。我們的設(shè)計同樣需要遵循該流程,既要進行任務(wù)初始化也需要完成開中斷執(zhí)行操作系統(tǒng)實體的功能??梢詫⒃摴ぷ骷毣癁槌跏蓟ぷ?、事件的設(shè)置和響應(yīng)、編寫任務(wù)事件處理函數(shù)。本文設(shè)計了一個驗證該運行機理的演示代碼,展示了不同優(yōu)先級的任務(wù)是如何按先后順序被初始化及跳轉(zhuǎn)到相應(yīng)的任務(wù)事件處理函數(shù)來執(zhí)行的效果。

        1 初始化工作

        在Zmain.c中首先應(yīng)啟動系統(tǒng),即需要完成初始化功能,包括硬件平臺和軟件架構(gòu)所需的各個模塊,為操作系統(tǒng)的運行做好準備。由于大部分初始化工作協(xié)議棧已設(shè)置好,此處我們只需特別設(shè)置的初始化工作包括初始化工作時鐘、初始化串口、初始化定時器、設(shè)置串口、使能中斷等,同時用戶自定義的事件也都需要放到任務(wù)初始化函數(shù)中進行初始化,此過程分為兩步:

        (1)將所有任務(wù)對應(yīng)的事件表清空,任務(wù)事件表保存在TaskEvents結(jié)構(gòu)當中,該結(jié)構(gòu)是一個uint16類型的數(shù)組,數(shù)組的每一個元素對應(yīng)一個任務(wù)所有的事件,16位對應(yīng)了16個事件。其中最高位表示是否為系統(tǒng)事件,最高位為1,則表示為系統(tǒng)事件;最高位為0,則表示為非系統(tǒng)事件。

        (2)為每個任務(wù)分配任務(wù)ID并初始化具體任務(wù),任務(wù)ID決定了任務(wù)的優(yōu)先級,ID越小響應(yīng)的優(yōu)先級越高,在任務(wù)初始化函數(shù)中,最新初始化的任務(wù)ID最小,優(yōu)先級最高,ID依次遞增,最小ID為0,最大ID為TaskCont-1。其具體代碼如下:

        void OS_IntTasks( void )

        {

        uint8 i,taskId = 0;

        for( i = 0; i < TaskCont; i ++ )

        {

        TaskEvents[i] = 0;

        }

        testOsInt( taskId++ ); //增加任務(wù)初始化,確定任務(wù)ID

        }

        倘若需要增加更多任務(wù),只需在testOsInt( taskId++ )注冊新任務(wù)即可。

        2 事件的設(shè)置和響應(yīng)

        任務(wù)事件的設(shè)置有兩種方式[4]:一種直接使用uint8osal_set_event( uint8 task_id, uint16 event_flag )函數(shù)來設(shè)置事件,該函數(shù)包含了兩個參數(shù),即任務(wù)ID和事件標志;另一種方法是設(shè)置一個超時事件。設(shè)置超時事件與直接設(shè)置事件的區(qū)別在于,超時事件不會立刻將事件加入到相應(yīng)任務(wù)的事件列表中,而是需要等待一定時間后才會加入,這個事件是通過設(shè)置函數(shù)的第三個參數(shù)來決定。

        OSAL_STATE osal_start_timerEx( uint8 taskID,uint16 event_flag,uint16 timeout_value ){ }

        從參數(shù)來看,該函數(shù)與osal_set_event函數(shù)相比,多了一個time_out_value參數(shù),該參數(shù)用來設(shè)置超時值。該超時值的度量單位就是前面初始化timer1時設(shè)置的中斷節(jié)拍。

        響應(yīng)任務(wù)事件首先需要得到準備就緒任務(wù)的ID,得到就緒任務(wù)ID后就可以通過該ID號得到相應(yīng)的任務(wù)事件處理函數(shù):events = (TasksFn[idx])(idx, events),其中TasksFn為任務(wù)事件處理函數(shù)表,表中的函數(shù)與任務(wù)ID號相對應(yīng)。本設(shè)計只定義了一個任務(wù)響應(yīng)函數(shù):const OSEventHandle TasksFn[] = {testOsProcess;},其可將任務(wù)進程注冊到任務(wù)函數(shù)指針列表中。endprint

        在該設(shè)計中增加了一個超時事件,即在osal_start_timerEx函數(shù)中調(diào)用了osalAddTimer函數(shù)[5],將事件加入到系統(tǒng)時鐘資源當中。該系統(tǒng)時鐘資源由一個結(jié)構(gòu)體數(shù)據(jù)定義,其原型如下:

        typedef struct

        {

        void *next;//指向下一個節(jié)點

        uint16 timeout;//超時事件中的超時值保存在此處,當該值減到0時,將該時鐘資源記錄的任務(wù)事件增加到事件列表當中

        uint16 event_flag;//事件標識

        uint8 task_id;//任務(wù)ID

        } osalTimerRec_t;

        在系統(tǒng)輪詢時,除了對任務(wù)事件進行查詢外,還增加了掃描事件查詢函數(shù)OS_Scan(),在該函數(shù)里對timer1的中斷服務(wù)函數(shù)進行自增運算,每次在OS_Scan中清零,而temp則記錄了mcuTimerCounterForOSAL的拷貝,即每次輪詢花費的系統(tǒng)時間。但關(guān)鍵在于OSALTimerUpdate函數(shù)若導(dǎo)致超時,則會將設(shè)置有事件標識的時鐘資源的超時值進行自減,將運行時間在timerout中減去,一旦判斷timerout值為0,便將相應(yīng)的事件進行設(shè)置,同時取消該超時事件記錄。

        本設(shè)計分別采用直接設(shè)置事件法和設(shè)置超時事件法來設(shè)置以下兩個事件:

        (1)在任務(wù)號為testOSTaskID的任務(wù)中設(shè)置系統(tǒng)事件0x8000和非系統(tǒng)事件0x0001,osal_set_event(testOSTaskID,0x8001 );

        (2)在任務(wù)號為testOSTaskID的任務(wù)中設(shè)置超時事件0x0002,打開定時器,并設(shè)置超時值為3 000 ms,osal_start_timerEx(testOSTaskID, 0x0002, 3000)。

        3 編寫任務(wù)處理函數(shù)

        本設(shè)計需要在Coordinator.c中增加對應(yīng)的任務(wù)處理函數(shù),在任務(wù)處理函數(shù)中實現(xiàn)對系統(tǒng)事件0x8000、非系統(tǒng)事件0x0001和超時事件0x0002的處理。對應(yīng)的任務(wù)處理函數(shù)如下:

        uint16 testOsProcess( uint8 taskId, uint16 events )

        {

        //系統(tǒng)任務(wù)

        if( events & 0x8000 )

        {

        uartsendstring((void *)”O(jiān)S SYS events\r\n”,15);

        return events ^ 0x8000;

        }

        //串口信息任務(wù)

        if( events & 0x0001 )

        {

        uartsendstring((void *)”O(jiān)S test events\r\n”,16);

        return events ^ 0x0001;

        }

        if(events & 0x0002 )

        {

        uartsendstring((void *)”O(jiān)S Timer events\r\n”,17);

        osal_start_timerEx(testOSTaskID, 0x0002, 3000);//打開超時定時器,3 s超時

        return events ^ 0x0002;

        }

        return 0;

        }

        對于0x8000事件,通過串口發(fā)送”O(jiān)S SYS events\r\n”字符串;對于0x0001事件,通過串口發(fā)送”O(jiān)S test events\r\n”字符串;對于0x0002事件,通過串口發(fā)送”O(jiān)S Timer events\r\n”字符串,并周期性設(shè)置該事件。

        4 結(jié) 語

        為了驗證OSAL是如何按照處理事件的優(yōu)先級順序來依次處理事件的,將上述編寫好的代碼組織形成工程文件,并下載到相關(guān)硬件開發(fā)板或平臺上,采用串口通信線把網(wǎng)關(guān)底板和計算機連接起來。打開串口調(diào)試助手并正確設(shè)置后,從串口輸出數(shù)據(jù),其視圖如圖2所示,先顯示OS SYS events,然后顯示OS test events,之后每間隔3 s顯示一次OS Timer events。

        由此可見,操作系統(tǒng)是優(yōu)先處理系統(tǒng)強制事件,然后處理用戶自定義事件。由于本設(shè)計中事件1和事件2的優(yōu)先級一樣,因此優(yōu)先處理先準備好的事件,由于設(shè)置定時器事件時設(shè)置了3 s的超時,因此交換兩事件的任務(wù)ID號后處理和顯示的順序不變。如果有多個同時準備好的時間,系統(tǒng)會按照任務(wù)ID號從小到大的順序依次處理。本設(shè)計為展示ZigBee協(xié)議棧里所包含的精簡OS系統(tǒng)如何進入任務(wù)輪詢狀態(tài)并按照一定的任務(wù)優(yōu)先級進入任務(wù)事件處理,提供了行之有效的測試方案。

        參考文獻

        [1]王小強,歐陽駿,黃寧淋.ZigBee無線傳感器網(wǎng)絡(luò)設(shè)計與實現(xiàn)[M].北京:化學(xué)工業(yè)出版社,2012.

        [2]鄭海杰,宋開新.綜合OSAL的ZigBee協(xié)議棧設(shè)計[J].杭州電子科技大學(xué)學(xué)報(自然科學(xué)版),2015(6):32-35.

        [3]陳亞琳.Zigbee協(xié)議棧消息事件處理分析[J].南京工業(yè)職業(yè)技術(shù)學(xué)院學(xué)報,2014(4):44-48.

        [4]李戰(zhàn)明,劉寶,駱東松.ZigBee技術(shù)規(guī)范與協(xié)議棧分析[J].微型機與應(yīng)用,2009,28(5):45-48.

        [5]章偉聰,俞新武,李忠成.基于CC2530及ZigBee協(xié)議棧設(shè)計無線網(wǎng)絡(luò)傳感器節(jié)點[J].計算機系統(tǒng)應(yīng)用,2011,20(7):184-187,120.

        [6]李志瑞,程萬里,杜永章.基于CC2530無線MEMS加速度傳感器設(shè)計與驗證[J].物聯(lián)網(wǎng)技術(shù),2015,5(6):6-8.

        [7]潘軍.基于ZigBee的無線傳感器網(wǎng)絡(luò)的研究與應(yīng)用[D].大連:大連海事大學(xué),2012.

        [8]宋國青. ZigBee自動抄表系統(tǒng)的研究與實現(xiàn)[D].桂林:桂林電子科技大學(xué),2010.endprint

        猜你喜歡
        技術(shù)支持
        AR技術(shù)支持下部編版教材的教與學(xué)
        提升技術(shù)支持能力, 深化“林肯之道”
        汽車零部件(2017年1期)2017-02-22 07:52:48
        博格華納致力于創(chuàng)造清潔高效的世界, 為汽車驅(qū)動系統(tǒng)提供先進的技術(shù)支持
        汽車零部件(2017年1期)2017-02-22 07:52:01
        多種現(xiàn)代技術(shù)支持的第二語言學(xué)習(xí)
        Web3.0技術(shù)支持下的幼兒園智能化教學(xué)探究
        精準扶貧需要技術(shù)支持
        信息技術(shù)推動學(xué)習(xí)方式轉(zhuǎn)變——技術(shù)支持的課堂導(dǎo)入
        技術(shù)支持下的歷史學(xué)科探究任務(wù)設(shè)計
        iPad技術(shù)支持下的翻轉(zhuǎn)課堂模式探索*——暨“分式方程”的翻轉(zhuǎn)課例展示
        中石化海外技術(shù)支持國際化人才隊伍建設(shè)
        十八禁视频在线观看免费无码无遮挡骂过 | 亚洲精品无码久久久久秋霞| 激情第一区仑乱| 性色av 一区二区三区| 日韩一级特黄毛片在线看| 成激情人妻视频| 亚洲精品一区二区成人精品网站| 女人18毛片a级毛片| 久久久久波多野结衣高潮| 国产手机在线αⅴ片无码| 精品久久久久久午夜| 久久久亚洲女精品aa| 日韩av一区二区蜜桃| 亚洲一区二区三区中国| 大陆极品少妇内射aaaaaa| 国产福利酱国产一区二区| 亚洲综合色视频在线免费观看| 日本女优五十路中文字幕| av天堂午夜精品一区| 狠狠色综合网站久久久久久久| 国产成人无精品久久久| 亚洲av日韩综合一区尤物| 国产亚洲成av人片在线观黄桃| 免费男人下部进女人下部视频| 日韩人妻无码中文字幕一区| 国产成人高清亚洲一区二区| 人人妻人人澡人人爽国产| 色爱无码av综合区| 欧美成人专区| 极品人妻少妇一区二区| 丰满巨臀人妻中文字幕| 国产免费av手机在线观看片| 久久久久久好爽爽久久| 999精品免费视频观看| 亚洲av影片一区二区三区| 久久久精品人妻一区二区三区妖精| 国产无套内射久久久国产| 欧美 亚洲 国产 日韩 综AⅤ | 亚洲中文字幕无码mv| 国产人澡人澡澡澡人碰视频| 白白色发布视频在线播放|