|
1、首先大家可以看看任哲的《嵌入式實時操作系統(tǒng)uCOS-II原理及應(yīng)用》
這本書非常適合初學者學習 uCOS-ii
2、 請問:空閑任務(wù)和統(tǒng)計任務(wù)是否建立任務(wù)控制塊呢?
任務(wù)塊鏈表中是否存在空閑任務(wù)和統(tǒng)計任務(wù)的任務(wù)控制塊呢?如果沒有的話,操作系統(tǒng)如何調(diào)度呢?
標準答案:
在uCOS/ii內(nèi)核中,調(diào)用OSInit()函數(shù)中會首先創(chuàng)建空閑任務(wù),同時當用戶“允許”統(tǒng)計任務(wù)時,也會接著創(chuàng)建統(tǒng)計任務(wù)。
因此任務(wù)塊鏈表中存在空閑任務(wù)和統(tǒng)計任務(wù)的任務(wù)控制塊。
3、 請問:為什么有了正在使用任務(wù)控制塊鏈表OSTCBList和空閑任務(wù)控制塊鏈表OSTCBFreeList,還要再定義OSTCBPrioTbl[]呢?
標準答案:
數(shù)組OSTCBPrioTbl[]是以任務(wù)號為索引,里面保存的任務(wù)0到最大任務(wù)的任務(wù)控制塊(TCB)的首地址,據(jù)此可以通過任務(wù)優(yōu)先級號(任務(wù)號)快速找到當前任務(wù)在任務(wù)控制塊中的首指針,而不必到任務(wù)控制塊鏈表中一步一步的查找,加快訪問時間。加快任務(wù)切換時間。
4、 uCOS/II中,能夠引起任務(wù)調(diào)度的系統(tǒng)函數(shù)有哪些?
(1)、OSStart() uCOS/II啟動
(2)、OSTaskSuspend()掛起任務(wù)
(3)、OSTaskResume()恢復任務(wù)
OSTimeDly()/OSTimeDlyHMSM()、等待一個事件的發(fā)生(包括OSSemPend(), OSMutexPend, OSFlagPend, OSMboxPend(), OSQPend(),
5、 請問:既然有了任務(wù)就緒表INT8U OSRdyTbl[64],為什么還要再定義
INT8U OSRdyGrp[8]呢?這樣做的好處是什么?
標準答案:
OSRdyTbl[64]是任務(wù)就緒表,當表中 元素的值=1時,表示 任務(wù)處于就緒狀態(tài)。 例如: OSRdyTbl[0]= 1,則表示:任務(wù)級別號=0的任務(wù)處于就緒狀態(tài),可以被調(diào)度器立即置于“運行態(tài)”。
為了節(jié)省查找時間(如果讓操作系統(tǒng)每次查找處于就緒狀態(tài)的最高優(yōu)先級別的任務(wù)時,都從下標0開始查找,有點太浪費時間了),因此又專門定義了一個數(shù)組OSRdyGrp[8]。
其中:
(1)、OSRdyGrp[0]對應(yīng)OSRdyTb[0]~OSRdyTbl[7]
(2)、OSRdyGrp[1]對應(yīng)OSRdyTb[8]~OSRdyTbl[15]
(3)、OSRdyGrp[2]對應(yīng)OSRdyTb[16]~OSRdyTbl[23]
這樣,每次查找就緒表中最高優(yōu)先級別的任務(wù),就可以這樣查找,首先查找依次從OSRdyGrp[0]~OSRdyGrp[7]開始查找不等于0的項,假如OSRdyGrp[1] >=1,則表示任務(wù)號8到任務(wù)號15有級別最高的就緒任務(wù)。
最終查找范圍從0-64縮小到8-15。最終節(jié)省了查找時間。
6、 請問:任務(wù)調(diào)度的核心是什么?
標準答案:
在多任務(wù)操作系統(tǒng)中,命令CPU中止當前正在運行的任務(wù)轉(zhuǎn)而去運行另外一個任務(wù)的工作叫做任務(wù)切換。
任務(wù)調(diào)度主要完成兩個工作:
(1)、在任務(wù)就緒表中查找具有最高優(yōu)先級別的就緒任務(wù)。
(2)、實現(xiàn)任務(wù)切換
說的更明白一些,就是將找到的的最高優(yōu)先級別的任務(wù)的“任務(wù)號”---> “當前任務(wù)的任務(wù)號OSPrioCur”;從OSTCBPrioTbl[]取出最高優(yōu)先級別任務(wù)的任務(wù)控制塊首地址---> “當前任務(wù)的任務(wù)控制塊指針OSTCBCur”
最后調(diào)用OS_TASK_SW()完成現(xiàn)場切換(即將CPU的寄存器信息保存到當前正運行任務(wù)的私棧中,然后從待運行的高優(yōu)先級別的任務(wù)私棧中彈出原先保存寄存器信息到CPU)。
//-----------------------------------
OSPrioCur 是全局變量,用于保存當前正在運行任務(wù)的任務(wù)號
OSTCBCur是全局變量,用于指向當前正在運行任務(wù)的任務(wù)控制塊首地址。
7、任務(wù)切換的關(guān)鍵:其實是堆棧的切換。
切換時:
(1)、第一步:將當前CPU的SP寄存器的值保存到“待中止任務(wù)”的任務(wù)控制塊中。即保存到結(jié)構(gòu)體OS_TCB的OSTCBStkPtr成員中。
(2)、第二步:從“待運行任務(wù)”的任務(wù)控制塊的OSTCBStkPtr成員中取出待運行任務(wù)的堆棧指針,然后送給CPU的SP寄存器。
信盈達靠技術(shù)打天下
以下課程可免費試聽C語言、電子、PCB、STM32、Linux、FPGA、JAVA、安卓等。
想學習的你和我聯(lián)系預約就可以免費聽課了。
余工Q 二八五九七八零二零三
|
|