久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

標題: uC/OS-II學習筆記—任務掛起和恢復 [打印本頁]

作者: xueren    時間: 2013-7-19 01:55
標題: uC/OS-II學習筆記—任務掛起和恢復
任務在創建后將從睡眠態轉換到就緒態,就緒的任務如果調用OSTaskSuspend將被阻塞,也就是被剝奪CPU的使用權而暫時中止運行,轉到阻塞狀態。通過OSTaskSuspend將任務轉到阻塞態被稱為掛起任務。
被掛起的任務不能運行,知道其他任務以該任務的優先級作為參數調用OSTaskResume來恢復它,才能將該任務的狀態重新設置為就緒狀態。當該任務是就緒的最高優先級的任務時,又可以得到調度而重新占領CPU,回到運行態。
一個任務如果無事可做,且優先級又較高,長期占有CPU,那么其他的任務將得不到運行而“餓死”。因此,任務在不需要運行的時候應該放棄CPU,掛起就是其中的一種策略,除此之外還有任務延時等策略。


由上圖可知,在運行過程的任務因為調用OSTaskSuspend而被掛起到阻塞態。阻塞態的任務因為其他任務以該任務的優先級作為參數調用OSTaskResume而得到恢復,恢復到就緒態。就緒的任務在優先級變為最高的情況下最終得到了運行。
值得注意的是,掛起一個任務并非將其轉換掛起態,而是阻塞態。任務因為中斷失去CPU控制權才會轉換為掛起態,掛起態的任務在中斷結束后直接回到運行態。這兩者是有明顯的區別的。
函數OSTaskSuspend用來暫時停止一個任務的執行,將任務轉換為阻塞態。如果傳遞給OSTaskSuspend的參數是OS_PRIO_SELF,則將阻塞自己,如果prio是其他任務的優先級,則將阻塞其他的就緒任務。
根據該函數執行過程中的各種情況,返回值包括:
(^_^) OS_ERR_NONE:如果成功掛起一個任務
(^_^) OS_ERR_TASK_SUSPEND_IDLE:如果試圖阻塞空閑任務。
(^_^) OS_ERR_PRIO_INVALID:非法的優先級
(^_^) OS_ERR_TASK_SUSPEND_PRIO:要掛起的任務不存在
(^_^) OS_ERR_TASK_NOT_EXITS:要掛起使用互斥信號量的任務。
另外有一點需要特別注意的是,如果掛起了一個任務,那么要注意這個任務是否在等待某些事件的發生,需要防止在事件發生的時候阻塞了的任務因為事件的發生而運行。
OSTaskSuspend代碼如下所示:


取消就緒表和就緒組中的就緒標志后,被掛起的任務在將來如果沒有恢復,就不能獲得CPU的使用權,因此處于阻塞狀態。如果任務是自己掛起自己,實際上這時任務還是在運行的,要等到倒數第二行代碼任務調度的時候,失去CPU。


其中OS_STAT_SUSPEND的值是0x08,即二進制的00001000,也就是說,OSTCBStat的從低到高的第4位標志著任務是否被掛起。
換句話說,當OSTCBStat的第4位是1時,標志著任務被掛起,否則任務沒有被使用OSTaskSuspend掛起到阻塞態。
函數OSTaskSuspend用來暫時停止一個任務的執行,將任務狀態轉換為阻塞態。那么處于阻塞態的任務要想得到運行,必須先恢復到就緒態。這個恢復被掛起的任務的函數就是OSTaskResume,它和OSTaskSuspend正好是一對函數。
在OSTaskSuspend掛起一個任務的時候,要修改就緒表和就緒組,取消任務的就緒標志;那么恢復一個任務的時候,應該加上就緒標志。另外,對于掛起的標志,是在任務控制塊中的OSTCBStat從低到高的第4位,因此,如果恢復一個任務,應該看這一位是否已經被置位,如果沒有被置位,那么恢復操作也應該是無效的。最后,如果一切正常,再將該位進行復位。
OSTaskResume代碼如下所示:




if ((ptcb->OSTCBStat & OS_STAT_SUSPEND) != OS_STAT_RDY)  判斷要恢復的任務是否為被OSTaskSuspend掛起。當然,如果對應優先級的任務并沒有被OSTaskSuspend掛起,就談不上使用OSTaskResume恢復。將要恢復的任務稱為目標任務,目標任務的控制塊稱為目標TCB,那么,前面將目標任務的TCB的地址已經賦給了ptcb,目標TCB的OSTCBStat從低到高的第4位標志著任務是否被掛起。而宏OS_STAT_SUSPEND就是二進制的00001000,因此ptcb->OSTCBStat&OS_STAT_SUSPEND剛好是屏蔽了OSTCBStat中的所有其他的位,因為&是按位與,只留下了第4位。OS_STAT_RDY的值是0,所以ptcb->OSTCBStat&OS_STAT_SUSPEND的結果不等于0就說明了確實是被OSTaskSuspend掛起的任務。





歡迎光臨 (http://m.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 一区二区三区亚洲 | 国产三级一区 | 成人国产精品久久久网站 | 免费日韩视频 | 中文字幕丰满人伦在线 | 精品欧美黑人一区二区三区 | www.一级片| 高清视频一区二区 | 国产精品成人免费精品自在线观看 | www免费视频| 在线观看免费av网站 | 国产乱码精品一区二区三 | 免费av大片 | 免费中文字幕 | 午夜免费福利视频 | 精品久久久久久久 | 99re视频| 日韩黄色在线观看 | 色哟哟一区二区三区 | 怡红院久久 | 久久国产精品免费 | 国模精品视频一区二区 | 亚洲综合婷婷 | 国产欧美日韩视频 | 伊人久久艹 | 国产一级大片 | 看一级黄色片 | 黄色一及片 | 在线a | 色资源在线 | 日产精品久久久一区二区 | 99精品视频在线观看 | 久久天天操 | 激情导航 | 99超碰在线观看 | 久久久三级 | av影院在线 | 成人羞羞网站 | 91成人国产 | 在线免费播放av | 视频一区在线播放 |