ucos任務掛起

2021-07-25 22:31:24 字數 1701 閱讀 3449

建立好了任務之後,就已經初步跨進了ucosii的程式設計了,隨著進一步的程式設計,發現學會建立了任務還是不夠的,建立任務1用於串列埠1傳送資料,

任務2用於串列埠1接收資料,程式本身的意圖是傳送完資料後,接著就串列埠1接收反饋回來的資訊,但是不能正常通訊,原因就是當任務1在傳送資料過程

cpu時不是會跑到任務2去接收資料,這樣就會接收自己的傳送的資料,在任務1執行的時候,任務2不執行,當任務1執行完,任務2才執行,相同地,

當任務2執行完,任務1才執行,檔案是肯定的,ucos提供了任務掛起恢復兩種操作。

掛起任務需要使用ostasksuspend函式,任務可以掛起自己或者其他的任務,ostasksuspend只需要乙個引數,就是需要掛起的任務的優先順序

int8u ostasksuspend(int8u prio)

else if(prio==ostcbcur->ostcbprio)          (4)

else

if((ptcb==ostcbpriotbl[prio])==(os_tcb*)0)         (5)

else

ptcb->ostcbstat|=os_stat_suspend;   (7)

os_exit_critcial();

if(self==true)            (8)

return (os_no_err); }

}首先理解掛起的實現過程。

1.首先,ostasksuspend要確保使用者的應用程式不是在掛起空閒任務(1).接著使用者指定優先順序是有效的(2),記住最大的有效的優先順序是

os_lowest_prio,注意,使用者可以掛起統計任務,可能使用者已經注意到了,

2.接著,ostasksuspend()檢驗使用者是否通過指定os_rpio_sefl來掛起本函式的任務本身(3),使用者也可以通過指定優先順序來掛起呼叫本函式的任務

(4),在這兩種情況下,任務排程程式需要被呼叫,這就是筆者為什麼要定義區域性變數self的原因,該變數在適當情況下會被測試。如果使用者沒有

掛起呼叫本函式的任務,ostasksuspend就沒有必要執行任務排程了,因為掛起的是較低優先順序的任務.

3.然後,ostasksuspend()掛起的任務是否存在(5).如果該任務存在的話,它就會從就緒表中移除,在我理解,這是任務掛起函式最關鍵的地方,所謂任務掛起,

簡單點來說,就是把任務從就緒表中刪除,因為cpu下一次執行的任務是就緒表中優先順序最高的任務,當任務不在就緒表中,也不有可能這個任務還會被執行。下面理解

下它的實現過程,每個任務的就緒表標誌都存放在就緒標誌中,就緒標誌有兩個變數osrdygrp和osrdytbl,在osrdygrp中,任務按優先順序分組,8個任務為一組,osrdygrp中的每乙個表示8組任務中每一組是否進入就緒態的任務,任務進入就緒態時,就緒表osrdytbl中的相應元素的相應位也職位,比如說我要把優先順序為5的任務從就緒表刪除,我需要的操作時把osrdytbl[0]第五位清零,同時把osrdygrp第零為清零。

注意要被掛起的任務有可能沒有在就緒表中,因為他有可鞥等待時間的傳送或延時期滿,在這種情況下,要被掛起的任務在osrdytbl中對於的位儀表清除,再次清除該位,要比先檢查該位是否被清除了 在他沒被請查收清除它快得多,所以筆者沒有檢查該位而直接清除它,現在ostasksuspend就可以再該任務的os_tcb中設定os_stat_suspend標誌,以表明任務正在被掛起,最後ostasksuspend()只有在被掛起的任務是呼叫本函式的任務本身的情況下次啊呼叫任務排程程式(8)。

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...

C OS II 示例 ucos任務的掛起與刪除

1 設計乙個只有乙個任務mytask的應用程式。2 在 1 的任務mytask中再建立乙個任務yourtask。要求當任務yourtask執行20次後,掛起任務mytask 當任務yourtask執行40次後,恢復任務mytask。要求任務mytask和任務yourtask執行一段時間後,使任務my...

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...