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