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