天天看點

μC/OS排程器及任務建立、挂起、恢複、删除、初始化函數的使用

1、在多任務系統中,令CPU中止目前運作的任務轉而去運作另一個任務的工作叫做任務切換,而按照某種規則進行任務切換的工作叫做任務的排程

2、在μC/OS-II中,任務排程是由任務排程器來完成的

3、任務排程器主要兩項工作:①在任務就緒表中查找具有最高優先級别的就緒任務②中斷級的排程器

4、任務級的排程器由函數OSSched()實作,中斷級的排程器由函數OSIntExt()實作

5、排程器做任務切換的工作:①獲得運作任務的TCB指針②進行斷點資料的切換

6、排程器真正實施任務切換之前的主要工作是獲得待運作任務的任務控制塊指針和目前的任務控制塊指針,μC/OS-II允許應用程式通過調用函數OSSchedLock()和OSSchedUnlock()給排程器上鎖和解鎖

7、排程器OSSched()在确認未被上鎖并且不是中斷服務程式調用排程器的情況下,首先從任務就緒表中查到最高優先級級别就緒任務的優先級别OSPrioHighRdy,然後再确認這個就緒任務不是目前正在運作的任務

8、排程器在任務切換前獲得的兩個指針OSTCBCar和OSTCBllighRdy

μC/OS排程器及任務建立、挂起、恢複、删除、初始化函數的使用

9、任務切換的工作是靠OSCtxSw()來完成的,任務切換就是中止正在運作的任務,轉而去運作另一個任務的操作,當然,這個任務應該是就緒任務中優先級别最高的那個任務

10、一個任務保護斷點時的壓棧動作:

μC/OS排程器及任務建立、挂起、恢複、删除、初始化函數的使用

11、一個被中止的任務能否正确的在斷點處恢複運作,關鍵在于能否正确地在CPU各寄存器中恢複斷點資料;而能否正确的恢複斷點資料的關鍵是CPU的堆棧指針SP是否有正确的指向

12、任務的切換就是斷點資料的切換,斷點資料的切換也是CPU堆棧指針的切換

13、排程器進行任務切換的動作:

μC/OS排程器及任務建立、挂起、恢複、删除、初始化函數的使用

完成此任務時,OSCtxSw()做了7項工作:

①把被中止任務的斷點指針儲存到任務堆棧中

②把CPU通用寄存器的内容儲存到任務堆棧中

③把被終止任務的任務堆棧指針目前值儲存到該任務的任務控制塊的OSTCBStkPtr中

④獲得待運作任務的任務控制塊

⑤使CPU通過任務控制塊獲得待運作任務的任務堆棧指針

⑥把待運作任務堆棧中通用寄存器的内容恢複到CPU的通用寄存器中

⑦使CPU獲得待運作任務的斷點指針

2.5

1、建立任務的實質是建立一個任務控制塊,并通過任務控制塊把任務代碼和任務堆棧關聯起來形成一個完整的任務

2、μC/OS-II建立任務的函數:OSTaskCreate()和OSTaskCreateExt()(該函數是OSTaskCreate()的擴充,并提供了一些附加功能)

3、OSTaskCreate()的源代碼

μC/OS排程器及任務建立、挂起、恢複、删除、初始化函數的使用
μC/OS排程器及任務建立、挂起、恢複、删除、初始化函數的使用
μC/OS排程器及任務建立、挂起、恢複、删除、初始化函數的使用
μC/OS排程器及任務建立、挂起、恢複、删除、初始化函數的使用

2.5.2

OSTaskCreateExt()函數的原型:

μC/OS排程器及任務建立、挂起、恢複、删除、初始化函數的使用

2.5.3

1、在調用函數OSStart()之前先建立一個任務,并賦予它最高的優先級别,進而使它成為起始任務,然後在這個起始任務中,在建立其他各任務

2、PC功能函數:

μC/OS排程器及任務建立、挂起、恢複、删除、初始化函數的使用

2.6

1、挂起一個任務表示停止這個任務的運作

2、任務的挂起和恢複

μC/OS排程器及任務建立、挂起、恢複、删除、初始化函數的使用

2.6.1

1、挂起任務函數OSTaskSuspend(INT8U prio);

2、函數OSTaskSuspend()的流程圖:

μC/OS排程器及任務建立、挂起、恢複、删除、初始化函數的使用

2.6.2

1、恢複任務函數OSTaskResume()的原型:

INT8U OSTaskResume (INT8U prio);

2、函數OSTaskResume()的流程圖:

μC/OS排程器及任務建立、挂起、恢複、删除、初始化函數的使用

2.7.1

1、任務優先級别的修改通過調用函數OSTaskChangePrio()來實作,OSTaskChangePrio()函數的原型:

INT8U OSTaskChangePrio(

                     INT8U oldprio,

                     INT8U newprio,

                     );

2.7.2

1、任務的删除表示把任務置于睡眠狀态(做法:把被删除任務的任務控制塊從任務控制塊連結清單中删除,并歸還給空任務控制塊連結清單,然後在任務就緒表中把該任務的就緒狀态置0)

2、調用函數OSTaskDel()來實作删除任務自身或者出了空閑任務之外的其他任務的功能,函數OSTaskDel()的原型:#if OS_TASK_DEL_EN

                                    INT8U OSTaskDel(

                                                  INT8U prio

                                                  );

3、請求删除任務函數OSTaskDelReq(),其原型:

INT8U OSTaskDelReq(

                  INY8U prio

                  );

其中OSTaskDelReq()的流程圖:

μC/OS排程器及任務建立、挂起、恢複、删除、初始化函數的使用

2.7.3

1、通過調用函數OSTaskQuery()來擷取標明的任務的資訊,其原型為:

INT8U OSTaskQuery(

                 INT8U prio,

                 OS_TCB * pdata

                );

2.8

2.8.1

1、在使用μC/OS-II所有服務之前,必須調用初始化函數OSInit(),對μC/OS-II自身運作的環境進行初始化

2、初始化函數OSInit()對資料結構進行初始化時,主要是建立包括空任務控制塊連結清單在内的5個空資料緩沖區,而且為了快速的查詢任務控制塊連結清單中的各元素,OSInit()還要建立一個數組OSTCBPrioTbl[OS_LOWEST_PRIO+1],這個數組裡按任務的優先級别的順序呢把任務控制塊的指針存放在對應的元素中

3、μC/OS-II初始化後的資料結構:

μC/OS排程器及任務建立、挂起、恢複、删除、初始化函數的使用

初始化後全局變量的情況:

μC/OS排程器及任務建立、挂起、恢複、删除、初始化函數的使用
μC/OS排程器及任務建立、挂起、恢複、删除、初始化函數的使用

2.8.2

μC/OS-II進行任務的管理是從調用啟動函數OSStart()開始的,其前提條件是在調用該函數之前至少建立了一個使用者任務

調用函數OSStart()後的資料結構:

μC/OS排程器及任務建立、挂起、恢複、删除、初始化函數的使用

2.10

小結:1、任務是由任務控制塊,任務堆棧和任務代碼組成

2、系統是按任務就緒表和任務的優先級别分别來排程的

3、任務切換的核心工作是任務堆棧指針的切換

4、任務排程器代碼的設計,使得它的運作時間與系統中的任務數無關,進而使它滿足了實時系統的要求

5、任務的優先級别也是任務的辨別

6、應用程式首先應該調用函數OSInit()對全局變量和資料結構進行初始化,以建立μC/OS-II的運作環境

7、應用程式是通過調用函數OSStart()開始進入多任務管理的,但在調用函數OSStart()之前,必須至少建立了一個任務

繼續閱讀