您好,登錄后才能下訂單哦!
這篇文章給大家介紹ucos內核中的任務延時函數是什么,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
ysmz4:以下主要解決我為什么設置OSTimeDly(2),延時2ms的問題。
只要你延時超過1個系統時鐘節拍(1ms),UCOSII就會執行任務切換,不需要計算每個任務延時多久,只要你保證延時大于一個系統時鐘節拍,就可以了.
編寫過單片機程序的都知道,延時函數是經常被用到的。
在ucos II 里,系統也提供了這樣的延時函數。一個是大眾版的OSTimeDly(),一個是精致版的OSTimeDlyHMSM()。 蘿卜青菜,各有所愛,隨你怎么選。
這兩者的區別是,OSTimeDly()的延時時間是以節拍數來衡量的,OSTimeDlyHMSM()的延時時間則是以具體時間大小來衡量的。
這兩個函數有著非常重要重要的作用,就是當你調用這兩個函數的時候,ucos II 會進行一次任務調度。所以cpu能在各任務間進行切換,很大功勞得益于這兩個函數。
調用這兩個延時函數都會掛起本任務,cpu就會執行就緒表中優先級最高的任務。
有一點要注意的是任務調用OSTimeDly()后,一旦規定的時間期滿或者有其它的任務通過調用OSTimeDlyResume()取消了延時,它就會馬上進入就緒狀態,而不是執行狀態,也就是說延時結束后本任務不一定會被立刻執行。
假設你在任務執行過程中,調用延時函數延時0.001秒,時間的延時時間是有可能大于這個值的。這就得看你任務的安排了。
下面看看這兩個函數的具體實現。
程序清單 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) |
} |
} |
其實程序就做了下面幾件事
1. 把本任務從任務就緒表中刪除
2. 把延時值保持到任務控制塊中,并且通過OSTimeTick()每隔一個時鐘節拍就減少一個延時節拍數
3. 調用任務調度函數,切換任務。
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) |
} |
} |
關于ucos內核中的任務延時函數是什么就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。