日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

os系统

發(fā)布時間:2024/6/21 综合教程 35 生活家
生活随笔 收集整理的這篇文章主要介紹了 os系统 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

任務(wù)延時函數(shù)OSTimeDly

功能:調(diào)用該函數(shù)的任務(wù)將自己延時一段時間并執(zhí)行一次任務(wù)調(diào)度,一旦規(guī)定的延時時間完成或有其它的任務(wù)通過調(diào)用OSTimeDlyResume()取消了延時,調(diào)用OSTimeDly()函數(shù)的任務(wù)馬上進(jìn)入就緒狀態(tài)(前提是先將任務(wù)調(diào)度后執(zhí)行的任務(wù)執(zhí)行到程序尾,且調(diào)用OSTimeDly的任務(wù)此時優(yōu)先級最高)。

3.2.3 任務(wù)延時函數(shù)OSTimeDly

任務(wù)延時函數(shù)OSTimeDly用于阻塞任務(wù)一定時間,這個時間以參數(shù)的形式給出。如果這個參數(shù)的值是N,那么在N個時間片(時鐘滴答)之后,任務(wù)才能回到就緒態(tài)獲得繼續(xù)運(yùn)行的機(jī)會。如果參數(shù)的值是0,就不會阻塞任務(wù)。任務(wù)延時函數(shù)OSTimeDly的代碼分析如程序3.4所示。

程序3.4 任務(wù)延時函數(shù)OSTimeDly代碼分析

voidOSTimeDly(INT32Uticks)
{
INT8Uy;
if(OSIntNesting>0u){/*中斷服務(wù)程序不能延時*/
return;
}
if(OSLockNesting>0u){/*如果調(diào)度器被上鎖不能延時,因?yàn)檠訒r后就要進(jìn)行調(diào)度*/
return;
}
if(ticks>0u){/*如果延時時間大于0才會進(jìn)行延時*/
OS_ENTER_CRITICAL();
/*在就緒表和就緒組中取消當(dāng)前任務(wù)的就緒標(biāo)志*/
y=OSTCBCur->OSTCBY;
OSRdyTbl[y]&=(OS_PRIO)~OSTCBCur->OSTCBBitX;
if(OSRdyTbl[y]==0u){
OSRdyGrp&=(OS_PRIO)~OSTCBCur->OSTCBBitY;
}
/*給任務(wù)塊的OSTCBDly項(xiàng)賦值延時時間*/
OSTCBCur->OSTCBDly=ticks;/*向任務(wù)控制塊TCB裝載延時時間*/
OS_EXIT_CRITICAL();
OS_Sched();/*進(jìn)行一次任務(wù)調(diào)度*/
}
}

本段代碼層次清晰且比較簡單。OSLockNesting是調(diào)度鎖,也就是說,如果OSLockNesting>0,那么不允許進(jìn)行任務(wù)調(diào)度。因?yàn)槿蝿?wù)延時的時候要中止當(dāng)前任務(wù)的執(zhí)行,所以要進(jìn)行調(diào)度,因此在調(diào)度鎖有效的情況下是不能執(zhí)行任務(wù)延時的。如果延時時間大于0,那么就要進(jìn)行一次任務(wù)調(diào)度,將當(dāng)前的任務(wù)的就緒標(biāo)志取消,也就是對就緒表和就緒組的相關(guān)操作。之后將延時時間給任務(wù)塊的OSTCBDly項(xiàng)以對延時進(jìn)行計(jì)數(shù)。操作系統(tǒng)在每個時鐘中斷都要對每個OSTCBDly大于0的任務(wù)塊的OSTCBDly進(jìn)行減1操作和進(jìn)行調(diào)度,那么當(dāng)任務(wù)的延遲時間到了的時候(OSTCBDly為0)就可以恢復(fù)到就緒態(tài)。

需要注意的是,如果將任務(wù)延時1個時間片,調(diào)用OSTimeDly(1),會不會產(chǎn)生正確的結(jié)果呢?回答是否定的。這是因?yàn)槿蝿?wù)在調(diào)用時間延時函數(shù)的時候可能已經(jīng)馬上就要發(fā)生時鐘中斷了,那么設(shè)置OSTCBDly的值為1,想延時10ms,然后系統(tǒng)切換到一個新的任務(wù)運(yùn)行。在可能極短的時間,如0.5ms的時間后就進(jìn)入時鐘中斷服務(wù)程序,立刻將OSTCBDly的值減到0了。調(diào)度器在調(diào)度的時候就會恢復(fù)這個才延時了0.5ms的任務(wù)執(zhí)行。可見,OSTimeDly的誤差最大應(yīng)該就是1個時間片的長度,OSTCBDly(1)不會剛好延時10ms,如果真的需要延時1個時間片,最好調(diào)用OSTCBDly(2)。

任務(wù)延時函數(shù)OSTimeDly的流程如圖3.3所示。

總結(jié)

以上是生活随笔為你收集整理的os系统的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。