UCOS掛起與延時

2021-08-21 12:42:28 字數 1684 閱讀 9005

#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的延遲時間則使以具體時間大小來很亮的。這兩個函式有著非常重要的作用,就是...