2. 等待一個(gè)郵箱中的消息,OSMboxPend();
3. 發(fā)送一個(gè)消息到郵箱中,OSMboxPost();
4. 無等待地從郵箱中得到一個(gè)消息, OSMboxAccept();
5. 查詢一個(gè)郵箱的狀態(tài), OSMboxQuery();
使用郵箱之前,必須先建立該郵箱。該操作可以通過調(diào)用OSMboxCreate()函數(shù)來完成,并且要指定指針的初始值。一般情況下,這個(gè)初始值是NULL,但也可以初始化一個(gè)郵箱,使其在最開始就包含一條消息。如果使用郵箱的目的是用來通知任務(wù)某一個(gè)事件已經(jīng)發(fā)生(發(fā)送一條消息),那么就要初始化該郵箱為NULL。如果用戶用郵箱來共享某些資源,那么就要初始化該郵箱為一個(gè)非NULL的指針。在這種情況下,郵箱被當(dāng)成一個(gè)二值信號(hào)量使用。
下面來看看創(chuàng)建一個(gè)郵箱函數(shù)的實(shí)現(xiàn)代碼:

OS_EVENT *OSMboxCreate (void *msg) { OS_EVENT *pevent; OS_ENTER_CRITICAL(); pevent = OSEventFreeList; if (OSEventFreeList != (OS_EVENT *)0) { OSEventFreeList = (OS_EVENT *)OSEventFreeList->OSEventPtr; } OS_EXIT_CRITICAL(); if (pevent != (OS_EVENT *)0) { pevent->OSEventType = OS_EVENT_TYPE_MBOX; (1) pevent->OSEventPtr = msg; (2) OSEventWaitListInit(pevent); } return (pevent); (3) }

仔細(xì)看看,其實(shí)和創(chuàng)建一個(gè)信號(hào)量的過程幾乎是一樣的,先申請(qǐng)一個(gè)空事件控制塊,接著初始化這個(gè)事件控制塊。最后返回一個(gè)指向這個(gè)事件控制塊的指針。不同之處在于事件控制塊的類型被設(shè)置成OS_EVENT_TYPE_MBOX[ (1)],以及使用.OSEventPtr域來容納消息指針。
接著來看看等待郵箱函數(shù)實(shí)現(xiàn)代碼:

void *OSMboxPend (OS_EVENT *pevent, INT16U timeout, INT8U *err) { void *msg; OS_ENTER_CRITICAL(); if (pevent->OSEventType != OS_EVENT_TYPE_MBOX) { (1) OS_EXIT_CRITICAL(); *err = OS_ERR_EVENT_TYPE; return ((void *)0); } msg = pevent->OSEventPtr; if (msg != (void *)0) { (2) pevent->OSEventPtr = (void *)0; (3) OS_EXIT_CRITICAL(); *err = OS_NO_ERR; } else if (OSIntNesting > 0) { (4) OS_EXIT_CRITICAL(); *err = OS_ERR_PEND_ISR; } else { OSTCBCur->OSTCBStat |= OS_STAT_MBOX; (5) OSTCBCur->OSTCBDly = timeout; OSEventTaskWait(pevent); OS_EXIT_CRITICAL(); OSSched(); OS_ENTER_CRITICAL(); if ((msg = OSTCBCur->OSTCBMsg) != (void *)0) { (6) OSTCBCur->OSTCBMsg = (void *)0; OSTCBCur->OSTCBStat = OS_STAT_RDY; OSTCBCur->OSTCBEventPtr = (OS_EVENT *)0; OS_EXIT_CRITICAL(); *err = OS_NO_ERR; } else if (OSTCBCur->OSTCBStat & OS_STAT_MBOX) { (7) OSEventTO(pevent); (8) OS_EXIT_CRITICAL(); msg = (void *)0; (9) *err = OS_TIMEOUT; } else { msg = pevent->OSEventPtr; (10) pevent->OSEventPtr = (void *)0; (11) OSTCBCur->OSTCBEventPtr = (OS_EVENT *)0; (12) OS_EXIT_CRITICAL(); *err = OS_NO_ERR; } } return (msg); }

同樣,它和OSSemPend()也很相似,說白了就是先看有沒有有用的消息,要是沒有,就把該任務(wù)掛起來。
OSMboxPend()首先檢查該事件控制塊是由OSMboxCreate()函數(shù)建立的[ (1)]。當(dāng).OSEventPtr域是一個(gè)非NULL的指針時(shí),說明該郵箱中有可用的消息[ (2)]。這種情況下,OSMboxPend()函數(shù)將該域的值復(fù)制到局部變量msg中,然后將.OSEventPtr置為NULL[ (3)]。這正是我們所期望的,也是執(zhí)行OSMboxPend()函數(shù)最快的路徑。
如果此時(shí)郵箱中沒有消息是可用的(OSEventPtr域是NULL指針),OSMboxPend()函數(shù)檢查它的調(diào)用者是否是中斷服務(wù)子程序[ (4)]。象OSSemPend()函數(shù)一樣,不能在中斷服務(wù)子程序中調(diào)用OSMboxPend(),因?yàn)橹袛喾?wù)子程序是不能等待的。這里的代碼同樣是為了以防萬一。但是,如果郵箱中有可用的消息,即使從中斷服務(wù)子程序中調(diào)用OSMboxPend()函數(shù),也一樣是成功的。
如果郵箱中沒有可用的消息,OSMboxPend()的調(diào)用任務(wù)就被掛起,直到郵箱中有了消息或者等待超時(shí)[ (5)]。當(dāng)有其它的任務(wù)向該郵箱發(fā)送了消息后(或者等待時(shí)間超時(shí)),這時(shí),該任務(wù)再一次成為最高優(yōu)先級(jí)任務(wù),OSSched()返回。這時(shí),OSMboxPend()函數(shù)要檢查是否有消息被放到該任務(wù)的任務(wù)控制塊中[ (6)]。如果有,那么該次函數(shù)調(diào)用成功,對(duì)應(yīng)的消息被返回到調(diào)用函數(shù)。
發(fā)送一個(gè)消息到郵箱中OSMboxPost()的代碼如下:

INT8U OSMboxPost (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); } } }

發(fā)送一個(gè)消息到郵箱和發(fā)送一個(gè)信號(hào)量也很相似,就是查看有沒有任務(wù)在等待這個(gè)消息,如果有就把那個(gè)任務(wù)從睡眠態(tài)拉回就緒態(tài)。
代碼的詳細(xì)解釋如下:
檢查了事件控制塊是否是一個(gè)郵箱后[ (1)],OSMboxPost()函數(shù)還要檢查是否有任務(wù)在等待該郵箱中的消息[ (2)]。如果事件控制塊中的OSEventGrp域包含非零值,就暗示著有任務(wù)在等待該消息。這時(shí),調(diào)用OSEventTaskRdy()將其中的最高優(yōu)先級(jí)任務(wù)從等待列表中刪除[ (3)],加入系統(tǒng)的就緒任務(wù)列表中,準(zhǔn)備運(yùn)行。然后,調(diào)用OSSched()函數(shù)[ (4)],檢查該任務(wù)是否是系統(tǒng)中最高優(yōu)先級(jí)的就緒任務(wù)。如果是,執(zhí)行任務(wù)切換[僅當(dāng)OSMboxPost()函數(shù)是由任務(wù)調(diào)用時(shí)],該任務(wù)得以執(zhí)行。如果該任務(wù)不是最高優(yōu)先級(jí)的任務(wù),OSSched()返回,OSMboxPost()的調(diào)用函數(shù)繼續(xù)執(zhí)行。如果沒有任何任務(wù)等待該消息,指向消息的指針就被保存到郵箱中[ (6)](假設(shè)此時(shí)郵箱中的指針不是非NULL的[ (5)])。這樣,下一個(gè)調(diào)用OSMboxPend()函數(shù)的任務(wù)就可以立刻得到該消息了。

如果,你對(duì)上面的內(nèi)容還有疑問,推薦選擇三五互聯(lián)企業(yè)云郵箱!有專人協(xié)助您解答郵箱疑問。

三五互聯(lián)是專業(yè)企業(yè)郵箱的官方正規(guī)提供商,21年行業(yè)經(jīng)驗(yàn),提供安全穩(wěn)定,簡(jiǎn)單易用,高性價(jià)比的企業(yè)郵箱,按需自由定制,不限空間,極速收發(fā),能夠滿足用戶對(duì)企業(yè)郵箱的不同需求。可以通過以下幾種方式注冊(cè)、申請(qǐng)、購(gòu)買、試用、開通企業(yè)郵箱

1、登錄http://m.shinetop.cn/services/mail/在線咨詢申請(qǐng)?jiān)囉没蛸?gòu)買;

2、直接致電028-62778877申請(qǐng)?jiān)囉没蛘劫?gòu)買開通;

贊(0)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享網(wǎng)絡(luò)內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。郵箱:3140448839@qq.com。本站原創(chuàng)內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明出處:三五互聯(lián)知識(shí)庫(kù) » UCOS-II任務(wù)間通信:郵箱

登錄

找回密碼

注冊(cè)

主站蜘蛛池模板: 国产亚洲精品日韩av在| 国产久久热这里只有精品| 国产精品一区二区三区黄| 亚洲精品无码在线观看| 亚洲日韩AV秘 无码一区二区| 日韩精品 在线 国产 丝袜| 国内精品久久久久久久97牛牛| 国产精品中出一区二区三区| 国产一区二区在线有码| 亚洲av高清一区二区| 国产超高清麻豆精品传媒麻豆精品 | 女同精品女同系列在线观看| 婷婷久久香蕉五月综合加勒比 | 日韩东京热一区二区三区| 吴江市| 男女性高爱潮免费网站| 久久一级精品久熟女人妻| 依兰县| 无码人妻丝袜在线视频| 亚洲日本国产精品一区| 办公室强奷漂亮少妇视频| 蜜臀91精品国产高清在线| 天天拍夜夜添久久精品大| 国产精品无遮挡在线观看| 2019国产精品青青草原| 成人午夜福利一区二区四区| 永久免费av网站可以直接看的| 岛国一区二区三区高清视频| 精品国产高清中文字幕| 波多野结衣久久一区二区| 久久婷婷综合色丁香五月| 国产精品久久久午夜夜伦鲁鲁| 久久精品免费自拍视频| 18成禁人视频免费| 国产不卡精品一区二区三区 | 麻豆一区二区三区精品视频| 熟女视频一区二区在线观看| 亚洲精品一二三中文字幕| 国产线播放免费人成视频播放| 不卡高清AV手机在线观看| 久久精产国品一二三产品|