void OSStatInit (void)

 

 #if OS_TASK_STAT_EN > 0
void  OSStatInit (void)
{
#if OS_CRITICAL_METHOD == 3                      /* Allocate storage for CPU status register           */
    OS_CPU_SR  cpu_sr;
#endif   
   
   
    OSTimeDly(2);                                /* Synchronize with clock tick                        */
    OS_ENTER_CRITICAL();
    OSIdleCtr    = 0L;                           /* Clear idle counter                                 */
    OS_EXIT_CRITICAL();
    OSTimeDly(OS_TICKS_PER_SEC / 10);            /* Determine MAX. idle counter value for 1/10 second  */
    OS_ENTER_CRITICAL();
    OSIdleCtrMax = OSIdleCtr;                    /* Store maximum idle counter count in 1/10 second    */
    OSStatRdy    = TRUE;
    OS_EXIT_CRITICAL();
}
#endif

;在OSStatInit一開始延遲時間爲2時鐘節拍裏:第一在就緒表中刪除掉當前任務的就緒標誌,這個當前任務也就是調用OSStatInt( )的用戶編寫的TaskStart()任務,這是用戶創建的優先級最高的任務;第二令OSTCBDly = ticks也就是這個任務要延遲ticks所代表的時間;第三,調用 OS_Sched( ),進行一次任務調度,在任務調度裏找出優先級最高的任務,並進行任務切換,切換到現在的具有最高優先級的任務,使其運行。此時在任務調度的時候,TaskStart()任務又重新處於就緒狀態,此時程序從OSTimeDly(2)中返回,接着執行下面下面的程序。執行完OSIdleCtr    = 0L;   後,又進入一個延時程序OSTimeDly(OS_TICKS_PER_SEC / 10);  ,本程序是又延遲了100毫秒,在這100毫秒中,TaskStart()任務處於等待狀態,因此在這100毫秒中執行的是Idle任務。Idle任務會不斷給OSIdelCtr計數,從而100毫秒後OSIdelCtr記錄的就是100毫秒內被增加的最大次數(在這一秒中沒有其它任務高於Idle任務,所以結果是最大的)。100毫秒延遲結束後。TaskStart()任務重新就緒,獲得cpu使用權,就執行OSIdleCtrMax = OSIdleCtr;    OSStatRdy    = TRUE;此後程序結束。

;OSStatInit一開始延遲時間爲2時鐘節拍,用於保持與系統時鐘的同步,因爲延遲之後調用的第一個語句爲“OSIdelCtr=0”,基本不用花費系統時間,然後就進入第二個語句OSTimeDly(OS_TICKS_PER_SEC);   相當於再次延遲1s;在這延遲的一秒中,Idle任務會不斷給OSIdelCtr計數,從而1s後OSIdelCtr記錄的就是1s內被增加的最大次數(在這一秒中沒有其它任務高於Idle任務,所以結果是最大的)。

在建立其他任務之前,必須調用OSStatInit()來確定用戶的PC有多快。在一開始,OSStatInit()就將自身延時了兩個時鐘節拍,這樣它就可以與時鐘節拍中斷同步。因此,OSStatInit()必須在時鐘節拍啓動之後調用;否則,用戶的應用程序就會崩潰。當µC/OS-II調用OSStatInit()時,一個32位的計數器OSIdleCtr被清爲0 ,併產生另一個延時,這個延時使OSStatInit()掛起。此時,uCOS-II沒有別的任務可以執行,它只能執行空閒任務(µC/OS-II的內部任務)。空閒任務是一個無線的循環,它不斷的遞增OSIdleCtr。1秒以後,uCOS-II重新開始OSStatInit(),並且將OSIdleCtr保存在OSIdleMax中。所以OSIdleMax是OSIdleCtr所能達到的最大值。而當用戶再增加其他應用代碼時,空閒任務就不會佔用那樣多的CPU時間。OSIdleCtr不可能達到那樣多的記數,如果用戶程序每秒撫慰一次OSIdleCtr()。CPU利用率的計算由µC/OS-II 中的OSStatTask()函數來完成,這個任務每秒執行一次。而當OSStatRdy置爲TRUE表示µC/OS-II將統計CPU的利用率。

OSStatInit()將返回到TaskStart()。所有任務可以都由TaskStart()中建立,由於TaskStart()的優先級爲0(最高),新任務建立後不進行任務調度。當所有任務都建立完成後,TaskStart()將進入無限循環之中。

做嵌入式應用時,用戶必須在第一個任務中打開時鐘節拍中斷。

void ARMStartTimer(void)
{
 //autoreload and start  m
 rTCON = 0x9;  
}
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章