新聞中心

        EEPW首頁 > 模擬技術 > 設計應用 > 基于μC/0S―II的時問片調度法設計

        基于μC/0S―II的時問片調度法設計

        作者: 時間:2009-09-14 來源:網絡 收藏
        引 言
        μC/0S―II嵌入式實時操作系統采用的是基于優先級的可剝奪法。基于優先級的可剝奪法是指,CPU總是讓處于就緒態的、優先級最高的任務運行;最高優先級的任務一旦就緒,總能得到CPU的使用權,當一個運行著的任務使一個比它優先級高的任務進入了就緒態時,當前任務的CPU使用權就被剝奪了,更高優先級的任務立刻得到了CPU的使用權。除非最高優先級的任務主動放棄CPU的使用權(通過調用0STimeDly()、0SSem―Pend()等函數),否則低優先級的任務是沒機會獲得CPU使用權的。對于一個實際應用系統中耗時比較長的任務,為了讓其他任務能夠得到實時,可以用兩種方法來處理。第一種方法是把該任務的優先級設為最低(當然還是比空閑任務要高);第二種方法就是讓該耗時任務運行一段時間后延時一下再繼續運行,即把整個任務劃分為若干步驟來執行,如以下的示例代碼:

        本文引用地址:http://www.104case.com/article/188642.htm

        很多情況下,耗時長的任務并不能設置為最低優先級任務,而劃分步驟來執行的方法不但繁瑣而且每一步執行的時間也是不確定的(其他低優先級任務獲得CPU使用權的時間也會是不確定的)。筆者在用μC/OS―II開發一款車載信息娛樂系統的時候就碰到了這樣的問題,因此設計了一種優先級和時間片相結合的調度法(也就是基于μC/0S―II的時間片調度法)。

        1 調度原理
        這種調度法給處于就緒態的每一個任務都分配一個時間片(優先級越高分配的時間片越長,空閑任務得不到時間片的分配),內核按照任務的優先級依次調度處于就緒態的任務,即當就緒態中最高優先級的任務用完自己的時間片后,CPU控制權轉讓給就緒態中優先級第二高的任務。該任務用完自己的時間片后,CPU控制權又轉讓給下一優先級的就緒態任務……當就緒態的每一個任務都被調度一次之后將重新為它們分配時間片,然后又開始新一輪的調度……
        其中要注意的是,在調度過程中如果有一個比當前任務優先級更高的任務由其他態變成了就緒態(被創建或獲取了一個信號量等),當前任務的CPU控制權將被剝奪;空閑任務仍然是等到其他任務都退出就緒態才獲得CPU的使用權。
        圖1解釋了該調度法的調度過程(其中任務1優先級最高,任務2次之,任務3最低)。

        ①任務2和任務3都處于就緒態,任務1在等待一個信號量,優先級中的任務2獲得CPU使用權。
        ②任務2的時間片用完,優先級低的任務3獲得CPU使用權。
        ③任務3的時間片用完,任務2重新獲得CPU的使用權。
        ④任務2的時間片還沒用完時中斷來臨,中斷服務程序獲得CPU使用權。
        ⑤中斷服務程序發送了一個任務1等待的信號量,中斷服務完成后優先級高的任務1獲得CPU使用權。
        ⑥任務1的時間片用完,任務2繼續運行。
        ⑦任務2的時間片用完,任務3獲得CPU使用權。
        ⑧任務3的時間片用完,重新分配時間片,新一輪調度開始。


        2 實現方法
        在調度算法的實現過程中,力求做到3點:
        ①盡可能少地改動μC/0S―II原有的代碼;
        ②增加的代碼在風格上保持與原有的相一致;
        ③兼容原有的優先級調度法(可以很方便地選擇優先級調度法或是時間片調度法)。
        注:對于該小節中出現的代碼,如果是筆者增加的部分都用黑體表示。
        2.1 數據結構中增加的變量
        在進程控制塊中增加兩項:

        Typedef struct os_tcb{

        ……

        #if OS_TASK_TIME_SLICE-EN>0

        /*條件編譯,OS_TASK_TIME_SLICE_EN在os_cfg.h中定義,凡是涉及與時間片調度相關的代碼都用條件編譯。這樣,可以通過更改配置文件很方便地選擇任務調度法*/

        INT16U OSTCBTimeSlice;

        /*任務的時間片大小,在任務創建時被初始化,運行過程中保持不變*/

        INT16U OSTCBCounter;

        /*任務運行剩余時間計數器,每一輪調度開始時該變量被賦值(等于OSTCBTimeSlice),運行過程中不斷遞減。當其等于0時任務被剝奪CPU使用權*/

        #endif

        }
        由于當前任務的時間片使用完時,該任務將被從就緒表OSRdyGrp以及OSRdyTbl[OS_RDY_TBL_SIZE]中清除;新一輪調度開始時它又必須被恢復,因此筆者在uC0S_II.h文件中增加以下變量(不妨把它們稱為“時間片調度表”)分別用于保存OSRdyGrp和OSRdyTbl[OS_RDY_TBL_SIZE]。
        OS_EXT INT8U OSTSSGrp;
        OS_EXT INT8U OSTSSTbl[OS_RDY_TBL_SIZE];


        上一頁 1 2 下一頁

        關鍵詞: 調度

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 信丰县| 师宗县| 荣成市| 绥阳县| 万盛区| 望奎县| 湄潭县| 神池县| 吴江市| 贡嘎县| 阿克陶县| 嘉峪关市| 晋州市| 金秀| 高雄市| 新和县| 白沙| 锦屏县| 洪雅县| 招远市| 新余市| 西乌珠穆沁旗| 建宁县| 崇义县| 丽江市| 新建县| 怀仁县| 黄梅县| 和田市| 永修县| 南丹县| 扎鲁特旗| 县级市| 怀安县| 会昌县| 兴山县| 红安县| 韶山市| 马尔康县| 宁强县| 景宁|