標題: uC/OS-II學習筆記—特殊任務 [打印本頁]

作者: xueren    時間: 2013-7-26 13:43
標題: uC/OS-II學習筆記—特殊任務
uC/OS-II的特殊任務包括空閑任務和統(tǒng)計任務,又稱操作系統(tǒng)的系統(tǒng)任務。雖然統(tǒng)計任務不是必需的,但是卻二十默認的系統(tǒng)任務。這兩個任務在操作系統(tǒng)初始化時被創(chuàng)建,在多任務啟動后被執(zhí)行。那么,這兩個任務都具有什么功能,又使用了哪些重要的數據結構呢?
空閑任務OS_TaskIdle是uC/OS-II的系統(tǒng)任務因為它占據了最低優(yōu)先級63,所以只有在其他的任務都因為等待事件的發(fā)生而被阻塞的時候才能得到運行。
空閑任務的代碼在os_core.c內核中,代碼如下所示:

由空閑任務的代碼可知,空閑任務除了不停地將空閑計數器OSIdleCtr的值加1之外,幾乎什么都不做。當沒有任何其他任務能夠運行的時候,操作系統(tǒng)就會執(zhí)行這段代碼。而OSTaskIdleHook默認情況下也只是一個空函數,如沒有特殊需要我們不需要去填寫它,該函數的另一個作用就是占據一點時間,給系統(tǒng)足夠的時間響應中斷。
統(tǒng)計任務OS_TaskStat是uC/OS-II的另一個重要的系統(tǒng)任務,我們可以通過宏設置取消統(tǒng)計任務,但一般情況下不這么做,因為統(tǒng)計任務執(zhí)行的統(tǒng)計工作時比較重要的。統(tǒng)計任務的主要功能是計算CPU的利用率。如果沒有統(tǒng)計任務,就不知道多任務環(huán)境下系統(tǒng)的運行情況是否良好。
CPU的利用率使用全局變量OSCPUUsage表示,這里涉及的幾個全局變量如下所示:

分析一下統(tǒng)計任務的代碼。首先是統(tǒng)計任務的初始化,該初始化任務的主要目的是獲得系統(tǒng)空閑計數的最大值,代碼如下所示:

該統(tǒng)計任務初始化函數在用戶任務中被調用,這個函數在移植過程中被App_TaskStart調用,App_TaskStart的優(yōu)先級設置為1。代碼如下所示:

這時系統(tǒng)沒有運行其他的任務。系統(tǒng)任務初始化函數首先將自己阻塞兩個時鐘周期,在系統(tǒng)時鐘中斷2次后,由調度器進行任務調度而恢復運行,目的是與時鐘同步。接著,統(tǒng)計任務初始化函數清空空閑計數器OSIdleCtr,訪問全局變量OSIdleCtr必須關中斷,訪問完后再開中斷。接下來調用OSTimeDly(OS_TICKS_PER_SEC/10u)又把自己阻塞100ms,100ms后才恢復運行。在這100ms之內,運行的任務只有空閑任務�?臻e任務會拼命將空閑計數器OSIdleCtr的值往上加,加到多大就要看CPU的速度。延時結束后,用OSIdleCtrMax接納OSIdleCtr的值,因此OSIdleCtrMax表示空閑狀態(tài)100ms內OSIdleCtr的計數值,稱為空閑計數最大值。那么,在系統(tǒng)運行了其他用戶任務的情況下,每100ms內OSIdleCtr的計數值肯定小于這個數值的。獲得了這個數值,統(tǒng)計任務就有了統(tǒng)計的基礎了,因此統(tǒng)計任務就準備好了,可以設置OSStatRdy的值為真。

統(tǒng)計任務優(yōu)先級僅僅比空閑任務高,空閑任務的優(yōu)先級是63,統(tǒng)計任務的優(yōu)先級是62,這個數值越小優(yōu)先級越高。因此,統(tǒng)計任務優(yōu)先于空閑任務運行。在操作系統(tǒng)初始化過程中,初始化OSStatRdy為假,并創(chuàng)建了統(tǒng)計任務和空閑任務。初始化后又創(chuàng)建了一個名為App_TaskStart的優(yōu)先級為1的任務。在多任務啟動后,如果沒有其他的任務就緒,那么首先要運行App_TaskStart,App_TaskStart中運行OSStatInit。在OSStatInit沒有結束前,由于OSStatRdy的值一直是假,所以

此處的循環(huán)不能結束,統(tǒng)計任務OS_TaskStat就把自己延時,等待,把CPU留給空閑任務用于做空閑計數。
OSStatInit結束時,100ms過后,OSStatRdy為真,統(tǒng)計任務OS_TaskStat經過200ms的延時時間后被喚醒,發(fā)現OSStatRdy為真就離開循環(huán),為方便以后的計算,將空閑計數的最大值OSIdleCrMax除以100,商仍放在OSIdleCtrMax中。如果這時OSIdleCtrMax的值是0,說明空閑計數的值太少了(不到100),系統(tǒng)狀況很差,統(tǒng)計任務干脆講自己掛起來不再進行統(tǒng)計。
如果一切正常,那么統(tǒng)計任務進入死循環(huán)進行統(tǒng)計工作。首先將100ms內空閑計數值OSIdleCtr存到OSIdleCtrRun中,然后將OSIdleCtr清0以初始化下一個100ms的計數,然后進行CPU利用率的計算,公式為:OSCPUUsage = 100uL - OSIdleCtrRun/OSIdleCtrMax 。
因為OSIdleCtrMax的值是在前面除過100的,因此還原為:
OSCPUUsage = 100*(1-OSIdleCtrRun/OSIdleCtrMax)
OSIdleCtrRun是100ms內空閑任務對OSIdleCtr的計數值,OSIdleCtrMax是系統(tǒng)空閑的時候最大的計數值。OSIdleCtrRun/OSIdleCtrMax就是系統(tǒng)的空閑度了,但系統(tǒng)完全空閑的時候這個值就是1,而當系統(tǒng)繁忙的時候空閑任務可能得不到運行,這個值就是0。OSCPUUsage反映了系統(tǒng)的繁忙程度,也就是CPU的利用率。
接下來再延遲100ms來讓空閑任務統(tǒng)計下一個100ms的計數值,循環(huán)繼續(xù)進行下一次的統(tǒng)計。





歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1