uc/os中对任务的总体理解
原文:點(diǎn)擊打開(kāi)鏈接
一. 任務(wù)的基本概念
任務(wù)控制塊:關(guān)聯(lián)了任務(wù)代碼的程序控制塊,它記錄了任務(wù)的各個(gè)屬性;
任務(wù)堆棧:用來(lái)保存任務(wù)的工作環(huán)境。
任務(wù)程序代碼:就是任務(wù)的執(zhí)行部分。
2. 任務(wù)的狀態(tài)
睡眠狀態(tài):任務(wù)在沒(méi)有配備任務(wù)控制塊或被剝奪了作務(wù)控制塊時(shí)的狀態(tài)。
就緒狀態(tài):配備了任務(wù)控制塊并在任務(wù)就緒表中進(jìn)行了就緒登記。
運(yùn)行狀態(tài):處于就緒狀態(tài)的任務(wù)如果經(jīng)調(diào)試器判斷獲得了CPU的使用權(quán)。
等待狀態(tài):正在運(yùn)行的任務(wù),需要等待一段時(shí)間,會(huì)把CPU讓出來(lái),從而進(jìn)入等待狀態(tài)。
中斷服務(wù)狀態(tài):正在運(yùn)行的任務(wù)響應(yīng)中斷申請(qǐng)就會(huì)中止運(yùn)行而去執(zhí)行中斷服務(wù)程序,這時(shí)的狀態(tài)叫做中斷服務(wù)狀態(tài)。
3. 任務(wù)的優(yōu)先級(jí)
最多64個(gè)任務(wù),也就是最多有64個(gè)優(yōu)先級(jí)。0~63
在配置文件OS_CFG.H中定義了一個(gè)用來(lái)表示最低優(yōu)先級(jí)別的常數(shù)OS_LOWEST_PRIO,所以系統(tǒng)可用的優(yōu)先級(jí)別為0~OS_LOWEST_PRIO。
但是一般OS_LOWEST_PRIO會(huì)自動(dòng)賦給空閑任務(wù),OS_LOWEST_PRIO - 1會(huì)自動(dòng)賦給統(tǒng)計(jì)任務(wù)。
二. 任務(wù)的堆棧
注意處理器所支持的堆棧增長(zhǎng)的方向:
[cpp]?view plain?copy三. 任務(wù)控制塊及其鏈表
[cpp]?view plain?copy
一條空任務(wù)塊鏈表,其中所有任務(wù)控制塊還未分配給任務(wù)。由OSInit()創(chuàng)建。
一個(gè)任務(wù)塊鏈表,其中所有任務(wù)控制塊已分配給任務(wù)。由OSTaskCreate()創(chuàng)建。
圖3-6是在圖3-5所示的空任務(wù)控制塊鏈表甚而上,應(yīng)用程序創(chuàng)建了兩個(gè)用戶任務(wù)并使用了兩個(gè)系統(tǒng)任務(wù)的情況。
四. 任務(wù)就緒表及任務(wù)調(diào)度
是一個(gè)位圖,每一位代表一個(gè)任務(wù),1表示就緒,0表示非就緒。
可以看出一個(gè)元素可以表達(dá)8個(gè)任務(wù)的就緒狀態(tài)。
還有一個(gè)變量表示哪個(gè)組個(gè)元素就緒了:
優(yōu)先級(jí)也就緒表的位置關(guān)系:
2. 對(duì)任務(wù)就緒表的操作
登記:指的是當(dāng)某個(gè)任務(wù)處于就緒狀態(tài)時(shí),把就緒表中對(duì)應(yīng)的位置置1。
注銷:把就緒表中對(duì)應(yīng)的位置清0。
最高優(yōu)先級(jí)任務(wù)的查找:從表中查找出最高優(yōu)先級(jí)
3. 任務(wù)調(diào)度
調(diào)度的思想 是:近似地每時(shí)每刻讓優(yōu)先級(jí)最高的就緒任務(wù)處于運(yùn)行狀態(tài)。
具體做法是:在系統(tǒng)或用戶任務(wù)調(diào)用系統(tǒng)函數(shù)及執(zhí)行中斷服務(wù)程序結(jié)束時(shí)來(lái)調(diào)用調(diào)度器(OS_Sched())。
調(diào)度器先在任務(wù)就緒表中查找具有最高優(yōu)先級(jí)別就緒任務(wù)的代碼,然后進(jìn)行任務(wù)切換。
任務(wù)切換的工作分成兩步:第一步是獲得待運(yùn)行任務(wù)的TCB指針;第二步是進(jìn)行斷點(diǎn)數(shù)據(jù)的切換。
任務(wù)切換的工作是靠OSCtxSw()來(lái)完成的。
五. 任務(wù)的創(chuàng)建
OSTaskCreateExt()
六. 任務(wù)的掛起和恢復(fù)
掛起任務(wù):
INT8U OSTaskSuspend(INT8U prio);
恢復(fù)任務(wù):
INT8U? OSTaskResume (INT8U prio);
任務(wù)的刪除:
INT8U? OSTaskDel (INT8U prio);
也就是把該任務(wù)置于睡眠狀態(tài),把任務(wù)控制塊鏈表中刪除,并歸還給空任務(wù)控制鏈表。
總結(jié)
以上是生活随笔為你收集整理的uc/os中对任务的总体理解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: uc/os-II(source)各种文件
- 下一篇: OS_CORE.C(总结)