1. 程式人生 > >UC/OS-II 任務的狀態

UC/OS-II 任務的狀態

uc/os是一個搶佔式多工的實時作業系統,每個任務都有各自的狀態,並且狀態之間都有一定的轉換關係。寫下此文以作記錄及幫助自己理清關係。

在uc/os-ii中,任務的狀態有5種:睡眠態、就緒態、執行態、等待態及中斷服務態。通過下圖可以有一個大致的認知:

這裡寫圖片描述

最左邊的是睡眠態,該狀態下的任務指的是還沒交給uc/os-ii來管理,且駐留在程式空間(ROM或RAM)。把任務交給uc/os-ii管理的話需要呼叫建立任務函式,OSTaskCreate()或OSTaskCreateExt(),後者是擴充套件版本。這些呼叫只是告訴uc/os-ii,任務的起始地址在哪,任務建立時,使用者給任務賦予的優先順序是多少,任務要使用多少棧空間等。所以總結來說,沒有被建立前或者被銷燬的任務都屬於睡眠態。

當任務建立起來之後,該任務就會進入就緒態,uc/os-ii會進行任務呼叫,讓高優先順序的任務執行,即高優先順序的任務能夠獲得CPU的使用權得到執行。OSStart()可以啟動多工,它只能在啟動時呼叫一次,該函式執行使用者初始化程式碼中已經建立的、進入就緒態的優先順序最高的任務。

任何時候只能有一個任務處於執行態,即獲得了CPU的使用權,該任務可以通過呼叫OSTaskDel()將自身返回到睡眠態,或者將另一個任務進入睡眠態。

等待態顧名思義就是處於等待,等待事件的到來、時間的到來等。當處於執行態的任務呼叫OSTimeDly()或OSTimeDlyHMSM將自身延遲一段時間,該任務就會進入到等待態,或者呼叫OSSemPend()、OSQPend()等等待事件函式發生阻塞時也會使得任務進入等待態。而此時,uc/os-ii會執行任務切換,選擇優先順序最高並且處於等待狀態的任務執行。而如果等待的事件發生了或者等待超時時,被掛起的任務就會進入就緒態。

中斷服務態是正在執行的任務被中斷了而進入的狀態,響應中斷時,正在執行的任務被掛起,中斷服務子程式控制了CPU的使用權。中斷服務子程式可能會報告一個或多個事件的發生,而使一個或多個任務進入就緒態。從中斷服務子程式返回之前,uc/os-ii要判定,被中斷的任務是否還是就緒任務態中優先順序最高的。如果中斷服務子程式使得另一個優先順序更高的任務進入了就緒態,則新進入就緒態的這個優先順序更高的任務得以執行,否則,原來被中斷了的任務將繼續執行。

任務的狀態之間的關係轉換大概如上所述,有總結描述錯的地方也希望可以指出。新手一枚,還有很長的路要走。

相關推薦

UC/OS-II 任務狀態

uc/os是一個搶佔式多工的實時作業系統,每個任務都有各自的狀態,並且狀態之間都有一定的轉換關係。寫下此文以作記錄及幫助自己理清關係。 在uc/os-ii中,任務的狀態有5種:睡眠態、就緒態、執行態、等待態及中斷服務態。通過下圖可以有一個大致的認知: 最

uc/os-ii任務排程的鎖定與解鎖

排程器上鎖函式OSSchedlock()的功能是用於禁止任務排程,使任務保持對CPU的控制權。排程器開鎖函式OSSchedUnlock()的功能是解除對任務排程的禁止。 排程器上鎖和開鎖的實現原理是:對全域性變數鎖定巢狀計數器OSLockNesting進行操作

uC/OS-II任務排程中判斷最高優先順序

一、任務優先順序的表示    uC/OS-II中,規定最多可以有64個任務。每個任務的優先順序不能相同,因此,優先順序為0~63.數字越小,優先順序越高,那麼0就是最高優先順序,63就是最低優先順序。系統保留了優先順序最高及最低的各4個,因此使用者不能使用這8個優先順序作為自己的任務的優先順序。巨集OS_L

uC/OS-II任務排程之就緒表及最高優先順序任務判定演算法

uC/OS-II是Jean J. Labrosse設計的完整的、可移植、可固化、可裁剪的搶佔式實時多工核心,絕大部分程式碼都是用標準的C語言編寫的,開源、規模不大,比較適合初次接觸嵌入式作業系統的人員

uc/os-ii任務排程(二)

任務排程關鍵是任務執行環境的切換。任務執行環境包括以下: 1. 程式的斷點地址(PC) 2. 程式狀態字暫存器(xPSR) 3. 通用暫存器內容 4. 任務堆疊指標(SP) 其中1、2、3儲存在任務堆疊中,4儲存在任務的任務控制塊中。 程式切換的關鍵

uC/OS-II任務機制理解

        半年前接觸的uC/OS,看了兩個月之後又因為其他的事把他放下了。現在因為專案需要又把它重拾起來。         uC/OS----Micro Controller OS微控制器作業系

uC/OS-II任務同步與通訊

在多工合作過程中的,作業系統應解決兩個問題:一是各任務之間應具有一種互斥關係,即對於某個共享資源的共享,如果一個任務正在使用,則其他任務只能等待,等到該任務釋放該資源以後,等待的任務之一才能使用它;二是相關的任務在執行上要有先後次序,一個任務要等其夥伴發來通知或建立了某個條件

uc/os-ii刪除任務

uC/OS-II中與刪除任務相關的函式有兩個,刪除任務函式OSTaskDel() 和請求刪除任務函式OSTaskDelReq() 。 刪除任務函式原始碼如下,主要工作: 判斷引數的有效性 把要刪除的任務從任務就緒表中刪除 使被刪除的任務不等待延時期滿 ,

嵌入式實時作業系統uc-os-ii原理及應用 第三章 uc/os-ii中的任務

3.1-3.4.3  印象比較深的點在作業系統中程式叫做程序或執行緒。系統任務:空閒任務和統計任務。不同處理器,堆疊的增長方向不同。實時作業系統,時間操作必須為常量,所以不能用for,配合break或continue。不然每個任務執行時間不同。

uC/OS-II訊息佇列及操作

使用訊息佇列可在任務之間傳遞多條訊息,訊息佇列由三部分組成:事件控制塊、訊息佇列和訊息。 事件控制元件塊成員OSEventPtr指向一個叫做佇列控制塊(OS_Q)的結構,該結構管理著一個數組MsgTb1[],該陣列中的元素都是指向訊息的指標。一. 訊息佇列的操作 1. 建立

uc/os-ii訊息佇列

使用訊息佇列可以在任務之間傳遞多條訊息。訊息佇列由三個部分組成:事件控制塊、訊息佇列和訊息。 訊息佇列的資料結構如下圖所示。從圖中可以看到,訊息佇列相當於一個共用一個任務等待列表的訊息郵箱陣列,事件控制塊成員OSEventPtr指向了一個叫做佇列控制塊(OS_

uC/OS-II 學習筆記之:訊息佇列

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

嵌入式實時作業系統uc/os-ii 原理及應用 讀書筆記

對任務就緒表的操作理解: 將優先級別為prio的任務置為就緒狀態,可使用如下程式碼 OSRdyGrp |= OSMapTbl[prio >>3];//將prio任務所在的組狀態置為1,表示該組有任務就緒。 OSRdyTbl[prio>>3] |= O

uC/OS-II核心架構解析---uC/OS-II通訊與同步

1. 訊息郵箱Mbox       Mbox用於多工間單一訊息的傳遞,uC/OS-II使用ECB管理Mbox的基本資訊,OSEventPtr指向建立Mbox時指定的記憶體空間。事件的建立由具體的事件管理程式實現。主要包含在C原始檔OS_MBOX.C中。 OS_EVENT

UC/OS-II功能介紹、要點記錄

可見總用時位各過程的總和,我們可以想象得出這樣的做法是很浪費時間的,我們任何人都不會這麼去做,採用UC/OS-II多工管理思想則可以將此事務按照另一種方式完成,如圖Pic1.2中的多執行緒方式,由圖比較可以看出,整個事務在t5時刻完成,當菜炒好時飯也做好不久,這樣的方法使總用時減少了,分析原因,可以知道是我們

最詳細的uC/OS-II 移植到STM32

這個圖表達了什麼資訊呢,其實就是告訴移植者需要將那些檔案移植到你的工程當中,首先是uC/OS-ii的原始檔,就是OS_CORE.C、OS_FLAG.C.....ucos_ii.H這些檔案,其實是uC/OS-ii的Port檔案,包括4個,分別是OS_CPU_C.C,OS_CPU_A.ASM,OS_CPU.H,O

UC/OS II 訊息佇列

訊息郵箱只能儲存一條訊息,訊息佇列沒有這一侷限,可以容納多條資訊佇列,按照先進先出(FIFO)的原則傳送和接受訊息。 訊息佇列的實體不是作業系統提供的,而是由使用者任務提供的。作業系統提供的是對其進行管理的程式。 1:訊息佇列的資料結構 訊息佇列的資料結構主要包括訊息佇列、

推薦幾本學uc/os-II的書

1.(比較難買)嵌入式實時作業系統uc/os-II教程   西安電子科技大學出版 -----這本書對UCOS的原始碼分析的非常清楚 比作者原著 在某種程度上要好,這本書對關鍵的程式碼都給出了流程圖! 2.(比較好買)嵌入式實時作業系統uc/os-II原理與應用(第二

UC/OS II事件管理(1)

ucosii支援事件,事件包括訊號量、訊息等機制。需要配置OS_EVENT_EN、OS_MAX_EVENTS等相關的巨集。 事件控制塊(ECB) 事件控制塊(ECB)是事件管理的核心資料結構。其定義如下: typedef struct os_event {     INT8

uC/OS II 函式說明 之–OS_TCBInit()

TCB初始化函式,被OSTaskCreate()與OSTaskCreateExt()呼叫,需要注意的是,這個函式是對內的,即此函式可以被uC/OS II呼叫,使用者應用程式不可以直接呼叫此函式。OSTcbInit()函式的引數是與OSTaskCreateExt()的引數對應的