1. 程式人生 > >ucos-ii核心概述

ucos-ii核心概述

               

.臨界段

處理器處理臨界程式碼都必須先關中斷,再處理臨界程式碼,然後再開中斷。關中斷時間對實時系統的實時響應很重要。所以是實時系統的一個很重要的指標。uCOS使用兩個巨集(在OS_CPU.h中定義。注:沒個CPU都有自己的OS_CPU.h)。這兩個巨集分別為OS_ENTER_CRITICAL()OS_EXIT_CRITICAL()關閉中斷和開啟中斷。

注意:在ODTimeDel()之類的函式呼叫的時候不能關閉中斷,不然應用程式會宕機。實現OS_ENTER_CRITICAL()以及OS_EXIT_CROTICAL()的方式有多種。

二:任務:

1.任務概述

    通常任務是一個無限迴圈。函式沒有返回值。任務完成以後可以自我刪除。(注意:刪除不是任務程式碼刪除了,只是這個任務不會再執行了;即使呼叫了OSTaskDel

()這個任務也不會有返回值)。

    uCOS II 可以管理的任務可以達到64個,但是建議不要使用前四個優先順序的任務和後四個優先順序的任務。

    任務的建立可以使用OSTaskCreat()和OSTaskCreatExt()建立。這兩個函式的說明請  點選這裡  檢視。

2.任務狀態

    對於每一個任務來說,任務狀態只有一下5個。(處於5箇中的某一個)

    a.睡眠態:駐留在ROM或者RAM中,系統還沒有管理,只有通過OSTaskCreat()或OSCreatExt()建立之後才能使得系統管理任務。

    b.就緒態:任務一旦建立就進入了就緒態,等待執行。

    c.執行態:當前任務正在執行。

    d.等待態:可以呼叫OSTimeDel()或者OSTimeDlyHMSM()使得任務進入等待狀態。一直等待函式中定義的延時時間到了,這兩個函式會強制執行任務轉換,讓下一個優先順序更高的任務進入就緒態的任務執行。

    e.中斷服務態:當前正在執行的任務被中斷,進入中斷服務態,響應中斷是改任務被掛起。中斷服務子程式佔有了CPU的使用權。

當所有的任務都在等待時間的發生。或者等待延時的結束。uCOS II執行被稱為空閒的內部任務(即OSTaskIde了())。

三:任務控制塊OS_TCB

一旦任務建立了,任務控制塊OS­­_TCB將被賦值,任務控制塊是一個數據結構,當任務的CPU使用權被剝奪時,μ

C/OS-Ⅱ用它來儲存該任務的狀態。當任務重新得到CPU使用權時,任務控制塊能確保任務從當時被中斷的那一點絲毫不差地繼續執行。OS­­_TCBs全部駐留在RAM中。讀者將會注意到筆者在組織這個資料結構時,考慮到了各成員的邏輯分組。任務建立的時候,OS­­_TCBs就被初始化了。

OSTCBStkPtr是指向當前任務棧頂的指標。OSTCBStkPtrOS_TCB資料結構中唯一的一個能用匯編語言來處置的變數(在任務切換段的程式碼Context-switching code之中,)把OSTCBStkPtr放在資料結構的最前面,使得從組合語言中處理這個變數時較為容易。

OSTCBExtPtr  指向使用者定義的任務控制塊擴充套件。使用者可以擴充套件任務控制塊而不必修改μC/OS-Ⅱ的原始碼

OSTCBStkBottom  是指向任務棧底的指標。函式OSTaskStkChk() (用於堆疊檢驗) 要用到變數OSTCBStkBottom,在執行中檢驗棧空間的使用情況。使用者可以用它來確定任務實際需要的棧空間。這個功能只有當用戶在任務建立時允許使用OSTaskCreateExt()函式時才能實現。這就要求使用者將OS_TASK_CREATE_EXT_EN設為1,以便允許該功能。

OSTCBStkSize 存有棧中可容納的指標元數目,而不是用位元組表示的棧容量總數。

更多引數說明,請參見《嵌入式實時作業系統 2》(邵貝貝譯)第82頁內容。

四:任務就緒表

    沒個就緒的任務都放在任務就緒表中。就緒表中有兩個變數,OSRdyGrpOSRdyTbl[],OSRdyGrp中任務按照優先順序分組,8個任務為一組。OSRdyGrp中的每位表示8組任務中每一組是否有進入就緒態的任務。任務就緒,OSRdyTbl[]中相應元素中的相應位也被置1.OSRdyTbl[]陣列有多大取決於OS_LOWSET_PRIO。當應用程式的數目比較少的時候可以降低OS_LOWSET_PRIO,可以降低系統對RAM(資料空間)的需求。

五:任務排程

    uCOS II 總是進入就緒態任務中優先順序最高的任務,確定任務的優先順序以及哪個任務應該執行,這些工作由任務排程器完成。任務的排程由函式:OSSched()完成。中斷級的呼叫由另一個函式:OSIntExt()完成。

六:任務級的任務切換

    任務排程器決定哪個任務該運行了,然後由IS_TASK_SW()函式做任務切換。被掛起的任務的contextCPU中的暫存器的值被儲存再堆疊中)。OS_TASK_SW()是一個巨集呼叫。含有處理器的軟中斷指令。

七:給排程器上鎖和解鎖

    給排程器上鎖,用OSSchedlock()函式實現,用於禁止任務排程,直到任務完成後呼叫OSSchedUnlock()函式為止。這兩個函式的使用要非常謹慎。因為它會影響系統對任務的正常管理。

八:空閒任務OSTaskIdle()

    在沒有其它任務進入就緒態時。這個任務將執行。這個任務的優先順序永遠都是最低的。空閒任務不能被應用軟體刪除。 

九:統計任務 OS_TaskStat 

    uCOS II中統計執行時間分任務,可以用作CPU使用率的計算。將OS_CFG.h中的OS_TASK_STAT_EN巨集定義為1即可使能該任務。用這個函式可以得到應用程式中CPU佔了多少時間。在呼叫OSStart()前的第一個任務中呼叫系統統計初始化函式OSSTatInit()。

十:uCOS II的中斷

    中斷服務函式要用匯編語言實現,但是如果使用的編譯器支援線上彙編的話,可以把組合語言直接放在C語言檔案中。中斷服務函式應該儘可能的短一點。

十一:時鐘節拍

    時鐘節拍可以是專門的定時器產生的,也可以是一個交流訊號源。時鐘節拍應該由應用程式的精度決定,時鐘節拍越高,系統的額外負荷就越重。必須在OSStart()之後呼叫時鐘節拍器。

十二:系統初始化和系統啟動

系統初始化OSInit

它首先是系統所用的全域性變數比如上鎖次數,中斷次數,任務次數,任務切換次數等等的初始化,然後是就緒列表、任務控制塊、事件控制塊等的建立,其次是空閒任務或和統計任務的建立

系統啟動OSStart

找出就緒列表中的優先順序最高的任務,並啟動任務排程,且永不返回

十三:獲得當前系統的版本號

    可以使用OS_Version()函式獲得當前使用的系統的版本號。該函式的返回值除100即是系統的版本號。