我這裡直接通過**打注釋的方式來一步一步**這個函式的執行過程,最後會有乙個總結
void os_ticklistupdate (
void
)else
break
;//如果是因為帶超時監測的阻塞而被延時
case os_task_state_pend_timeout:
p_tcb->tickremain = p_tcb->tickctrmatch /* compute time remaining of current tcb */
- ostickctr;
if(ostickctr == p_tcb->tickctrmatch)
else
break
;//如果任務延時而且被懸掛
case os_task_state_dly_suspended:
p_tcb->tickremain = p_tcb->tickctrmatch /* compute time remaining of current tcb */
- ostickctr;
if(ostickctr == p_tcb->tickctrmatch)
else
break
;//如果任務是因為帶超時監測的阻塞而延時,並且這個時候被懸掛起來了
case os_task_state_pend_timeout_suspended:
p_tcb->tickremain = p_tcb->tickctrmatch /* compute time remaining of current tcb */
- ostickctr;
if(ostickctr == p_tcb->tickctrmatch)
else
break
;default
:break;}
//更新p_tcb,準備檢查下乙個任務
p_tcb = p_tcb_next;
}else
}//配合開頭計算,執行上面這段**所用的時間
ts_end =
os_ts_get()
- ts_start;
/* measure execution time of tick task */
if(osticktasktimemax < ts_end)
os_critical_exit()
;}
整個**的執行流程是這樣的:每當乙個節拍到來,我們就根據某種方法計算出乙個位置,根據這個位置從oscfg_tickwheel取出乙個元素,這個元素其實代表著乙個雙向鍊錶,我們在這個節拍內逐個檢查這個雙向鍊錶上面的每乙個任務,到時間的就將它從ticklist中移出去。下面是oscfg_tickwheel的示意圖
關於UCOSIII的時鐘節拍定時精度
二 獲取當前時鐘節拍計數值的函式為ostimeget 函式原型為 os tick ostimeget os err p err 三 了解ucosiii的兩個重要延時函式 void ostimedly os tick dly,os opt opt,os err p err void ostimedly...
UCOSIII中的時基系統
吾日三省吾身 為人謀而不忠乎?與朋友交而不信乎?傳不習乎?ucosiii中有乙個模組可以向我們提供系統執行時的各種統計資訊,這極大地方便我們實現系統的白盒管理,但是我覺得只會把那幾個統計引數打出來看根本不叫白盒管理,我們應當清楚地知道每乙個引數值是怎麼被統計出來的。今天我就cpu執行速率這個統計引數...
UCOSIII中系統時鐘的移植
freertos的 寫得真的像是一坨坨的 我一點看的慾望都沒有。相比之下,ucosiii的 寫得就好看多了,我看著看著就看回了ucosiii,今天我重點看了移植部分與滴答定時器有關的內容,下面我就來表達一下我是如何理解這個部分內容的,本篇文章主要分為如下兩個部分 systick 是一 個 24 位的...