激情九九,六月婷婷七月丁香,天天五月天丁香婷婷深爱综合,国产色一区,国产一区二区三区免费在线观看,91最新网站

uCOS II 之事件控制塊學(xué)習(xí)

來源:網(wǎng)絡(luò)

點(diǎn)擊:2123

A+ A-

所屬頻道:新聞中心

關(guān)鍵詞: uCOS II,事件控制塊

      一。 事件控制塊ECB數(shù)據(jù)結(jié)構(gòu):

      typedef struct

      {

      INT8U OSEventType; //事件類型

      INT8U OSEventGrp; //等待任務(wù)所在的組

      INT16U OSEventCnt; //當(dāng)事件是信號量時的計數(shù)器

      void *OSEventPtr; //指向消息或消息隊列的指針

      INT8U OSEventTbl[OS_EVENT_TBL_SIZE]; //等待任務(wù)列表

      } OS_EVENT;

      二.關(guān)鍵算法:

      1、將一個任務(wù)插入到等待事件的任務(wù)列表中:

      當(dāng)調(diào)用函數(shù)OS_EventTaskWait( )使一個任務(wù)進(jìn)入等待某事件發(fā)生時,需要此算法,從而將任務(wù)插入到等待事件的任務(wù)列表中。

      pevent -》 OSEventGrp |= OSMapTbl[prio 》》 3];

      pevent -》 OSEventTbl[prio》》3] = OSMapTbl[prio & 0x07];

      2、從等待事件的任務(wù)列表中使任務(wù)脫離等待狀態(tài):

      當(dāng)調(diào)用函數(shù)OS_EventTaskRdy( )使一個任務(wù)進(jìn)入就緒態(tài)時,需要調(diào)用此算法,從而使等待的任務(wù)脫離等待狀態(tài)進(jìn)入就緒。

      if ((pevent -》 OSEventTbl[prio 》》3] &= ~OSMapTbl[prio & 0x07]) == 0)

      {

      pevent -》 OSEventGrp &= ~OSMapTbl[prio 》》3];

      }

      3、在等待事件的任務(wù)列表中查找優(yōu)先級最高的任務(wù):

      當(dāng)調(diào)用函數(shù)OS_EventTaskRdy( )使一個任務(wù)進(jìn)入就緒態(tài)時,需要調(diào)用此算法,從而首先找出在等待事件任務(wù)列表中最高優(yōu)先級的任務(wù)進(jìn)入就緒狀態(tài)。

      y = OSUnMapTbl[pevent -》 OSEventGrp];

      x = OSUnMapTbl[pevent -》 OSEventTbl[y];

      prio = (y 《《 3) + x;

      三.對事件控制塊ECB的基本操作

      1、初始化一個事件控制塊:

      函數(shù)OSSemCreate( ),OSMutexCreate( ),OSMboxCreate( ),OSQCreate( )建立時,必須調(diào)用此函數(shù)進(jìn)行初始化,初始化一個空的等待列表,表中沒有任何等待事件的任務(wù)。

      OS_EventWaitListInit( );

      2、使一個任務(wù)進(jìn)入就緒態(tài):

      當(dāng)某個事件發(fā)生了時,要將事件等待任務(wù)列表中最高優(yōu)先級的任務(wù)進(jìn)入就緒態(tài),函數(shù)OSSemPost,OSMutexPost( ),OSMboxPost( ),OSQPost( )必將調(diào)用此函數(shù)從而使一個任務(wù)進(jìn)入就緒態(tài)。

      OS_EventTaskRdy( );

      3、使一個任務(wù)進(jìn)入等待某事件發(fā)生:

      當(dāng)某個任務(wù)須等待一個事件的發(fā)生時,信號量、互斥型信號量、郵箱、消息隊列會通過相應(yīng)的PEND函數(shù)來調(diào)用這個函數(shù)。

      OS_EventTaskWait( );

      4、由于等待超時而將任務(wù)置為就緒態(tài):

      如果在預(yù)先指定的等待時間內(nèi)任務(wù)等待的事件沒有發(fā)生,那么PNED類型函數(shù)將會調(diào)用此函數(shù)從而將等待超時的任務(wù)進(jìn)入就緒態(tài)。

      OS_EventTo( );

      四.事件控制塊ECB基本操作代碼的分析。

      1、OS_EventWaitListInit( );

      void OS_EventWaitListInit(OS_EVENT *pevent)

      {

      INT8U *ptbl; //定義指針變量ptbl

      pevent -》 OSEventGrp = 0x00; //清除任務(wù)所在的組

      OS_EVENT_TBL_SIZE在UCOS_ II.H中定義大小

      ptbl = &pevent -》 OSEventTbl[0];

      #if OS_EVENT_TBL_SIZE 》 0

      *ptbl++ = 0x00; //清除等待任務(wù)列表,在這里沒有使用for循環(huán)是為了節(jié)省系統(tǒng)開銷

      #endif

      #if OS_EVENT_TBL_SIZE 》 1

      *ptbl++ = 0x00;

      #endif

      #if OS_EVENT_TBL_SIZE 》 2

      *ptbl++ = 0x00;

      #endif

      #if OS_EVENT_TBL_SIZE 》 3

      *ptbl++ = 0x00;

      #endif

      #if OS_EVENT_TBL_SIZE 》 4

      *ptbl++ = 0x00;

      #endif

      #if OS_EVENT_TBL_SIZE 》 5

      *ptbl++ = 0x00;

      #endif

      #if OS_EVENT_TBL_SIZE 》 6

      *ptbl++ = 0x00;

      #endif

      #if OS_EVENT_TBL_SIZE 》 7

      *ptbl++ = 0x00;

      #endif

      }

      2、OS_EventTaskRdy( );

      INT8U OS_EventTaskRdy(OS_EVENT *pevent, void *msg,INT8U msk)

      {

      OS_TCB *ptcb;

      INT8U x;

      INT8U y;

      按照關(guān)鍵算法3,在等待事件的任務(wù)列表中找到優(yōu)先級最高的任務(wù),并確定其優(yōu)先級。

     

      INT8U bitx;

      INT8U bity;

      INT8U prio;

      y = OSUnMapTbl[pevent -》 OSEventGrp];

      bity = OSMapTbl[y];

      x = OSUnMapTbl[pevent -》 OSEventTbl[y]];

      利用算法2,從等待任務(wù)列表中刪除此優(yōu)先級最高的任務(wù)。

      bitx = OSMapTbl[x];

      prio = (INT8U)(( y 《《 3) + x);

      if ((pevent -》 OSEventTbl[y] &= ~bitx) == 0x00)

      { pevent -》 OSEventGrp &= ~bity;}

      ptcb = OSTCBPrioTbl[prio]; //知道了任務(wù)優(yōu)先級,從而找到任務(wù)控制塊的指針

      ptcb -》 OSTCBDly = 0; //由于此任務(wù)已經(jīng)不再等待事件的發(fā)生,因此直接清0

      ptcb -》 OSTCBEventPtr = (OS_EVENT *)0;//由于不再等待事件的發(fā)生,使指向事件控制塊的指針指向NULL

      #if ((OS_Q_EN 》 0) && (OS_MAX_QS 》 0)) || (OS_MBOX_EN 》 0)

      ptcb -》 OSTCBMsg = msg;//如果此函數(shù)是郵箱或隊列POST函數(shù)調(diào)用的,則需要將傳遞來的參數(shù)放到它的任務(wù)控制塊中

      #else

      msg = msg;

      #endif

      ptcb -》 OSTCBStat &= ~msk;

      if (ptcb -》 OSTCBStat == OS_STAT_RDY)]

      {

      OSRdyGrp |= bity; ---最高優(yōu)先級的任務(wù)插入到就緒任務(wù)列表,由后續(xù)POST函數(shù)中的

      OSRdyTbl[y] |= bitx; ---OSSched( )函數(shù)進(jìn)行調(diào)度使任務(wù)進(jìn)入就緒,請參考第三章之就緒表

      }

      return (prio);

      }

      3、OS_EventTaskWait( );

      void OS_EventTaskWait(OS_EVENT *pevent)

      {

      OSTCBCur -》 OSTCBEventPtr = pevent;

      if (( OSRdyTbl[OSTCBCur -》 OSTCBY] &= ~OSTCBCur-》OSTCBBitx) == 0x00)

      { OSRdyGrp &= ~OSTCBCur -》 OSTCBBity; } //如果在PEND函數(shù)中沒有收到有效的信號量,

      //那么將調(diào)用此函數(shù)進(jìn)入睡眠態(tài),在這里將任務(wù)在任務(wù)就緒列表中刪除

      pevent -》 OSEventTbl[OSTCBCur -》 OSTCBY] |= OSTCBCur -》 OSTCBBitx;

      pevent -》 OSEventGrp |= OSTCBCur -》 OSTCBBity;//把此任務(wù)放到ECB的等待事件的任務(wù)列表中去

      }

      4、OS_EventTo( );

      void OS_EventTO (OS_EVENT *pevent)

      {

      if (( pevent -》 OSEventTbl[OSTCBCur -》 OSTCBY] &= ~OSTCBCur -》 OSTCBBitx) ==0x00)

      { pevent -》 OSEventGrp &= ~OSTCBCur -》 OSTCBBitY; }//將超時的任務(wù)在等待任務(wù)列表中刪除

      OSTCBCur -》 OSTCBStat = OS_STAT_RDY; //任務(wù)置為就緒態(tài)

      OSTCBCur -》 OSTCBEventPtr = (OS_EVENT *)0;

      }

    (審核編輯: 智匯小新)

    聲明:除特別說明之外,新聞內(nèi)容及圖片均來自網(wǎng)絡(luò)及各大主流媒體。版權(quán)歸原作者所有。如認(rèn)為內(nèi)容侵權(quán),請聯(lián)系我們刪除。

    主站蜘蛛池模板: 日本激情网址 | 欧美日韩国产免费一区二区三区 | 欧美伦理网站 | 国产亚洲精品美女久久久久久2021 | 久久99国产这里有精品视 | 久久久久久国产精品免费 | 亚洲青草视频 | 一级毛片免费播放 | 四虎在线网址 | 国产欧美在线一区二区三区 | 天天爱天天做天天爽天天躁 | 九九国产精品视频 | 福利在线视频一区热舞 | 国产99久久久久久免费看 | 午夜精品久久久久久 | 久久久久久免费精品视频 | 国产羞羞视频在线观看 | 四虎精品在线观看 | 免费看久久 | 高清不卡一区二区 | 美女国产在线观看 | 国产小视频在线观看免费 | 国产成人免费在线视频 | 男女下面一进一出视频在线观看 | 亚洲六月丁香六月婷婷色伊人 | 免费两性的视频网站 | av网站免费线看 | 国产成人精品日本亚洲语言 | 色戒无删减版在线 | 毛片一级在线观看 | 老阿姨露脸69式 | 亚洲青青青网伊人精品 | 欧美一区二区三区在线观看不卡 | 国产精品久久久久久一区二区三区 | 欧美日韩在线播放 | 国产经典大片爱情片 | 日日射日日干 | 99免费在线视频 | 婷婷色在线播放 | 欧美夫妻性生活视频 | 四虎成人欧美精品在永久在线 |