t-kernel中tk_dly_tsk的原理初探【轉(zhuǎn)】嵌入式類 2009-09-09 15:28:33 閱讀3 評(píng)論0 字號(hào):大中小 今天遇到的一個(gè)問題,就是在使用tk_dly_tsk(2000)是,t-kernel的休眠時(shí)間并不是精確的2秒,而是可能有低于10毫秒的誤差(大多數(shù)情況,有時(shí)候可能更高)。為了查找原因,翻閱了一下t-kernel的代碼(贊一下開源的好處),發(fā)現(xiàn)如下代碼: LOCAL void knl_enqueue_tmeb( TMEB *event ) for ( q = knl_timer_queue.next; q != &knl_timer_queue; q = q->next ) { 簡(jiǎn)單解釋一下,不一定百分百正確。t-kernel對(duì)于任務(wù)的等待是基于隊(duì)列的,但是等待結(jié)束的時(shí)間,是任務(wù)進(jìn)入這個(gè)等待隊(duì)列是就已經(jīng)計(jì)算好了的(有點(diǎn)類似于時(shí)間戳)。上面這一段代碼,實(shí)際上是在對(duì)于任務(wù)等待隊(duì)列進(jìn)行輪詢,直到發(fā)現(xiàn)第一個(gè)等待時(shí)間已經(jīng)過了的任務(wù)為止。 然后“ QueInsert(&event->queue, q);”,發(fā)現(xiàn)的這個(gè)任務(wù)加入到釋放隊(duì)列中,若沒有其他任務(wù)在釋放隊(duì)列中,則釋放當(dāng)前任務(wù)的等待狀態(tài)。 呵呵,寫的有點(diǎn)抽象,主要是給自己看的,要是哪位朋友碰巧遇到相似的問題,可以回帖,我們?cè)僭敿?xì)討論。 |
|