<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          μC/OS-II的任務(wù)管理

          作者: 時(shí)間:2016-10-08 來(lái)源:網(wǎng)絡(luò) 收藏

          字節(jié)表示)就是該兩項(xiàng)之和。

          程序清單 L4.10 堆棧檢驗(yàn)函數(shù)

          INT8UOSTaskStkChk(INT8Uprio,OS_STK_DATA*pdata)

          {

          OS_TCB*ptcb;

          OS_STK*pchk;

          INT32Ufree;

          INT32Usize;

          pdata->OSFree=0;

          pdata->OSUsed=0;

          if(prio>OS_LOWEST_PRIOprio!=OS_PRIO_SELF){

          return(OS_PRIO_INVALID);

          }

          OS_ENTER_CRITICAL();

          if(prio==OS_PRIO_SELF){(1)

          prio=OSTCBCur->OSTCBPrio;

          }

          ptcb=OSTCBPrioTbl[prio];

          if(ptcb==(OS_TCB*)0){(2)

          OS_EXIT_CRITICAL();

          return(OS_TASK_NOT_EXIST);

          }

          if((ptcb->OSTCBOptOS_TASK_OPT_STK_CHK)==0){(3)

          OS_EXIT_CRITICAL();

          return(OS_TASK_OPT_ERR);

          }

          free=0; (4)

          size=ptcb->OSTCBStkSize;

          pchk=ptcb->OSTCBStkBottom;

          OS_EXIT_CRITICAL();

          #ifOS_STK_GROWTH==1

          while(*pchk++==0){

          free++;

          }

          #else

          while(*pchk--==0){

          free++;

          }

          #endif

          pdata->OSFree=free*sizeof(OS_STK);(5)

          pdata->OSUsed=(size-free)*sizeof(OS_STK);

          return(OS_NO_ERR);

          }

          4.4刪除任務(wù),OSTaskDel()

          有時(shí)候刪除任務(wù)是很有必要的。刪除任務(wù),是說(shuō)任務(wù)將返回并處于休眠狀態(tài)(參看3.02,任務(wù)狀態(tài)),并不是說(shuō)任務(wù)的代碼被刪除了,只是任務(wù)的代碼不再被μC/OS-Ⅱ調(diào)用。通過(guò)調(diào)用OSTaskDel()就可以完成刪除任務(wù)的功能(如程序清單L4.11所示)。OSTaskDel()一開(kāi)始應(yīng)確保用戶(hù)所要?jiǎng)h除的任務(wù)并非是空閑任務(wù),因?yàn)閯h除空閑任務(wù)是不允許的[L4.11(1)]。不過(guò),用戶(hù)可以刪除statistic任務(wù)[L4.11(2)]。接著,OSTaskDel()還應(yīng)確保用戶(hù)不是在ISR例程中去試圖刪除一個(gè)任務(wù),因?yàn)檫@也是不被允許的[L4.11(3)]。調(diào)用此函數(shù)的任務(wù)可以通過(guò)指定OS_PRIO_SELF參數(shù)來(lái)刪除自己[L4.11(4)]。接下來(lái)OSTaskDel()會(huì)保證被刪除的任務(wù)是確實(shí)存在的[L4.11(3)]。如果指定的參數(shù)是OS_PRIO_SELF的話,這一判斷過(guò)程(任務(wù)是否存在)自然是可以通過(guò)的,但筆者不準(zhǔn)備為這種情況單獨(dú)寫(xiě)一段代碼,因?yàn)檫@樣只會(huì)增加代碼并延長(zhǎng)程序的執(zhí)行時(shí)間。

          程序清單 L4.11 刪除任務(wù)

          INT8UOSTaskDel(INT8Uprio)

          {

          OS_TCB*ptcb;

          OS_EVENT*pevent;

          if(prio==OS_IDLE_PRIO){(1)

          return(OS_TASK_DEL_IDLE);

          }

          if(prio>=OS_LOWEST_PRIOprio!=OS_PRIO_SELF){(2)

          return(OS_PRIO_INVALID);

          }

          OS_ENTER_CRITICAL();

          if(OSIntNesting>0){(3)

          OS_EXIT_CRITICAL();

          return(OS_TASK_DEL_ISR);

          }

          if(prio==OS_PRIO_SELF){(4)

          Prio=OSTCBCur->OSTCBPrio;

          }

          if((ptcb=OSTCBPrioTbl[prio])!=(OS_TCB*)0){(5)

          if((OSRdyTbl[ptcb->OSTCBY]=~ptcb->OSTCBBitX)==0){(6)

          OSRdyGrp=~ptcb->OSTCBBitY;

          }

          if((pevent=ptcb->OSTCBEventPtr)!=(OS_EVENT*)0){(7)

          if((pevent->OSEventTbl[ptcb->OSTCBY]=~ptcb->OSTCBBitX)==0)

          {

          pevent->OSEventGrp=~ptcb->OSTCBBitY;

          }

          }

          Ptcb->OSTCBDly=0;(8)

          Ptcb->OSTCBStat=OS_STAT_RDY;(9)

          OSLockNesting++;(10)

          OS_EXIT_CRITICAL();(11)

          OSDummy();(12)

          OS_ENTER_CRITICAL();

          OSLockNesting--;(13)

          OSTaskDelHook(ptcb);(14)

          OSTaskCtr--;

          OSTCBPrioTbl[prio]=(OS_TCB*)0;(15)

          if(ptcb->OSTCBPrev==(OS_TCB*)0){(16)

          ptcb->OSTCBNext->OSTCBPrev=(OS_TCB*)0;

          OSTCBList=ptcb->OSTCBNext;

          }else{

          ptcb->OSTCBPrev->OSTCBNext=ptcb->OSTCBNext;

          ptcb->OSTCBNext->OSTCBPrev=ptcb->OSTCBPrev;

          }

          ptcb->OSTCBNext=OSTCBFreeList;(17)

          OSTCBFreeList=ptcb;

          OS_EXIT_CRITICAL();

          OSSched();(18)

          return(OS_NO_ERR);

          }else{

          OS_EXIT_CRITICAL();

          return(OS_TASK_DEL_ERR);

          }

          }

          一旦所有條件都滿足了,OS_TCB就會(huì)從所有可能的μC/OS-Ⅱ的數(shù)據(jù)結(jié)構(gòu)中移除。OSTaskDel()分兩步完成該移除任務(wù)以減少中斷響應(yīng)時(shí)間。首先,如果任務(wù)處于就緒表中,它會(huì)直接被移除[L4.11(6)]。如果任務(wù)處于郵箱、消息隊(duì)列或信號(hào)量的等待表中,它就從自己所處的表中被移除[L4.11(7)]。接著,OSTaskDel()將任務(wù)的時(shí)鐘延遲數(shù)清零,以確保自己重新允許中斷的時(shí)候,ISR例程不會(huì)使該任務(wù)就緒[L4.11(8)]。最后,OSTaskDel()置任務(wù)的.OSTCBStat標(biāo)志為OS_STAT_RDY。注意,OSTaskDel()并不是試圖使任務(wù)處于就緒狀態(tài),而是阻止其它任務(wù)或ISR例程讓該任務(wù)重新開(kāi)始執(zhí)行(即避免其它任務(wù)或ISR調(diào)用OSTaskResume()[L4.11(9)])。這種情況是有可能發(fā)生的,因?yàn)镺STaskDel()會(huì)重新打開(kāi)中斷,而ISR可以讓更高優(yōu)先級(jí)的任務(wù)處于就緒狀態(tài),這就可能會(huì)使用戶(hù)想刪除的任務(wù)重新開(kāi)始執(zhí)行。如果不想置任務(wù)的.OSTCBStat標(biāo)志為OS_STAT_RDY,就只能清除OS_STAT_SUSPEND位了(這樣代碼可能顯得更清楚,更容易理解一些),但這樣會(huì)使得處理時(shí)間稍長(zhǎng)一些。

          要被刪除的任務(wù)不會(huì)被其它的任務(wù)或ISR置于就緒狀態(tài), 因?yàn)樵撊蝿?wù)已從就緒任務(wù)表中刪除了,它不是在等待事件的發(fā)生,也不是在等待延時(shí)期滿,不能重新被執(zhí)行。為了達(dá)到刪除任務(wù)的目的,任務(wù)被置于休眠狀態(tài)。正因?yàn)檫@樣,OSTaskDel()必須得阻止任務(wù)調(diào)度程序[L4.11(10)]在刪除過(guò)程中切換到其它的任務(wù)中去,因?yàn)槿绻?dāng)前的任務(wù)正在被刪除,它不可能被再次調(diào)度!接下來(lái),OSTaskDel()重新允許中斷以減少中斷的響應(yīng)時(shí)間[L4.11(11)]。



          關(guān)鍵詞:

          評(píng)論


          相關(guān)推薦

          技術(shù)專(zhuān)區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();