在ucosii中,系統時鍾如同一個人的心跳,它為整個系統提供一個運行基時,對任務調度至關重要。
ucosii的系統時鍾一般是由MCU內部定時器產生(可靠性高),也可以使用協處理器或者外部時鍾提供(可靠性低)。使用時鍾源有一個特別需要注意的地方:用戶必須在多任務系統啟動以后再開啟時鍾節拍器,也就是在調用OSStart()之后。
下面對使用MCU內部定時器方式產生系統時鍾方式做個解析。
在main()函數中,我們會建立一個AppTaskStart()任務,此任務中,我們會初始化硬件BSP_Init()。其中,最重要的一點就是初始化時鍾BSP_Tick_Init(),實際上就是分配一個MCU的定時器給ucosii使用。定時器必須打開中斷,因為定時器中斷服務程序中,我們必須要調用OS_CORE.c中的系統時鍾節拍函數OSTimeTick()。看到這里,我們終於找到系統時鍾和MCU的定時器之間的關系了。
既然系統時鍾是如此的重要,它的主要工作是做什么,又是怎樣服務於ucosii系統的呢?
翻看ucosii源碼,一切都呈現在眼前,部分截圖如下:
OSTimeTick()最重要的工作就是將調用延時的任務的OSTCBDly減1,然后看任務延時是否到達。但注意:OSTimeTick()並不會進行任務調度,只是將滿足條件的任務放入到就緒表中而已。