從任務的儲存結構來看,ucos-ii的任務由三個組成部分構成:任務程式**,任務堆疊和任務控制塊。其中,任務控制塊用來儲存任務屬性;任務堆疊用來儲存任務工作環境;任務程式**是任務的執行部分。
ucos-ii的任務組成
ucos-ii的任務有兩種:使用者任務和系統任務。由應用程式設計者編寫的任務,叫做使用者任務;由系統提供的任務叫做系統任務。使用者任務是為解決應用問題而編寫的;系統任務是為應用程式來提供某種服務的。
目前ucos-ii可支援多達64個任務(包括使用者任務和系統任務)進行管理。
為了管理上的方便,ucos-ii把每乙個任務都作為乙個節點,然後把它們鏈結成下圖所示的乙個任務鍊錶。
因為在嵌入式系統中只有乙個cpu,所以在乙個具體時刻只能允許乙個任務占用cpu。根據任務是否占用cpu,以及是否處於被中斷,等待等情況,任務在ucos-ii中可能處於下圖5種狀態之一。
任務的5種狀態
任務在不同狀態之間的轉換:
任務狀態的轉換
根據嵌入式系統任務的工作特點,任務的執行**通常是乙個無限迴圈結構,並且在這個迴圈中可以響應中斷,這種結構也叫做超迴圈結構。
乙個用c語言編寫的任務(超迴圈結構的任務示意性**):
void mytask( void *pdata )
}從程式設計的角度來看,乙個ucos-ii任務的**就是乙個c語言函式.為了可以傳遞各種不同型別的資料甚至是函式,任務的引數是乙個void型別的指標.
為了有效地對中斷進行控制,在任務的**裡可使用ucos-ii定義的巨集os_enter_critical()和os_exit_critical()來控制任務何時響應中斷,何時遮蔽中斷。在執行這兩個巨集之間的**時是不會響應中斷的,這種受保護的**段叫做臨界段。在具體應用中可以根據實際需要在乙個任務中使用這對巨集設定多個臨界段。
因此可以說,ucos-ii任務的**結構是乙個帶有臨界段的無限迴圈。
從程式**上來看,使用者任務似乎就是乙個c語言函式,但是這個函式不是一般的c語言函式,它是乙個任務(執行緒)。因此,它不是被主函式或其他函式呼叫的,主函式main()只負責建立和啟動它們,而由作業系統負責來排程執行它們。從**上來看,使用者應用程式的**大體上如下面所示:
使用者應用程式的結構。
void mytask1( void *pdata ) // 定義使用者任務1
}void mytask2( void *pdata ) // 定義使用者任務2
}void mytask3( void *pdata ) // 定義使用者任務3
} void main()
ucos-ii預定義了兩個為應用程式服務的系統任務:空閒任務和統計任務。其中空閒任務是每個應用程式必須使用的,而統計任務則
是應用程式可以根據實際需要來選擇使用的。
在多工系統執行時,系統經常會在某個時間內無使用者任務可執行而處於所謂的空閒狀態。為了使cpu在沒有使用者任務可執行
時有事可做,ucos-ii提供了乙個叫做空閒任務ostaskidle()的系統任務。空閒任務的**如下:
void ostaskidle( void *pdata)
} 這裡有一行**為 pdata = pdata,之所以安排了這樣一行**,是因為在這個任務中沒有用到引數pdata。對於某些c編譯器,在對代
碼進行編譯時會對這種情況報錯(說定義了引數卻沒有使用),有了這行**,編譯器就不會報錯了。
從上面的**中可以看到,這個空閒任務幾乎不做什麼事情,只是對系統定義的乙個空閒任務執行次數計數器osidlectr進行加1操作。
當然,如果使用者認為有必要,那麼也可在空閒任務中編寫一些做使用者工作的**。
ucos-ii規定,乙個使用者應用程式必須使用這個空閒任務,而且這個任務是不能用軟體來刪除的。
ucos-ii提供的另乙個系統任務是統計任務ostaskstat()。這個統計任務每秒計算一次cpu在單位時間內被使用的時間,並把計算結
果以百分比的形式存放在變數oscpuusage中,以便應用程式通過訪問它來了解cpu的利用率,所以該系統任務ostaskstat()叫做統計任
務。使用者應用程式是否使用統計任務,使用者可以根據應用程式的實際需要來進行選擇。如果使用者應用程式要使用這個統計任務,則必須把定義在系統標頭檔案os_cfg.h中的系統配置常數os_task_stat_en設定為1,並且必須在建立統計任務之前呼叫函式osstatinit()對統計任務進行初始化。
前面已提及ucos-ii的每個任務都必須具有乙個惟一的優先級別。ucos-ii把任務的優先權分為64個優先級別,每乙個級別都用乙個數字來表示。數字0表示任務的優先級別最高;數字越大則表示任務的優先級別越低。
通常乙個應用程式的任務數小於64。為了節省記憶體,使用者可以根據應用程式的需要,在檔案os_cfg.h中通過給表示最低優先順序別的常數os_lowest_prio賦值的方法,來說明程式中任務優先順序別的數目。該常數一旦被定義,就意味著系統中可供使用的優先級別為0,1,2,...,os_lowest_prio,共os_lowest_prio+1個。同時也限制了應用程式中任務的總數最多不能超os_lowest_prio+1個。固定地,系統總是把最低優先級別os_lowest_prio自動賦給空閒任務。如果應用程式中還使用了統計任務,則系統會把優先級別os_lowest_prio-1自動賦給統計任務,因此使用者任務可以使用的優先級別是0,1,2,...,os_lowest_prio-2,共os_lowest_prio-1個。
例:
如果希望應用程式中任務的優先級別為28個,則表示最低優先順序別的常數os_lowest_prio值應該是多少?如果應用程式中使用了系統提供的空閒任務和統計任務,則該應用程式最多可以安排多少個任務?
答:表示最低優先順序別的常數os_lowest_prio值應該為27,優先級別分別為0,1,2,3,...,27;由於系統空閒任務占用了優先級別27,統計任務占用了優先級別26,則應用程式中最多可以安排優先級別分別為0,1,2,...,25的26個任務。
給某乙個使用者任務的定義優先級別,需要在呼叫系統函式ostaskcreate()來建立任務時,用該函式的第4個引數prio來指定。
由於每個任務都具有惟一的優先級別,因此ucos-ii通常也用任務的優先級別來作為這個任務的標識。
基於linux平台的ucos 2.86應用程式示例如下:主要是根據ucos中的api建立倆個簡單的task。
其**結構為:
上面的執行的結果類似如下:
uCOS II的任務介紹1
從任務的儲存結構來看,ucos ii 的任務由三個組成部分構成 任務程式 任務堆疊和任務控制塊。其中,任務控制塊用來儲存任務屬性 任務堆疊用來儲存任務工作環境 任務程式 是任務的執行部分。ucos ii 的任務組成 ucos ii 的任務有兩種 使用者任務和系統任務。由應用程式設計者編寫的任務,叫做...
ucos ii 任務的刪除
建立任務的過程,首先分配乙個空閒的tcb給任務,然後對該tcb的各個域進行賦值,對任務的堆疊進行初始化,其中,任務的 的位址被壓入堆疊。這為以後任務的執行做了充分準備。就緒表和就緒組做了適當的處理,根據任務的優先順序進行了設定。就緒tcb鍊錶也插入了該tcb。那麼若將任務刪除,就是任務建立的逆過程,...
UC OS II的任務堆疊
堆疊就是一種先入後出的資料結構,在uc os ii作業系統中每乙個任務都會有自己的任務堆疊,那麼什麼是任務堆疊。我的理解是,任務堆疊就是一片空間,它可以儲存一些資訊,因為在作業系統下,程式是併發執行的,也就是說,乙個使用者程式不可能一下子執行完,比如任務1執行了一半,再執行任務2,那麼我們就得把一些...