1. 程式人生 > >ucos_III時鐘節拍輪的理解

ucos_III時鐘節拍輪的理解

OS_TickTask()是ucos必須建立的其中一個系統任務

由硬體定時器引發的定時器中斷會呼叫一個時鐘節拍ISR(中斷服務程式)

OS_Tick_Task因為要等待ISR傳送的訊號所以是週期執行的

在ISR中,會呼叫一個OS_TimeTick()函式,該函式完成了ucos中大部分時鐘節拍的處理工作

由OS_TimeTick函式來向OS_Tick_Task傳送訊號

OS_TickTask會遍歷所有等待延時結束或等待超時的任務,OS_Tick_Task會使那些延時結束和進入超時的任務進入就緒態

實現這個遍歷的資料結構是通過一個OSCFG_TICK_WHEEL[]和一個計數器OSTickCtr

1.時鐘節拍輪是一個類似於環形佇列一樣的環狀結構
2.OS_CFG_TICK_WHEEL_SIZE指明瞭這個表的大小
3.每當OS_TickTask受到ISR的訊號時,計數器OSTickCtr++
4.每個OSCFG_TICKWHEEL的表項是[ 等待任務最大數 , 等待任務數 , 指向一個等待任務序列頭的指標(OS_TCB*)FirstPtr ]
5.每個等待任務按照如下規則加入等待序列中:
MatchValue = OSTickCtr + dly(任務的延時時間)
Index(任務插入的位置) = MachValue%OS_CFG_WHEEL_SIZE(取模計算)
6.插入後更新相應的表項(最大等待任務數,等待任務數…….)
7.每個表項的任務佇列中任務按照升序排列(即延時最少的任務排在第一個)
8.每當OS_TickTask接收到一個訊號時,會根據OSTickCtr查詢其對應的表項,有任務時則檢查第一個是否相等,相等則把相應TCB從佇列中刪除,不相等時,立刻終止搜尋若任務只在等待延時,還會把任務放到任務就緒表中。
9.更新時鐘節拍列表的操作一般在臨界區程式碼中執行,但是由於這個操作很快,所以可以把臨界區控制到很短

注意:在任務TCB中有TickSpokePtr指向表項中的FirstPtr
比較時是比較OSTickCtr與TCB中的TickCtrMatch

關於OSTimeDly()

除了延時的宣告,OSTimeDly還會做一些其它的事情–把任務從任務就緒表中刪除,之後還會呼叫任務排程器進行下一輪的任務排程