任務的概念
在實際應用中一般是將工作拆分爲多個任務的,並且每個任務都是可靠的。在使用uC/OS就可以很好的解決這個問題,任務又叫線程,在對於單個CPU來說,在任何時刻,都是只能有有一個任務被執行。
uC/OS-III 支持多任務且對任務數量沒有限制,任務數僅取決於處理器內存的大小(RAM)。多任務調度是任務間佔用CPU 的過程。CPU 有根據算法切換任務。多任務調度讓人感覺到是有多個CPU在運行,並最大化利用CPU。多任務調用有助於模塊化應用,是最重要的功能之一,能幫助程序員管理複雜的實時性應用。它也使程序易於設計和維護。
任務用於監控輸入、更新輸出、計算、循環控制、顯示、讀按鈕和鍵盤、與其它系統交流等。有些應用中可能只包含少數任務,有些應用中也可能包含上百個任務。任務數多並不意味這設計有多好或者有多有效,這依賴於應用的需要。任務的功能也要根據應用設計。一個任務可能只需要工作幾微秒,然而有些任務可能就需要工作幾十毫秒了。
在大多數嵌入式系統中,任務通常是無限循環的。任務不能像C 函數那樣,它是不能return 的。
當任務第一次執行時,會傳入一個變量"p_arg"。這是一個指向void的指針。用於變量的地址、結構體地址、或者函數的地址等。只運行一次的任務結束時必須通過調用OSTaskDel()刪除自己。這樣可以使系統中的任務數減少。在任務體中,任務可以調用uC/OS-III提供的大部分函數幫助完成其所需要完成的功能。
uC/OS-III 需要通過調用函數OSTaskCreate() 創建任務。OSTaskCreate()函數的原型如下所示
關於創建任務的詳細參數,前面也有說過了創建一個任務時必須爲其分配一個TCB(Task Control Block,會存放任務優先級、任務名、任務狀態、內部消息隊列、內部信號量等),一個堆棧,一個優先級和其它一些參數。
接下來, 會調用一些定義在OS_CPU_C.C 中的函數如OSTaskCreateHook(),TCB 中有指針指向這個函數,用於擴展應用。例如,可以打印最新創建的TCB 內容到某終端(利於調試)。然後該任務被放到就緒列表(詳見第六章"就緒列表")。uC/OS-III調用調度器,並切換到優先級最高的任務。
一.任務優先級的設置
有些時候任務的優先級是顯而易見的,多數系統中,不是所有的任務都是重要的,不重要的任務應該被設置爲低優先級。
二.堆棧空間大小的確定
三.檢測任務堆棧的溢出
四.任務管理服務
分組 | 函數 |
普通的 | OSTaskCreate():創建人物 OSTaskDel():刪除任務 OSTaskChangePrio():修改任務優先級 OSTaskRegSet():任務寄存器設置 OSTaskRegGet():獲取當前寄存器的值 OSTaskSuspend():取消任務 OSTaskResume():恢復任務 OSTaskTimeQuantaSet():更改任務時間片 OS_TaskInit():任務初始化 OS_TaskInitTCB():初始化堆棧的默認值 |
標記任務 | OSTaskSemPend():等待接收任務信號量 OSTaskSemPost():表示等待任務的信號 OSTaskSemPendAbort():終止等待任務信號 OSTaskSemSet():設置清除信號計數器 OSTaskStkChk():被用來檢測堆棧後剩餘內存量 |
給任務發送消息 | OSTaskQPend():等待接收一個消息 OSTaskQPost():發送信息給任務 OSTaskQPendAbort():中止等待消息 OSTaskQFlush():刷新內部任務消息隊列 OS_TaskResume():恢復一個已經移除的任務 |
五.內部任務管理
1任務狀態
(1)處於休眠狀態的任務駐留於內存但未被uC/OS-III 使能。通過調用OSTaskCreate()函數uC/OS-III 創建任務。任務代碼是存在於ROM 的。但需要用OSTaskCreate()函數通知uC/OS-III 關於任務的相關信息。如果任務的使命完成了,就要調用OSTaskDel()刪除該任務。OSTaskDel()實際上不是刪除任務的代碼,只是讓任務不再具有使用CPU 的資格而已。
(2)就緒狀態的任務根據優先級有序地排列於就緒列表中。就緒列表中對就緒任務的個數沒有限制。
(3)正在運行的任務被置爲運行狀態。在單CPU 中,任何時刻只能有一個任務被運行。當應用程序調用OSStart() 或者調用OSIntExit() 或者調用OS_TASK_SW()時uC/OS-III 從就緒隊列中選擇優先級最高的任務去運行。正如前面所提到的,有些時候任務必須等待某些事件發生,若事件還未發生時,任務就會被設置爲掛起狀態。
嵌套是很容易引起堆棧溢出的。
(1)任務可以通過調用OSTimeDly()或者OSTimeDlyHMSM()等待期滿。當期滿或者延時刪除時(通過調用OSTimeDlyResume()),任務會轉爲就緒狀態。
(3)如前面所說,任務可以等待事件發生。但任務也可以被設置等待多少時間。如果在這段時間內事件沒有發生,任務也會被設爲就緒狀態,並通知這個任務是等待超時而被掛起的。{掛起函數都有一個關於函數執行結果錯誤代號,可以查看這個代號知道任務是因何被就緒的}
(4) 任務暫停自己或者被其他任務暫停( 通過調用OSTaskSuspend())。暫停中的任務只能通過調用OSTaskResume()被恢復。
(5)一個延時中的任務也可以被其它任務設置爲停止。在這種情況下,效果會被疊加。換句話說,延時需被執行、停止狀態需被解除。該任務纔會被執行。
(6)一個掛起狀態中的任務也可能被其它任務設置爲停止。同樣的,效果會被疊加。事件發生且停止狀態被移除後,任務纔會被執行。
(7)任務可以等待事件的發生,但可以給它設定一個期限。同樣的,它也可能被設爲停止,效果是疊加的。除非移除停止狀態並事件發生或等待事件超時,任務纔會被執行。