任務基本概念 任務是一個接受操作系統管理的獨立運行單元,在 中類似與普通平臺上的 函數,需要自己來保護其因調用或中斷二產生的斷點,所以需要一個自己的私有堆棧,即任務堆棧; 任務有兩種,分為:用戶任務和系統任務; 中並沒有給任務分配獨立的運行空間,而是所有的任務共同使用一個記憶體空間,所以這裡的任務屬於 ...
任務基本概念
任務是一個接受操作系統管理的獨立運行單元,在uCosII
中類似與普通平臺上的main()
函數,需要自己來保護其因調用或中斷二產生的斷點,所以需要一個自己的私有堆棧,即任務堆棧;
任務有兩種,分為:用戶任務和系統任務;
uCosII
中並沒有給任務分配獨立的運行空間,而是所有的任務共同使用一個記憶體空間,所以這裡的任務屬於線程;
系統中的任務共有5種狀態:
- 睡眠狀態:任務只是以代碼的形式駐留在程式空間(ROM或RAM),還沒有交給操作系統管理時的情況叫睡眠狀態;
- 就緒狀態:如果系統為任務分配了任務控制塊且在任務就緒表中進行了就緒登記,則任務就具備了運行的充分條件,這時任務的狀態就是就緒狀態;
- 運行狀態:處於就緒狀態的任務如果經調度器判斷獲得CPU的使用權,則任務就進入了運行狀態,任何時刻只能有一個任務處於運行狀態;
- 等待狀態:正在運行的任務,需要等待一段時間或需要等待一個事件發生再運行時,該任務就把CPU的使用權讓給其他任務而使任務進入了等待狀態;
- 中斷服務狀態:一個正在運行的任務一旦響應中斷申請就會中止運行而去執行中斷服務程式,這時的任務狀態就是中斷服務狀態;
CosII
預定義了兩個系統任務:空閑任務和統計任務,其中空閑任務是每個應用程式必須使用的,而統計任務則是應用程式可以根據實際需要來選擇可配置的;
任務控制塊及其鏈表
任務控制塊
一條空任務塊鏈表,其中所有任務控制塊還未分配給任務;
一條任務塊鏈表,其中所有任務控制塊已分配給任務;
一個數據類型為OS_TCB*
的數據OSPrioTbl[]
,按照任務優先順序順序存放了指向各個任務控制塊的指針;
任務控制塊初始化
OSTaskCreate()
-> OSTCBInit()
;
流程:獲取一個空的任務塊 -> 創建任務控制塊並初始化成員值 -> 將該任務控制塊鏈入任務控制塊鏈表中;
任務就續表及任務調度
任務就續表
任務就續表就是一個點陣圖,系統中每個任務占據一個二進位位,1/0表示任務是否處於就緒狀態;
實質是一個類型為INT8U
的數組OSRdyTbl[]
,每個元素(每8個任務)是一個任務組;
點陣圖中按照任務優先順序高低為順序依次分配對應位;
為了便於對就緒表查找,定義了一個數據類型為INT8U
的變數OSRdyGrp
,使該變數的每一個位都對應OSRdyTbl[]
的一個任務組,如果某任務組中有任務就緒,則在變數OSRdyGrp
里把該任務組所對應的位設置1,否則為0,因此也對應最多可以管理64個任務;
任務調度
uCossII
中的任務調度由調度器來完成;
任務調度器主要工作有兩項:
- 在就續表中查找具有最高優先順序別的就緒任務;
- 實現任務的切換;
任務調度器有兩種:
- 任務級的調度器(由函數
OS_Sched()
來實現); - 中斷級的調度器(由函數
OS_IntExt()
來實現);
調度器把任務切換工作分為兩個步驟:
- 獲得待運行任務的
TCB
指針; - 進行斷點數據的切換(在巨集OS_TASK_SW()中實施任務切換,主要是靠
OSCtxSw()
);
任務的創建
uCosII
是通過任務控制塊來管理任務的,所以創建任務的實質就是創建一個任務控制塊,並通過任務控制塊把任務代碼和任務堆棧關聯起來形成一個完整的任務,還要使剛創建的任務進入就緒狀態,並且接著引發一次任務調度;
創建任務的函數有兩個:STaskCreate()
和OSTaskCreateExt()
,後者是前者的擴展,提供了一些附加功能;
uCosII
有一個規定:在調用啟動任務函數OSStart()
之前,必須已經創建了至少一個任務;不允許在中斷服務程式中創建任務;
任務的掛起和恢復
任務的掛起就是停止這個任務;
用戶任務可通過調用系統提供的OSTaskSuspend()
函數來掛起自身或者除空閑任務之外的其他任務,用該函數掛起後的任務只能在其他任務中通過調用恢復函數OSTaskResume()
使其恢復為就緒狀態;
其他任務相關函數
任務優先順序修改
OSTaskChangePrio()
在程式的運行過程中,可調用該函數來改變任務優先順序別;
任務的刪除
刪除任務就是把該任務置於休眠狀態;
可調用函數OSTaskDel()
來刪除任務自身或者除了空閑任務之外的其他任務;
刪除任務時為防止被刪除任務所占用的一些資源沒有釋放,所以解決辦法是:提出刪除任務請求的任務只負責刪除任務請求,而刪除工作則由被刪除任務自己來完成,這樣被刪除任務就可以根據自身的具體情況來決定何時刪除自身,同hi也有機會刪除自身所占用的資源;
能實現這種刪除方式的方法是:利用被刪除任務的任務控制塊成員OSTCBDelReq
作為請求刪除方與被刪除方的聯絡信號,同時提供了一個雙方都能調用的函數(請求刪除任務函數)OSTaskDelReq()
,這樣提出刪除任務請求的任務和被刪除任務雙方就能使用該函數來訪問OSTCBDelReq
這個信號,從而可以根據這個信號的狀態來決定各自的行為;
查詢任務信息
在應用程式運行中需要瞭解一個任務的指針、堆棧等信息時,可以調用函數OSTaskQuery()
來獲取選定的任務信息;