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

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > μC/OS-II的任務(wù)之間的通訊與同步

          μC/OS-II的任務(wù)之間的通訊與同步

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

          程序清單L6.16向郵箱中發(fā)送一條消息

          INT8UOSMboxPost(OS_EVENT*pevent,void*msg)

          {

          OS_ENTER_CRITICAL();

          if(pevent->OSEventType!=OS_EVENT_TYPE_MBOX){(1)

          OS_EXIT_CRITICAL();

          return(OS_ERR_EVENT_TYPE);

          }

          if(pevent->OSEventGrp){(2)

          OSEventTaskRdy(pevent,msg,OS_STAT_MBOX);(3)

          OS_EXIT_CRITICAL();

          OSSched();(4)

          return(OS_NO_ERR);

          }else{

          if(pevent->OSEventPtr!=(void*)0){(5)

          OS_EXIT_CRITICAL();

          return(OS_MBOX_FULL);

          }else{

          pevent->OSEventPtr=msg;(6)

          OS_EXIT_CRITICAL();

          return(OS_NO_ERR);

          }

          }

          }

          6.7.4 無等待地從郵箱中得到一個(gè)消息,OSMboxAccept()

          應(yīng)用程序也可以以無等待的方式從郵箱中得到消息。這可以通過程序清單L6.17中的OSMboxAccept()函數(shù)來實(shí)現(xiàn)。OSMboxAccept()函數(shù)開始也是檢查事件控制塊是否是由OSMboxCreate()函數(shù)建立的 [L6.17(1)]。接著,它得到郵箱中的當(dāng)前內(nèi)容[L6.17(2)],并判斷是否有消息是可用的[L6.17(3)]。如果郵箱中有消息,就把郵箱清空[L6.17(4)],而郵箱中原來指向消息的指針被返回給OSMboxAccept()的調(diào)用函數(shù)[L6.17(5)]。OSMboxAccept()函數(shù)的調(diào)用函數(shù)必須檢查該返回值是否為NULL。如果該值是NULL,說明郵箱是空的,沒有可用的消息。

          如果該值是非NULL值,說明郵箱中有消息可用,而且該調(diào)用函數(shù)已經(jīng)得到了該消息。中斷服務(wù)子程序在試圖得到一個(gè)消息時(shí), 應(yīng)該使用OSMboxAccept()函數(shù), 而不能使用OSMboxPend()函數(shù)。

          OSMboxAccept()函數(shù)的另一個(gè)用途是,用戶可以用它來清空一個(gè)郵箱中現(xiàn)有的內(nèi)容。

          程序清單L6.17無等待地從郵箱中得到消息

          void*OSMboxAccept(OS_EVENT*pevent)

          {

          void*msg;

          OS_ENTER_CRITICAL();

          if(pevent->OSEventType!=OS_EVENT_TYPE_MBOX){(1)

          OS_EXIT_CRITICAL();

          return((void*)0);

          }

          msg=pevent->OSEventPtr;(2)

          if(msg!=(void*)0){(3)

          pevent->OSEventPtr=(void*)0;(4)

          }

          OS_EXIT_CRITICAL();

          return(msg);(5)

          }

          6.7.5 查詢一個(gè)郵箱的狀態(tài),OSMboxQuery()

          OSMboxQuery()函數(shù)使應(yīng)用程序可以隨時(shí)查詢一個(gè)郵箱的當(dāng)前狀態(tài)。程序清單L6.18是該函數(shù)的源代碼。它需要兩個(gè)參數(shù):一個(gè)是指向郵箱的指針pevent。該指針是在建立該郵箱時(shí),由OSMboxCreate()函數(shù)返回的;另一個(gè)是指向用來保存有關(guān)郵箱的信息的OS_MBOX_DATA(見

          uCOS_II.H)數(shù)據(jù)結(jié)構(gòu)的指針pdata。在調(diào)用OSMboxCreate()函數(shù)之前,必須先定義該結(jié)構(gòu)變量,

          用來保存有關(guān)郵箱的信息。之所以定義一個(gè)新的數(shù)據(jù)結(jié)構(gòu),是因?yàn)檫@里關(guān)心的只是和特定郵箱

          有關(guān)的內(nèi)容,而非整個(gè)OS_EVENT數(shù)據(jù)結(jié)構(gòu)的內(nèi)容。后者還包含了另外兩個(gè)域

          (.OSEventCnt和.OSEventType),而OS_MBOX_DATA只包含郵箱中的消息指針(.OSMsg)和該郵箱現(xiàn)有的等待任務(wù)列表(.OSEventTbl[]和.OSEventGrp)。

          和前面的所以函數(shù)一樣,該函數(shù)也是先檢查事件控制是否是郵箱[L6.18(1)]。然后,將郵箱中的等待任務(wù)列表[L6.18(2)]和郵箱中的消息[L6.18(3)]從OS_EVENT數(shù)據(jù)結(jié)構(gòu)復(fù)制到OS_MBOX_DATA數(shù)據(jù)結(jié)構(gòu)。

          程序清單L6.18查詢郵箱的狀態(tài)

          INT8UOSMboxQuery(OS_EVENT*pevent,OS_MBOX_DATA*pdata)

          {

          INT8Ui;

          INT8U*psrc;

          INT8U*pdest;

          OS_ENTER_CRITICAL();

          if(pevent->OSEventType!=OS_EVENT_TYPE_MBOX){(1)

          OS_EXIT_CRITICAL();

          return(OS_ERR_EVENT_TYPE);

          }

          pdata->OSEventGrp=pevent->OSEventGrp;(2)

          psrc=pevent->OSEventTbl[0];

          pdest=pdata->OSEventTbl[0];

          for(i=0;i

          *pdest++=*psrc++;

          }

          pdata->OSMsg=pevent->OSEventPtr;(3)

          OS_EXIT_CRITICAL();

          return(OS_NO_ERR);

          }

          6.7.6 用郵箱作二值信號(hào)量

          一個(gè)郵箱可以被用作二值的信號(hào)量。 首先, 在初始化時(shí), 將郵箱設(shè)置為一個(gè)非零的指針(如

          void*1)。這樣,一個(gè)任務(wù)可以調(diào)用OSMboxPend()函數(shù)來請(qǐng)求一個(gè)信號(hào)量,然后通過調(diào)用

          OSMboxPost()函數(shù)來釋放一個(gè)信號(hào)量。程序清單L6.19說明了這個(gè)過程是如何工作的。如果用

          戶只需要二值信號(hào)量和郵箱,這樣做可以節(jié)省代碼空間。這時(shí)可以將OS_SEM_EN設(shè)置為0,只使

          用郵箱就可以了。

          程序清單L6.19使用郵箱作為二值信號(hào)量

          OS_EVENT*MboxSem;

          voIDTask1(void*pdata)

          {

          INT8Uerr;

          for(;;){

          OSMboxPend(MboxSem,0,err);/*獲得對(duì)資源的訪問權(quán)*/

          .

          ./*任務(wù)獲得信號(hào)量,對(duì)資源進(jìn)行訪問*/

          .

          OSMboxPost(MboxSem,(void*)1);/*釋放對(duì)資源的訪問權(quán)*/

          }

          }

          6.7.7 用郵箱實(shí)現(xiàn)延時(shí),而不使用OSTimeDly()

          郵箱的等待超時(shí)功能可以被用來模仿OSTimeDly()函數(shù)的延時(shí),如程序清單L6.20所示。

          如果在指定的時(shí)間段TIMEOUT內(nèi),沒有消息到來,Task1()函數(shù)將繼續(xù)執(zhí)行。這和OSTimeDly(TIMEOUT)功能很相似。但是,如果Task2()在指定的時(shí)間結(jié)束之前,向該郵箱發(fā)送了一個(gè)“啞”消息,Task1()就會(huì)提前開始繼續(xù)執(zhí)行。這和調(diào)用OSTimeDlyResume()函數(shù)的功能是一樣的。注意,這里忽略了對(duì)返回的消息的檢查,因?yàn)榇藭r(shí)關(guān)心的不是得到了什么樣的消息。

          程序清單L6.20使用郵箱實(shí)現(xiàn)延時(shí)

          OS_EVENT*MboxTimeDly;

          voidTask1(void*pdata)

          {

          INT8Uerr;

          for(;;){

          OSMboxPend(MboxTimeDly, TIMEOUT,err);/*延時(shí)該任務(wù)*/

          .

          ./*延時(shí)結(jié)束后執(zhí)行的代碼*/

          .

          }

          }

          voidTask2(void*pdata)



          關(guān)鍵詞:

          評(píng)論


          相關(guān)推薦

          技術(shù)專區(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); })();