在ucos裡,系統也提供了這樣的延時函式,乙個是大眾版本ostimedly(),乙個是精緻版本的ostimedlyhmsm(),隨你怎麼選擇
這兩者的區別就是,ostimedly的延時時間是以節拍數來衡量的額,ostimedlyhmsm的延遲時間則使以具體時間大小來很亮的。
這兩個函式有著非常重要的作用,就是當你呼叫這兩個函式的時候,ucos會進行一次任務排程,所以cpu能在各任務間進行切換,很有大功勞得以這兩個函式
呼叫這兩個函式都會掛起本任務,cpu就會執行就緒表優先順序最高的任務。
有一點要注意的是任務呼叫ostimedly()後,一旦規定的時間期滿或者有其它的任務通過ostimedlyresume()取消了延遲,它就會馬上進入就緒態,
而不是執行狀態,也就是說延時結束後本任務一定不會被立刻執行
void ostimedly(int16u ticks)
if(ticks>0)
os_enter_critical(); (1)
if((osrdytbl[ostcbcur->ostcby]&=~ostcbcur->ostcbbitx)==0) (2)
osrdygrp&=~ostcbcur->ostcbbity;
ostcbcur->ostcbdly=ticks;
os_exit_critical();
ossched();
其實程式就做不下面幾件事
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)
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*3600*os_ticks_per_sec+minutes*60*os_ticks_per_sec+seconds*os_ticks_per_sec
+os_ticks_per_sec*milli+500/os_ticks_per_sec/1000
loops=ticks/65536 ;ticks=ticks%65536
ostimedly(ticks)
while(loops>0)
ostimedly(32768);
ostimedly(32768);
loops-;
else
return(os_time_zero_dly);
UCOS掛起與延時
if os task suspend en 0u int8u ostasksuspend int8u prio if prio os lowest prio endif os enter critical if prio os prio self else if prio ostcbcur ostc...
Ucos II 任務延時函式
ucos ii 任務延時函式 編寫過微控制器程式的都知道,延時函式是經常被用到的。在ucos ii 裡,系統也提供了這樣的延時函式。乙個是大眾版的ostimedly 乙個是精緻版的ostimedlyhmsm 蘿蔔青菜,各有所愛,隨你怎麼選。這兩者的區別是,ostimedly 的延時時間是以節拍數來衡...
ucos任務排程
1 ostimedly產生延時,假設當前任務a呼叫ostimedly函式,則ostimedly函式就將任務a從任務就緒表中去掉,並將延時時間賦值給任務a的任務控制塊中的ostcbdly,然後呼叫os sched。2 os sched函式,它利用任務就緒表,將就緒任務中的優先順序最高的任務查出,賦值給...