這篇文章給大家介紹ucos內(nèi)核中的任務(wù)延時(shí)函數(shù)是什么,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。
創(chuàng)新互聯(lián)公司堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時(shí)代的肅州網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!
ysmz4:以下主要解決我為什么設(shè)置OSTimeDly(2),延時(shí)2ms的問題。
只要你延時(shí)超過1個(gè)系統(tǒng)時(shí)鐘節(jié)拍(1ms),UCOSII就會(huì)執(zhí)行任務(wù)切換,不需要計(jì)算每個(gè)任務(wù)延時(shí)多久,只要你保證延時(shí)大于一個(gè)系統(tǒng)時(shí)鐘節(jié)拍,就可以了.
編寫過單片機(jī)程序的都知道,延時(shí)函數(shù)是經(jīng)常被用到的。
在ucos II 里,系統(tǒng)也提供了這樣的延時(shí)函數(shù)。一個(gè)是大眾版的OSTimeDly(),一個(gè)是精致版的OSTimeDlyHMSM()。 蘿卜青菜,各有所愛,隨你怎么選。
這兩者的區(qū)別是,OSTimeDly()的延時(shí)時(shí)間是以節(jié)拍數(shù)來衡量的,OSTimeDlyHMSM()的延時(shí)時(shí)間則是以具體時(shí)間大小來衡量的。
這兩個(gè)函數(shù)有著非常重要重要的作用,就是當(dāng)你調(diào)用這兩個(gè)函數(shù)的時(shí)候,ucos II 會(huì)進(jìn)行一次任務(wù)調(diào)度。所以cpu能在各任務(wù)間進(jìn)行切換,很大功勞得益于這兩個(gè)函數(shù)。
調(diào)用這兩個(gè)延時(shí)函數(shù)都會(huì)掛起本任務(wù),cpu就會(huì)執(zhí)行就緒表中優(yōu)先級(jí)最高的任務(wù)。
有一點(diǎn)要注意的是任務(wù)調(diào)用OSTimeDly()后,一旦規(guī)定的時(shí)間期滿或者有其它的任務(wù)通過調(diào)用OSTimeDlyResume()取消了延時(shí),它就會(huì)馬上進(jìn)入就緒狀態(tài),而不是執(zhí)行狀態(tài),也就是說延時(shí)結(jié)束后本任務(wù)不一定會(huì)被立刻執(zhí)行。
假設(shè)你在任務(wù)執(zhí)行過程中,調(diào)用延時(shí)函數(shù)延時(shí)0.001秒,時(shí)間的延時(shí)時(shí)間是有可能大于這個(gè)值的。這就得看你任務(wù)的安排了。
下面看看這兩個(gè)函數(shù)的具體實(shí)現(xiàn)。
程序清單 L 5.1 OSTimeDly(). |
Void OSTimeDly (INT16U ticks) |
{ |
if (ticks > 0) { (1) |
OS_ENTER_CRITICAL(); |
if ((OSRdyTbl[OSTCBCur->OSTCBY] &= ~OSTCBCur->OSTCBBitX) == 0) { (2) |
OSRdyGrp &= ~OSTCBCur->OSTCBBitY; |
} |
OSTCBCur->OSTCBDly = ticks; (3) |
OS_EXIT_CRITICAL(); |
OSSched(); (4) |
} |
} |
其實(shí)程序就做了下面幾件事
1. 把本任務(wù)從任務(wù)就緒表中刪除
2. 把延時(shí)值保持到任務(wù)控制塊中,并且通過OSTimeTick()每隔一個(gè)時(shí)鐘節(jié)拍就減少一個(gè)延時(shí)節(jié)拍數(shù)
3. 調(diào)用任務(wù)調(diào)度函數(shù),切換任務(wù)。
INT8U OSTimeDlyHMSM (INT8U hours, INT8U minutes, INT8U seconds, INT16U milli) |
{ |
INT32U ticks; |
INT16U loops; |
|
|
if (hours > 0 || minutes > 0 || seconds > 0 || milli > 0) { (1) |
if (minutes > 59) { |
return (OS_TIME_INVALID_MINUTES); |
} |
if (seconds > 59) { |
return (OS_TIME_INVALID_SECONDS); |
} |
If (milli > 999) { |
return (OS_TIME_INVALID_MILLI); |
} |
ticks = (INT32U)hours * 3600L * OS_TICKS_PER_SEC (2) |
+ (INT32U)minutes * 60L * OS_TICKS_PER_SEC |
+ (INT32U)seconds * OS_TICKS_PER_SEC |
+ OS_TICKS_PER_SEC * ((INT32U)milli + 500L/OS_TICKS_PER_SEC) / 1000L; (3) |
loops = ticks / 65536L; (4) |
ticks = ticks % 65536L; (5) |
OSTimeDly(ticks); (6) |
while (loops > 0) { (7) |
OSTimeDly(32768); (8) |
OSTimeDly(32768); |
loops--; |
} |
return (OS_NO_ERR); |
} else { |
return (OS_TIME_ZERO_DLY); (9) |
} |
} |
關(guān)于ucos內(nèi)核中的任務(wù)延時(shí)函數(shù)是什么就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。