新聞中心

移植μC/OS-Ⅱ

作者: 時(shí)間:2016-10-08 來源:網(wǎng)絡(luò) 收藏

只用當(dāng)OS_CFG.H中的OS_CPU_HOOKS_EN被置為1時(shí)才會(huì)產(chǎn)生 OSTaskSwHook()的代碼。

本文引用地址:http://2s4d.com/article/201610/305739.htm

8.05.05OSTaskStatHook()

OSTaskStatHook()每秒鐘都會(huì)被OSTaskStat()調(diào)用一次。用戶可以用OSTaskStatHook()來擴(kuò)展統(tǒng)計(jì)功能。例如,用戶可以保持并顯示每個(gè)任務(wù)的執(zhí)行時(shí)間,每個(gè)任務(wù)所用的CPU份額,以及每個(gè)任務(wù)執(zhí)行的頻率等等。OSTaskStatHook()沒有任何參數(shù),也不返回任何值。

只用當(dāng)OS_CFG.H中的OS_CPU_HOOKS_EN被置為1時(shí)才會(huì)產(chǎn)生OSTaskStatHook()的代碼。

8.05.06OSTimeTickHook()

OSTaskTimeHook()在每個(gè)時(shí)鐘節(jié)拍都會(huì)被OSTaskTick()調(diào)用。實(shí)際上,OSTaskTimeHook()是在節(jié)拍被μC/OS-Ⅱ真正處理,并通知用戶的移植實(shí)例或應(yīng)用程序之前被調(diào)用的。OSTaskTimeHook()沒有任何參數(shù),也不返回任何值。

只用當(dāng)OS_CFG.H中的OS_CPU_HOOKS_EN被置為1時(shí)才會(huì)產(chǎn)生OSTaskTimeHook()的代碼。

無論何時(shí)建立任務(wù),在分配好和初始化TCB后就會(huì)調(diào)用該函數(shù),當(dāng)然任務(wù)的堆棧結(jié)構(gòu)也已經(jīng)初始化好了。OSTaskCreateHook()允許用戶用自己的方式來擴(kuò)展任務(wù)建立函數(shù)的功能。例如用戶可以初始化和存儲(chǔ)與任務(wù)相關(guān)的浮點(diǎn)寄存器,MMU寄存器以及其它寄存器的內(nèi)容。通常,用戶可以存儲(chǔ)用戶的應(yīng)用程序所分配的附加的內(nèi)存信息。用戶還可以通過使用OSTaskCreateHook()來觸發(fā)示波器或邏輯分析儀,以及設(shè)置斷點(diǎn)。

參數(shù)

ptcb是指向所創(chuàng)建任務(wù)的任務(wù)控制塊的指針。

返回值

注意事項(xiàng)

該函數(shù)在被調(diào)用的時(shí)候中斷是禁止的。 因此用戶應(yīng)盡量減少該函數(shù)中的代碼以縮短中斷

的響應(yīng)時(shí)間。

范例

該例子假定了用戶是用OSTaskCreateExt()建立任務(wù)的,因?yàn)樗M谌蝿?wù)OS_TCB中

有.OSTCBExtPtr域,該域包含了指向浮點(diǎn)寄存器的指針。

VoidOSTaskCreateHook(OS_TCB*ptcb)

{

if(ptcb->OSTCBExtPtr!=(void*)0){

/* 儲(chǔ)存浮點(diǎn)寄存器的內(nèi)容到..*/

/*..TCB擴(kuò)展域中 */

}

}

當(dāng)用戶通過調(diào)用OSTaskDel()來刪除任務(wù)時(shí)都會(huì)調(diào)用該函數(shù)。這樣用戶就可以處理OSTaskCreateHook()所分配的內(nèi)存。 OSTaskDelHook()就在TCB從TCB鏈中被移除前被調(diào)用。

用戶還可以通過使用OSTaskDelHook()來觸發(fā)示波器或邏輯分析儀,以及設(shè)置斷點(diǎn)。

參數(shù)

ptcb是指向所創(chuàng)建任務(wù)的任務(wù)控制塊的指針。

返回值

注意事項(xiàng)

該函數(shù)在被調(diào)用的時(shí)候中斷是禁止的。 因此用戶應(yīng)盡量減少該函數(shù)中的代碼以縮短中斷

的響應(yīng)時(shí)間。

范例

voidOSTaskDelHook(OS_TCB*ptcb)

{

/* 輸出信號(hào)觸發(fā)示波器 */

}

當(dāng)執(zhí)行任務(wù)切換時(shí)都會(huì)調(diào)用該函數(shù)。全局變量OSTCBHighRdy指向得到CPU的任務(wù)的TCB,而OSTCBCur指向被切換出去的任務(wù)的TCB。OSTaskSwHook()在保存好了任務(wù)的寄存器和保存好了指向當(dāng)前任務(wù)TCB的堆棧指針后馬上被調(diào)用。 用戶可以用該函數(shù)來保存或恢復(fù)浮點(diǎn)寄存器或MMU寄存器的內(nèi)容,來得到任務(wù)執(zhí)行時(shí)間的軌跡以及任務(wù)被切換進(jìn)來的次數(shù)等等。

參數(shù)

返回值

注意事項(xiàng)

該函數(shù)在被調(diào)用的時(shí)候中斷是禁止的。 因此用戶應(yīng)盡量減少該函數(shù)中的代碼以縮短中斷的響應(yīng)時(shí)間。

范例

voidOSTaskSwHook(void)

{

/* 將浮點(diǎn)寄存器的內(nèi)容儲(chǔ)存在當(dāng)前任務(wù)的TCB擴(kuò)展域中。 */

/* 用新任務(wù)的TCB擴(kuò)展域中的值更新浮點(diǎn)寄存器的內(nèi)容。 */

}

該函數(shù)每秒鐘都會(huì)被μC/OS-Ⅱ的統(tǒng)計(jì)任務(wù)調(diào)用。OSTaskStatHook()允許用戶加入自己的統(tǒng)計(jì)功能。

參數(shù)

返回值

注意事項(xiàng)

統(tǒng)計(jì)任務(wù)大概在調(diào)用OSStart()后再過5秒開始執(zhí)行。注意,當(dāng)OS_TASK_STAT_EN或者

OS_TASK_CREATE_EXT_EN被置為0時(shí),該函數(shù)不會(huì)被調(diào)用。

范例

voidOSTaskStatHook(void)

{

/* 計(jì)算所有任務(wù)執(zhí)行的總時(shí)間 */

/* 計(jì)算每個(gè)任務(wù)的執(zhí)行時(shí)間在總時(shí)間內(nèi)所占的百分比 */

}

只要發(fā)生時(shí)鐘節(jié)拍,該函數(shù)就會(huì)被OSTimeTick()調(diào)用。一旦進(jìn)入OSTimeTick()就會(huì)馬上調(diào)用OSTimeTickHook()以允許執(zhí)行用戶的應(yīng)用程序中的與時(shí)間密切相關(guān)的代碼。用戶還可以通過使用該函數(shù)觸發(fā)示波器或邏輯分析儀來調(diào)試,或者為仿真器設(shè)置斷點(diǎn)。

參數(shù)

返回值

注意事項(xiàng)

OSTimeTick()通常是被ISR調(diào)用的, 所以時(shí)鐘節(jié)拍ISR的執(zhí)行時(shí)間會(huì)因?yàn)橛脩粼谠摵瘮?shù)

中提供的代碼而增加。當(dāng)OSTimeTick()被調(diào)用的時(shí)候,中斷可以是禁止的也可以是允許的,

這主要取決于該處理器上的移植是怎樣進(jìn)行的。如果中斷是禁止的,該函數(shù)將會(huì)影響到中斷

響應(yīng)時(shí)間。

范例

voidOSTimeTickHook(void)

{

/* 觸發(fā)示波器 */

}


上一頁(yè) 1 2 3 4 5 6 下一頁(yè)

關(guān)鍵詞:

評(píng)論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉