国产毛片a精品毛-国产毛片黄片-国产毛片久久国产-国产毛片久久精品-青娱乐极品在线-青娱乐精品

基于μC/OS-II的時間片調度法設計

發布時間:2010-5-12 18:34    發布者:李寬
關鍵詞: 調度法
引言

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



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

1 調度原理

這種調度法給處于就緒態的每一個任務都分配一個時間片(優先級越高分配的時間片越長,空閑任務得不到時間片的分配),內核按照任務的優先級依次調度處于就緒態的任務,即當就緒態中最高優先級的任務用完自己的時間片后,CPU控制權轉讓給就緒態中優先級第二高的任務。該任務用完自己的時間片后,CPU控制權又轉讓給下一優先級的就緒態任務……當就緒態的每一個任務都被調度一次之后將重新為它們分配時間片,然后又開始新一輪的調度……[2]

其中要注意的是,在調度過程中如果有一個比當前任務優先級更高的任務由其他態變成了就緒態(被創建或獲取了一個信號量等),當前任務的CPU控制權將被剝奪;空閑任務仍然是等到其他任務都退出就緒態才獲得CPU的使用權。

圖1解釋了該調度法的調度過程(其中任務1優先級最高,任務2次之,任務3最低)。



圖1 基于μC/OSII時間片調度過程

① 任務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/OSII原有的代碼;

② 增加的代碼在風格上保持與原有的相一致;

③ 兼容原有的優先級調度法(可以很方便地選擇優先級調度法或是時間片調度法)。

注:對于該小節中出現的代碼,如果是筆者增加的部分都用黑體表示。

2.1 數據結構中增加的變量

在進程控制塊中增加兩項:

  Typedef struct os_tcb{

  ……

      #if OS_TASK_TIME_SLICE_EN>0

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

      */INT16UOSTCBTimeSlice;

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

       INT16UOSTCBCounter;

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

       #endif

  }

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

  OS_EXT INT8UOSTSSGrp;

  OS_EXT INT8UOSTSSTbl[OS_RDY_TBL_SIZE];

  另外,在uCOS_II.h文件中增加宏定義,用于表示任務時間片被用完這種狀態:

  #defineOS_STAT_TS_USEUP0x40

2.2 相關函數的修改

對OS_TCBInit()、OSTimeTick()、OSTimeDly()、OS_EventTaskWait()、 OS_EventTaskRdy()這5個函數的修改,是在μC/OSII基礎上實現時間片調度法的關鍵。下面將一一對這幾個函數的修改部分進行說明。

在初始化任務控制塊的函數OS_TCBInit()中,筆者添加以下代碼讓新創建的任務處于時間片就緒表中,并根據任務優先級對任務的時間片大小進行初始化。



OSTimeTick()函數在每個時鐘滴答被調用,在時間片調度過程中起到了遞減時間片計數器的作用。當計數器為0時,進行任務切換或是重新給各個任務分配時間片并開始新一輪調度。

OSTimeDly()函數的作用是將任務延時一定的時間。這種情況下,應該把該任務從時間片調度表中清除。

當某個任務須等待一個事件的發生時,信號量、互斥型信號量、郵箱及消息隊列會通過相應的PEND函數調用函數 OS_EventTaskWait(),使當前任務從就緒任務表中脫離就緒態,此時還需把當前任務從時間片調度表中清除。筆者在 OS_EventTaskWait()函數中添加了以下代碼:



相應地,當某個事件發生了,信號量、互斥型信號量、郵箱及消息隊列會通過相應的POST函數調用OS_EventTaskRdy(),從等待任務隊列中使最高優先級任務脫離等待狀態,此時還需要把該任務添加到時間片調度表中。筆者在OS_EventTaskRdy()函數中添加了以下代碼:

  OSTSSGrp |= bity;

  OSTSSTbl[y] |= bitx;

3 應用實例

筆者首先把μC/OSII移植到開發板上(MCU意法半導體生產的基于ARM7TDMI核的STR730[3]),然后如2小節所述對相關部分的源代碼進行修改,接下來將優先級調度法和基于μC/OSII的時間片調度法進行比較。為此分別建立了2個任務 Task_TimeConsuming()、Task_Audio(),任務的優先級分別是5、6。



由于模擬的耗時任務Task_TimeConsuming()是個死循環且沒有調用OSTimeDly()函數,其優先級又比Task_Audio()高,如果完全按照優先級調度,系統不會有聲音輸出,因為負責聲音控制的任務 Task_Audio一直得不到運行。而如果按照時間片調度(在os_cfg.h中增加#define OS_TASK_TIME_SLICE_EN 1),則聲音輸出正常,通過仿真器在Task_Audio()中設置斷點,程序會很快停止在斷點處。進一步地,依次在 Task_TimeConsuming()和Task_Audio()函數體中設置斷點,分別記錄兩次PC指針停止在斷點處時看門狗計數器的值 WDG_Counter1和WDG_Counter2,可以利用WDG_Counter1和WDG_Counter2的差值估算出任務 Task_Audio前后兩次被調度的時間間隔(忽略任務在切換過程中的耗時)。經過多次計算,這個時間間隔值的范圍在58~59ms,而任務 Task_TimeConsuming的時間片理論值=64-Prio=64-5=59 ms,實驗值與理論值是非常吻合的。

當然,這只是簡單的驗證實驗。嚴格的測試還需要兼顧信號量、互斥型信號量、郵箱及消息隊列相應的PEND、POST函數以及 OSTimeDly()函數調用。鑒于篇幅關系,這里就不再贅述了。

結語

筆者已經成功地把這種基于μC/OSII的時間片調度法運用到車載信息娛樂系統的開發中。實踐證明,對于含有耗時任務的系統,尤其是在需要嚴格控制耗時任務運行時間長度的場合,該調度算法會有一定的便捷性,也能保證系統的實時響應,而且整個算法只改動了μC/OSII中的少量代碼;還可以根據實際需要調整各個任務的時間片大小,體現出了算法的實用性與靈活性。

參考文獻

   1. Labrosse Jean J.邵貝貝 嵌入式實時操作系統μC/OS-II 2003
   2. 毛德操.胡希明 嵌入式系統 2003
   3. ST Microelectronics STR73X Microcontroller Reference Manual.Version 1.0 2005

作者:上海奧控汽車電子有限公司 吳嵩  曹樂千
來源:單片機與嵌入式系統應用 2008 (12)
本文地址:http://www.qingdxww.cn/thread-11206-1-1.html     【打印本頁】

本站部分文章為轉載或網友發布,目的在于傳遞和分享信息,并不代表本網贊同其觀點和對其真實性負責;文章版權歸原作者及原出處所有,如涉及作品內容、版權和其它問題,我們將根據著作權人的要求,第一時間更正或刪除。
您需要登錄后才可以發表評論 登錄 | 立即注冊

廠商推薦

  • Microchip視頻專區
  • Dev Tool Bits——使用MPLAB® Discover瀏覽資源
  • Dev Tool Bits——使用條件軟件斷點宏來節省時間和空間
  • Dev Tool Bits——使用DVRT協議查看項目中的數據
  • Dev Tool Bits——使用MPLAB® Data Visualizer進行功率監視
  • 貿澤電子(Mouser)專區
關于我們  -  服務條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯系我們
電子工程網 © 版權所有   京ICP備16069177號 | 京公網安備11010502021702
快速回復 返回頂部 返回列表
主站蜘蛛池模板: 鸥美性生交xxxxx久久久 | 亚洲综合成人网在线观看 | 国产精选自拍 | 自拍偷拍综合网 | 免费观看动漫的网站 | 国产麻豆精品一区 | 免费一级特黄欧美大片久久网 | 亚洲天堂男人天堂 | 97se亚洲综合在线天天 | 亚洲尹人香蕉网在线视颅 | 欧美男人天堂 | 亚洲精品手机在线观看 | 日韩国产有码在线观看视频 | 欧美日韩网 | 精品久久久久国产免费 | 欧美11一12周岁a在线观看 | 男女羞羞网站 | 2020国产免费久久精品99 | 伊人青青草原 | 久草网址 | 国内精品免费网站牛牛 | 色版网站 | 中文字幕亚洲高清综合 | 中文字幕日韩一区二区 | 鲁一鲁噜噜噜 | 成人久草| 亚洲免费观看视频 | 手机看片国产精品 | 久久综合丁香激情久久 | 免费人成在线观看 | 亚洲国产高清视频 | 亚洲最大福利视频网 | 禁天堂a在线观看 | 国产极品美女在线观看 | 欧美在线看片a免费观看 | 一级黄色在线视频 | 中文字幕日韩wm二在线看 | 日本精品久久久久中文字幕2 | 四虎免费看黄 | 手机看片高清日韩精品 | 涩涩999|