在實際應用中一般是將工作拆分為多個任務的,並且每個任務都是可靠的。在使用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呼叫排程器,並切換到優先順序最高的任務。
有些時候任務的優先順序是顯而易見的,多數系統中,不是所有的任務都是重要的,不重要的任務應該被設定為低優先順序。
堆疊的大小取決於該任務的需求。設定堆疊大小時,就需要考慮:所有可能被堆疊呼叫的函式及其函式的巢狀層數,相關區域性變數的大小,中斷服務程式所需要的空間。另外,堆疊還需要存入cpu暫存器,如果處理浮點數單元fpu暫存器的話就還需要存入fpu暫存器。
嵌入式系統的潛規則,避免寫遞迴函式。在產品的開發和測試階段,通常在執行時用偵錯程式測量堆疊的使用情況。
比較複雜,後文再寫,因為不是很懂
uc/os-iii 提供了很多與任務相關的函式。這些函式可以在os_task.c 中找到,它們都以以ostask***()形式命名的。如下
分組函式
普通的ostaskcreate():建立人物
ostaskdel():刪除任務
ostaskchangeprio():修改任務優先順序
ostaskregset():任務暫存器設定
ostaskregget():獲取當前暫存器的值
ostasksuspend():取消任務
ostaskresume():恢復任務
ostasktimequantaset():更改任務時間片
os_taskinit():任務初始化
os_taskinittcb():初始化堆疊的預設值
標記任務
ostasksempend():等待接收任務訊號量
ostasksempost():表示等待任務的訊號
ostasksempendabort():終止等待任務訊號
ostasksemset():設定清除訊號計數器
ostaskstkchk():被用來檢測堆疊後剩餘記憶體量
給任務傳送訊息
ostaskqpend():等待接收乙個訊息
ostaskqpost():傳送資訊給任務
ostaskqpendabort():中止等待訊息
ostaskqflush():重新整理內部任務訊息佇列
os_taskresume():恢復乙個已經移除的任務
在源**中,針對每個函式都有很詳細的解說是什麼,該怎麼用,這邊不再說明
1任務狀態
從使用者的觀點來看,任務可以是有5 種狀態,如下。展示了任務狀態間的轉換關係。
(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 從就緒佇列中選擇優先順序最高的任務去執行。正如前面所提到的,有些時候任務必須等待某些事件發生,若事件還未發生時,任務就會被設定為掛起狀態。
(4)掛起狀態的任務被放置在掛起列表中以表明任務在等待某些事件的發生。等待的時候,任務是不會占用cpu 的。事件發生時,該任務會被放到就緒佇列中。在這種情況下,正在執行的任務可能會被搶占(被放回就緒列表),並由uc/os-iii 選擇優先順序最高的任務去執行。換句話說,如果新的任務優先順序最高,那麼它就會被立即執行。請注意,呼叫ostasksuspend()會任務無條件地停止執行。有些時候呼叫ostasksuspend()不是為了等待某個事件的發生,而是等待另乙個任務呼叫ostaskresume()函式恢復這個任務。
(5)若中斷發生,中斷會掛起正在執行的任務並去處理isr。isr中可能有某些任務等待的事件。
一般來說,中斷用來通知任務某些事件的發生,並讓在任務級處理實際的響應操作。isr 程式越短越好,實際響應中斷的操作應該被設定在任務級以便能讓uc/os-iii 管理這些操作。isr 中只允許呼叫一些提交函式(osflagpost(),osqpost()ossempost() , ostaskqpost() , ostasksempost()) , 除了osmutexpost()。因為
mutex 只允許在任務級被修改。大多數處理器支援中斷巢狀。然而,如果管理不當,中斷
巢狀是很容易引起堆疊溢位的。
uc/os-iii 一直追蹤著任務的狀態如下圖。事實上,這些都是以乙個變數的形式儲存在每個任務的tcb 中。圖小括號中的數值表示著任務的狀態,每個任務都可以有8 種狀態。
(0)狀態0 表示任務已經就緒。每個任務在被執行之前都必須處於就緒狀態。
(1)任務可以通過呼叫ostimedly()或者ostimedlyhmsm()等待期滿。當期滿或者延時刪除時(通過呼叫ostimedlyresume()),任務會轉為就緒狀態。
//這是一天的程序,但為了章節比較好看,只能列為乙個章節
(2)任務可以通過呼叫掛起函式(osflagpend(),osmutexpend(),osqpend,ossempend,ostaskqpend(),ostasksempend())等待某事件的發生。當事件發生時、該任務被刪除、或者被另乙個任務取消等待時,等待停止。
(3)如前面所說,任務可以等待事件發生。但任務也可以被設定等待多少時間。如果在這段時間內事件沒有發生,任務也會被設為就緒狀態,並通知這個任務是等待超時而被掛起的。
(4) 任務暫停自己或者被其他任務暫停( 通過呼叫ostasksuspend())。暫停中的任務只能通過呼叫ostaskresume()被恢復。
(5)乙個延時中的任務也可以被其它任務設定為停止。在這種情況下,效果會被疊加。換句話說,延時需被執行、停止狀態需被解除。該任務才會被執行。
(6)乙個掛起狀態中的任務也可能被其它任務設定為停止。同樣的,效果會被疊加。事件發生且停止狀態被移除後,任務才會被執行。
(7)任務可以等待事件的發生,但可以給它設定乙個期限。同樣的,它也可能被設為停止,效果是疊加的。除非移除停止狀態並事件發生或等待事件超時,任務才會被執行。
2 任務控制塊 tcb
任務控制塊
是被uc/os-iii 用於維護任務的乙個結構體。每個任務都必須有自己的tcb。uc/os-iii 在ram 中分配tcb。當呼叫uc/os-iii 提供的與任務相關的函式(以ostask???()形式命名)時,任務的tcb 位址需會被提供給該函式。tcb 的結構定義於os.h 中,由於結構體太長,這邊不做截圖了,可以參見os.h中struct os_tcb {}結構體,裡面有相對詳細的介紹。
tcb 中的一些變數可以根據具體應用進行裁剪。使用者程式不應該訪問這些變數(尤其不能更改它們)。換句話說,
tcb 中的變數只能被uc/os-iii 訪問。
這邊要是解釋的話,需要太長的字段,實在是意義不大,原始碼os.h 檔案寫的還比較好理解。
UCOSIII的任務狀態
1 休眠態 任務已經在cpu的flash中了,但是還沒有交給ucosiii管理。2 就緒態 系統為任務分配了任務控制塊,並且任務已經在就緒表中登記,這時這個任務就具有了執行的條件,此時任務的狀態就是就緒態。3 執行態 任務獲得cpu的使用權,正在執行。任何時刻只能有乙個任務處於執行態。4 等待態 正...
ucosIII 系統任務
系統任務 空閒任務 空閒任務特點 1.空閒任務是ucosiii建立的第乙個任務。2.空閒任務是ucosiii必須建立的。3.空閒任務優先順序總是為os cfg prio mak 1。4.空閒任務中不能呼叫任何可使空閒任務進入等待態的函式!在osinit 中呼叫 os idletaskinit p e...
UCOS iii 任務排程
任務排程的時機 1 當前任務給其他任務發訊號,結束時呼叫。任務呼叫提交服務函式 os?post 傳送訊號量或訊息給其它任務時排程發生 2 任務呼叫ostimedly 或ostimedlyhmsm 如果延時引數不是0,排程發生。排程會在該任務被放入掛起佇列後馬上執行。3 任務所等待的事件發生或超時。4...