新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 基于μC/OS-II的無線調度策略分析與實現

        基于μC/OS-II的無線調度策略分析與實現

        作者: 時間:2012-03-22 來源:網絡 收藏

        2.2嵌入式實時操作系統調度管理

        為完成調度機制的靈活實現,提高系統調度實時性,這里采用嵌入式操作系統對系統進行管理。μC/OS-II是一種免費公開源代碼、結構小巧、具有可剝奪實時內核的實時操作系統,其內核提供任務調度與管理、時間管理、任務間同步與通信、內存管理和中斷服務等功能。它適用于小型控制系統,具有執行效率高、占有空間小、實時性能優良和擴展性強等特點,最小內核可以編譯至2K左右。

        μC/OS-II實時內核采用占先式調度策略,不支持時間片輪調度法,核心是始終運行就緒條件下的優先級最高的任務。在具體實現中就可以根據這一特點將系統劃分為多個任務,每一個任務賦予一個明確的并且與其他任務不同的優先級,根據各個任務的優先級,動態地切換各個任務,從而保證了對實時性的要求。如果希望某個任務的優先級根據條件的變化而發生改變,則可以通過調用改變任務優先級的函數來實現。

        3 調度任務劃分及設計

        3.1多任務劃分

        任務和中斷的劃分主要根據調度平臺設備完成的功能來劃分,要求每個任務職責清晰,任務間的信息交換和同步互斥應該簡潔明了,任務優先級定義明確。

        平臺設備任務可劃分為四個任務:設備聲明任務,信息分發任務,信息接收任務,令牌輪循任務。設備聲明任務主要完成設備身份認證,設備在網絡中聲明是主設備還是從設備,如果是主設備則進行調度平臺星型網絡的組建,從設備則直接加入新組建的網絡。信息分發任務作用是將當前網絡狀態、設備狀態和數據信息發送網絡中指定設備。信息接收任務是依靠串口中斷來觸發的,作用是接收網絡中的數據信息和主設備發送的或從設備返回的令牌。令牌輪循任務主要是針對主設備,當調度網絡組建完成,主設備根據網絡中節點信息(單獨開辟存儲區存儲的節點號)進行令牌信息分發,一般情況是根據節點號從大到小,得到令牌的節點才是當前網絡中的活動節點。對于從設備,令牌輪循任務僅完成令牌返回功能。

        3.2多任務

        在多任務系統的設計中優先級的裁決至關重要,如果優先級設定有誤,難以保證調度策略的正確實施,嚴重影響調度精確性。基于μC/OS-II操作系統的任務優先級設計遵循以下原則:(1)緊急任務優先,(2)完成得快的任務優先,(3)優先級不能動態變化,(4)不要出現多個同一優先級的任務。

        基于以上四點原則,分析系統任務,安排任務優先級示意圖如圖3所示,任務優先級由高至低依次為:信息接收任務,令牌輪循任務,信息分發任務,設備聲明任務。在系統任務中設備聲明任務只需定期進行發送聲明信息,表明設備在線,其周期較長,故可安排較低優先級;信息接收任務由中斷觸發,為了提高調度精度,防止中斷延遲時間過長,可安排信息接收任務為較高優先級,當中斷發生確保能較快的切換到信息接收任務接收信息。令牌輪循任務功能單一,處理時間較短,故安排優先級高于信息發送任務。

        圖3 任務優先級示意圖

        μC/OS-II是基于搶占式內核,當一個任務正在執行時,如果任務就緒表中有更高級別任務就緒,就中止當前任務切換到高優先級任務。如圖3所示,信息分發任務在執行過程中,信息接收任務就緒,系統立刻中止信息分發任務,保留當前狀態在堆棧中,然后切換到高優先級的信息接收任務,信息接收完成再返回到信息發送任務繼續執行。

        3.3任務間信息交換和同步設計與實現

        在嵌入式多任務系統中,多任務之間信息交換和同步主要通過消息郵箱、消息隊列以及信號量來完成,μC/OS-II分別提供了相關函數供用戶調用,如任務,消息,信號量的創建,消息和信號量的請求和發送等。

        根據調度策略無線調度平臺主從設備信息交換設計圖如圖4所示:

        任務間信息交換和同步設計是無線調度機制實現的重要環節,在具體實現過程中主要利用μC/OS-II的消息隊列函數,其中OSQPend()為消息請求函數,OSQPost()為消息發送函數。

        串口中斷與信息接收任務間通過消息隊列進行信息傳遞代碼實現如下,SERIAL2RecData作為是否接收信息標志位,由中斷置位,有信息接收時,串口服務程序向信息接收任務發送消息。

        void SERIAL2_ISR(void) interrupt 20 //串口接收中斷服務程序

        { SERIAL2RecBuffer[SERIAL2RecBufferTail] = SBUF1;

        SERIAL2RecData = 1; //接收數據標志位

        }

        void task_serial2(void) ADD_REENTRANT //串口服務程序

        { if(SERIAL2RecData == 1)

        OSQPost(bt_msg_queue, (void *)pmsg);

        }



        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 高平市| 汶上县| 富裕县| 绥化市| 墨竹工卡县| 南京市| 天气| 巴林左旗| 灌云县| 邹城市| 芜湖县| 综艺| 清镇市| 上栗县| 香港 | 大方县| 定襄县| 连南| 栾川县| 盐池县| 桂林市| 门源| 吉安市| 东兴市| 罗城| 曲麻莱县| 青冈县| 饶河县| 汉川市| 枣阳市| 北海市| 永兴县| 屏山县| 茶陵县| 富源县| 郑州市| 蚌埠市| 丰宁| 武冈市| 化德县| 涿州市|