#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->ostcbprio) else
ptcb = ostcbpriotbl[prio];
if (ptcb == (os_tcb *)0)
if (ptcb == os_tcb_reserved)
y = ptcb->ostcby;
osrdytbl[y] &= (os_prio)~ptcb->ostcbbitx; /* make task not ready */
if (osrdytbl[y] == 0u)
ptcb->ostcbstat |= os_stat_suspend; /* status of task is 'suspended' */
os_exit_critical();
if (self == os_true)
return (os_err_none);
}
掛起函式原型.判斷掛起的是否是自己.如果是,就刪除就緒, 狀態做掛起記錄ptcb->ostcbstat |= os_stat_suspend; 並任務排程.如果掛起的是別的任務 不排程.
延時函式原型如下
void ostimetick (void)
if(step==os_false) /* return if waiting for step command */
#endif
ptcb = ostcblist; /* point at first tcb in tcb list */
while(ptcb->ostcbprio!=os_task_idle_prio) /* go through all tcbs in tcb list */
else
if((ptcb->ostcbstat&os_stat_suspend)==os_stat_rdy) /*is task suspended? */}}
ptcb = ptcb->ostcbnext; /* point at next tcb in tcb list */
os_exit_critical();}}
}
其中
if((ptcb->ostcbstat&os_stat_pend_any)!=os_stat_rdy)
else
if((ptcb->ostcbstat&os_stat_suspend)==os_stat_rdy) /*is task suspended? */
可見掛起狀態下延時函式繼續-1. 並根據延時是否到0,掛起是否恢復.判斷是否把掛起任務 新增入就緒表. 當掛起恢復延時結束時才加入.
同樣在ostaskresume() 恢復裡面也有判斷是否延時等待. 兩者都滿足 才新增到就緒表中.
ucos任務掛起
建立好了任務之後,就已經初步跨進了ucosii的程式設計了,隨著進一步的程式設計,發現學會建立了任務還是不夠的,建立任務1用於串列埠1傳送資料,任務2用於串列埠1接收資料,程式本身的意圖是傳送完資料後,接著就串列埠1接收反饋回來的資訊,但是不能正常通訊,原因就是當任務1在傳送資料過程 cpu時不是會...
ucos 任務的掛起與恢復
看看任務掛起的函式 if os task suspend en 0 int8u ostasksuspend int8u prio if prio os lowest prio endif os enter critical if prio os prio self else if prio ostc...
ucos 任務延時函式
在ucos裡,系統也提供了這樣的延時函式,乙個是大眾版本ostimedly 乙個是精緻版本的ostimedlyhmsm 隨你怎麼選擇 這兩者的區別就是,ostimedly的延時時間是以節拍數來衡量的額,ostimedlyhmsm的延遲時間則使以具體時間大小來很亮的。這兩個函式有著非常重要的作用,就是...