UCOSIII中的節拍列表更新

2021-09-28 19:22:06 字數 1567 閱讀 9158

我這裡直接通過**打注釋的方式來一步一步**這個函式的執行過程,最後會有乙個總結

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 位的...