μCOS-Ⅱ內核任務調度的實現(xiàn)_第1頁
μCOS-Ⅱ內核任務調度的實現(xiàn)_第2頁
μCOS-Ⅱ內核任務調度的實現(xiàn)_第3頁
μCOS-Ⅱ內核任務調度的實現(xiàn)_第4頁
μCOS-Ⅱ內核任務調度的實現(xiàn)_第5頁
已閱讀5頁,還剩5頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、C/OS- 內核任務調度的實現(xiàn)趙二濤 ,楊春金武漢理工大學信息工程學院 ,武漢 (430063E-mail :摘 要 : 任務調度是一個實時操作系統(tǒng)的核心功能 , 關系到整個操作系統(tǒng)的性 能。 C /OS- 內核采用占先式調度方式 , 保證最高優(yōu)先級任務一旦進入就緒態(tài) , 就能立刻得到 CPU 的使用 權。本文結合 C /OS- 內核源代碼深入研究就緒態(tài)中 最高優(yōu)先級查找算法和任務調度原理 并給出實例加以分析。關鍵詞 :嵌入式實時操作系統(tǒng) , C /OS- ,任務調度,就緒表,優(yōu)先級中圖分類號 :TP316.21. 引言C /OS-是一個完整的 ,可移植、可固化、可剪裁的嵌入式實時操作系統(tǒng)。它

2、 采用占 先式調度方式 ,即最高優(yōu)先級的任務一旦就緒 ,總能立刻得到 CPU 的使用權 , 從而保證系 統(tǒng)的實時性。在任務調度的過程中 , C /OS- 內核能快速、準確的從眾多的就緒態(tài)任務中 找出優(yōu)先 級最高的任務 , 減少系統(tǒng)的響應時間 , 保證系統(tǒng)的實時性。 本文首先介紹 與任務有關的概念 和有關任務調度重要的域 ,接著詳細分析 C /OS- 的最高優(yōu)先 級查找算法和任務調度原理 并結合實例加以說明。 在分析最高優(yōu)先級查找算法時 首先分析將任務置于就緒態(tài)的過程 , 這 樣更易于理解內核的查找算法。2. C/OS- 的任務調度2.1 C /OS-的任務2.1.1任務及任務狀態(tài)任務,也稱線程

3、 ,是一個簡單的應用程序。每個任務都被賦予一定的優(yōu)先級 ,并有 自己 的一套 CPU 寄存器和棧空間 1。實時應用程序的設計過程是如何把問題分 割成多個任務。 每個任務都是一個無限的循環(huán) , 都處在以下五種狀態(tài)之一 , 即休眠 態(tài)、 就緒態(tài)、 運行態(tài)、 掛起態(tài)和被中斷態(tài)。 1休眠態(tài) :相當于任務駐留在內存中 , 但并不能被多任務內核所調度 ; 2就緒態(tài):意味著任務已經(jīng)準備好 ,可以運行 ,但由于 該任務的優(yōu)先級比正在運行的任務 的優(yōu)先級低 ,還暫時不能運行 ; 3運行態(tài):指任務 掌握了 CPU 的使用權,正在運行中 ; 4 掛起態(tài):指任務在等待 ,等待某一事件的發(fā)生 ; 5 被中斷態(tài):指發(fā)生中

4、斷時 , CPU 提供相 應的中斷服務 ,原來正在運行的任務暫不能運 行,就進入了中斷態(tài)。2.1.2 任務控制塊 (OS_TCB任務控制塊是一個和任務息息相關的重要的結構體。 當任務的 CPU 使用權被 剝奪時, C /OS-用它來保存該任務的狀態(tài)。 當任務重新獲得 CPU 的使用權時 , 任務控制塊能確保任務 從被中斷的那一點絲毫不差的繼續(xù)執(zhí)行 2 。每個任務都擁 有自己獨立的任務控制塊 ,一旦任 務建立 ,與之相對應的任務控制塊就被賦值。任務控制塊結構體在 uCOS_II.H 中定義,以下代碼是節(jié)選 OS_TCB中對本文分 析相關的 進構體成員。/ File : uCOS_II.Htype

5、def struct os_tcb OS_STK *OSTCBStkPtr; /* 當前任務的棧頂指針 */INT8U OSTCBPrio;INT8U OSTCBX;INT8U OSTCBY;INT8U OSTCBBitX;INT8U OSTCBBitY; OS_TCB;OSTCBStkPtr 是當前任務的棧頂指針 , 每個任務都有自己的堆棧和指向棧頂指 針。 在上 下文切換時 , 對于優(yōu)先級低的任務 , 要將任務當前狀態(tài)保存于任務堆棧中 (以便以后再次調 度到此任務繼續(xù)執(zhí)行 ,然后 OSTCBStkPtr 指向棧頂 ;對于優(yōu)先級高 的任務,通過 OSTCBStkPtr 找到任務的上次被切換時

6、的狀態(tài) ,把保存的狀態(tài)恢復到 CPU ,這樣任務就毫 無差錯的繼續(xù)執(zhí)行。OSTCBPrio 是任務的優(yōu)先級號。 OSTCBX , OSTCBBitX , OSTCBY , OSTCBBitY 用于 加速任務進入就緒態(tài)的過程或等待事件發(fā)生狀態(tài)的過程 ,這些值在 任務建立時調用 OS_TCBInit( 進行賦值。2.2 C /OS- 最高優(yōu)先級查找算法在 C /OS- 中 , 每個就緒的任務都放在就緒表 (ready list 中,內核通過就緒表 找到就緒 態(tài)最高優(yōu)先級的任務讓其占用 CPU ,進入運行態(tài) 3。C /OS- 中最多運行的任務是 64個,內核把任務優(yōu)先級分組 ,八個為一組 1, 如圖

7、 1所示。 任務優(yōu)先級號中 Y 是所屬組部分 , X 是所在組部分 , 在就緒表中有 2 個變量 OSRdyGrp 和 OSRdyTbl , OSRdyGrp 表示所屬組 ,每一位代表一個組內是 否有進入就緒態(tài)的任務 , OSRdyTbl 表示所在組 ,一組八個任務 ,即一位代表一個任 務是否進入就緒態(tài)。當任務進 入就緒態(tài)時 ,就緒表 OSRdyGrp 和 OSRdyTbl 相應位置 1。 OSRdyGrp 和 OSRdyTbl 之間 的關系見圖 1, OSRdyGrp 的第 n 位對應 OSRdyTbl n ,即 OSRdyTbl n 中任何一位是 1時, OSRdyGrp 的第 n 位要置

8、 1。圖 1 任務就緒表任務創(chuàng)建成功后被置于就緒態(tài) , 這里就以任務被創(chuàng)建時為例來說明內核是如何 把任務置于就緒態(tài)。首先 ,建立任務 ,調用函數(shù) OSTaskCreat(或 OStaskCreatExt( , OSTaskCreat( 和 OStaskCreatExt( 都將調用 OS_TCBInit( 來初始化任務控制塊 ,函數(shù) OS_TCBInit( 完成 將任務優(yōu)先級放就緒表中 ,使任務置于就緒態(tài) ,函數(shù) OS_TCBInit( 中有關將任務優(yōu)先級放 就緒表的部分如下所示 :/ File : OS_CORE.CINT8U OS_TCBInit(INT8U prio,.OS_TCB* pt

9、cb;/* 初始化 OS_TCB中 OSTCBX,OSTCBBitX, OSTCBY,OSTCBBitY */ptcb-OSTCBY= prio 3;ptcb-OSTCBBitY = OSMapTblptcb-OSTCBY;ptcb-OSTCBX = prio & 0x07;ptcb-OSTCBBitX = OSMapTblptcb-OSTCBX;OSRdyGrp|= ptcb-OSTCBBitY; /* 將任務加入就緒表 */OSRdyTblptcb-OSTCBY |= ptcb-OSTCBBitX;OS_TCBInit( 對 OSTCBX,OSTCBBitX, OSTCBY,OSTCBBi

10、tY 提前做了運算 , 節(jié) 約任務 調度時間。 OSTCBX 和 OSTCBY 都要轉換為相應位掩碼 ,這個是通過 OSMapTbl 實現(xiàn) 1, 如圖 2。 內核通過按位或運算把 OSRdyGrp 和 OSRdyTbl 的 相應位置 1, 這樣就完成了把任 務置于就緒態(tài)的工作。圖 2 OSMapTbl 所有任務置于就緒態(tài)的工作都是通過上面的兩個或運算完成。 最高優(yōu)先級任 務置于就緒 態(tài)和查找就緒態(tài)最高優(yōu)先級任務是相反的過程 , 通過把任務置于就緒態(tài) 的分析知道了就緒表 中是如何放置任務優(yōu)先級信息的 , 接下來就要把最高優(yōu)先級的 任務從就緒表中查找出來。 任 務的優(yōu)先級越高 ,任務的優(yōu)先級號越小

11、 , 在 OSRdyGrp 和 OSRdyTbl 中置 1的位越低,查 找最高優(yōu)先級的任務就是查出 OSRdyGrp 和 OSRdyTbl 和最低的置 1位,然后再轉換為優(yōu) 先級號,這樣就完成了最高優(yōu)先級的查 找工作。內核調度任務時需要查找出最高優(yōu)先級的任務 4 。內核調用 OS_Sched(調 度 任務。 OS_Sched(找 出就緒態(tài)最高優(yōu)先級 OSPrioHighRdy , 判斷是否需要調度 , 如 果需要則調度任 務。函數(shù) OS_Sched( 中有關查找最高優(yōu)先級的部分如下 :/ File : OS_CORE.Cvoid OS_Sched (voidINT8U y;y = OSUnMa

12、pTblOSRdyGrp; /* 找出最高優(yōu)先級 */OSPrioHighRdy = (INT8U(y 3 + OSUnMapTblOSRdyTbly;為了找到就緒態(tài)的優(yōu)先級最高的任務 ,內核并不是從 OSRdyTbl 0 開始掃描整 個就緒 任務表,只需查另外一張表即優(yōu)先級判定表 OSUnMapTbl 1, 如圖 3所示, 這樣設計為內 核調度節(jié)約了時間。優(yōu)先級判定表 OSUnMapTbl 中的值由 OSRdyGrp 和 OSRdyTbl 的最 低置 1位確定,舉例說明。假設 OSRdyGrp=0x6C(0b01101100, OSRdyGrp 的最后一位置 1是第 2 位, OSUnMap

13、Tbl0x6C=2( 圖 3中紅色標注部分 ,反過來,知道 OSRdyGrp = 0x6C 就可以通過 OSUnMapTbl0x6C 找到 2,這樣通過 OSUnMapTbl 把 OSRdyGrp和 OSRdyTbl 最低置 1位轉換為對 應優(yōu)先級號中的 Y 和 X 部分, Y 乘以 8加上 X 就是就緒任 務的最小優(yōu)先級號 , 即優(yōu) 先級最高的任務的優(yōu)先級號 , 這樣內核便完成了查找就緒態(tài)最高優(yōu) 先級任務的工 作。INT8U const OSUnMapTbl =0, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /0x00 to 0x0F4, 0,

14、 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /0x10 to 0x1F5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /0x20 to 0x2F4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /0x30 to 0x3F6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /0x40 to 0x4F4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /0x50 to 0x5F

15、5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /0x60 to 0x6F4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,/0x70 to 0x7F7, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,/0x80 to 0x8F4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,/0x90 to 0x9F5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,/0xA0 to 0xA

16、F4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,/0xB0 to 0xBF6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,/0xC0 to 0xCF4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,/0xD0 to 0xDF5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,/0xE0 to 0xEF4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0 /0xF0 to 0xF

17、F;圖 3 OSUnMapTbl 2.3 C /OS- 任務調度原理C /OS- 內核調用函數(shù) OS_Sched(來 完成任務調度。函數(shù) OS_Sched(首 先找 出最高 優(yōu)先級任務的任務號 , 再與當前任務的任務號比較判斷是否需要調度 , 如果 兩個任務號不相 等則說明有更高優(yōu)先級的任務進入就緒態(tài)需要進行任務調度 , 然后 進入上下文切換完成任務 調度 ,反之則說明當前任務具有最高優(yōu)先級 ,退出 OS_Sched( 繼續(xù)執(zhí)行當前任務。有關內 核源碼如下 :/ File : OS_CORE.Cvoid OS_Sched (voidINT8U y;OS_ENTER_CRITICAL(;if (

18、OSIntNesting = 0 & (OSLockNesting = 0 y= OSUnMapTblOSRdyGrp; /* 查找最高優(yōu)先級 */OSPrioHighRdy = (INT8U(y 3 + OSUnMapTblOSRdyTbly;if (OSPrioHighRdy != OSPrioCur /* 判斷是否需要任務切換 */OSTCBHighRdy = OSTCBPrioTblOSPrioHighRdy;OSCtxSwCtr+;OS_TASK_SW(; /* 進行上下文切換 */OS_EXIT_CRITICAL(;首先 OS_Sched(通 過以上分析的最高優(yōu)先級算法找出就緒最高

19、優(yōu)先級任務的 任務號 OSPrioHighRdy ,判斷是否需要調度 ,即就緒態(tài)最高優(yōu)先級任務的任務號 OSPrioHighRdy 和 當前任務的任務號 OSPrioCur 是否相等 ,如果相等說明當前任務 具有最高的優(yōu)先級 ,退出 OS_Sched(接 著執(zhí)行當前任務 ;如果不相等則說明更高優(yōu)先 級的任務進入就緒態(tài) ,此時需 要開始調度任務。通過就緒態(tài)最高優(yōu)先級任務的任務 號 OSPrioHighRdy 使 OSTCBHighRdy 指向最高優(yōu)先級任務的任務控制塊 ,然后內核 任務切換次數(shù) OSCtxSwCtr 加 1,調用 OS_TASK_SW(進行上下文切換 ,運行新的任 務。上下文切換

20、部分是跟 CPU 緊密相關的 , 不同的 CPU 這部分代碼不同 , 但所做的 事情都 是一樣的 ,就是切換任務運行新的任務。本文不針對某一款 CPU 詳細分析源 代碼 ,只詳述 操作的步驟。首先 ,將當前任務的狀態(tài)需要保存起來 ,即程序計數(shù)器指針 PC ,狀態(tài)寄存器 和寄存器壓入任務棧加以保存 , 然后把任務棧棧頂指針存入自己的 OS_TCB中 OSTCBStkPtr 字段,接下來開始切換任務。在切換任務時首先更新 OSPrioCur 和 OSTCBCur (OSPrioCur 是內核運行任務的任務號 , OSTCBCur 指向內 核運行任務的任務控制塊 , 即 OSPrioHighRdy

21、和 OSTCBHighRdy 賦給 OSPrioCur 和 OSTCBCur , 然后從 OSTCBCur 中得到任務堆棧指針 OSTCBStkPtr ,賦給 CPU 堆 棧指針,從堆棧中取出最高優(yōu)先級任務的狀態(tài)即程序計數(shù)器指 針 PC ,狀態(tài)寄存器和 寄存器 ,把這些值分別恢復到處理器的 PC ,狀態(tài)寄存器和寄存器 ,然 后就開始新任務 的執(zhí)行 ,如此便完成了任務的調度。3. 結論C/OS-II 作為一個嵌入式實時操作系統(tǒng)內核已被廣泛應用于各種場合。本文 引用 C /OS- 內核源代碼詳細分析了內核調度的實現(xiàn) , 只有對內核調度原理有深 層次的了解后 , 才 能在具體的工程應用中將 C/OS-II 內核移植到各種嵌入式處理器 平臺。參考文獻1 Labrosse J J.嵌入式實時操作系統(tǒng) C /OS- 第 2版M .邵貝貝 , 等譯.北京 : 北京航天航空大學出版 社 , 20032 周立功 , 等. ARM 微控制器基礎與實踐 M . 北京 :北京航空航天大學出版 社 , 2

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論