標(biāo)題:
線程通信之郵箱個人理解,有錯望高人指正!
[打印本頁]
作者:
xuwei
時間:
2015-6-13 16:31
標(biāo)題:
線程通信之郵箱個人理解,有錯望高人指正!
線程和線程之間的通信可以靠郵箱來實現(xiàn),從而完成線程間的通信,我做了一個小實驗,來證明郵箱的建立和工作原理具體如下(其實很簡單):
首先找到系統(tǒng)提供API函數(shù)接口,總共7個接口函數(shù),只要關(guān)心四個就可以了,其他的視情況而定,分別是:
1:ACCEPT MESSAGE FROM MAILBOX
2:CREATE A MESSAGE MAILBOX
3.PEND ON MAILBOX FOR A MESSAGE
4.POST MESSAGE TO A MAILBOX
這四個函數(shù)就可以建立郵箱,等待,和發(fā)送消息,你要傳送的變量或者說消息,API提供的是一個萬能的VOID指針,所以你只要把你的消息搭載到郵箱里面就可以了,非常簡單方便,只是定義數(shù)據(jù)類型號的時候一定注意郵箱是時間控制塊的,所以一定要定義成時間類型的指針,這個不能搞錯,還有建立的時候可以見一個而空的,或者已經(jīng)有一則消息的都可以,視情況而定哦,很方便很簡單那。下面看看到底消息被放到了油桶的那個位置?
看定義如下:
void *OSEventPtr; //這就是一則消息的指針存放的載體!非常關(guān)鍵!消息就是被放到這里面的,但是什嗎時間放,放什么,都是你決定的,API只是提供一個這樣的載體的結(jié)構(gòu),所以不得不驚嘆人家高人的水平啊,很牛叉。
下面是消息怎么被放進郵筒的:
pevent->OSEventPtr = msg;
這就是結(jié)果!和明顯了吧,這樣一則消息就駐留到內(nèi)存中的郵箱中等待被取,
消息怎么被取出?
msg = pevent->OSEventPtr;
顯而易見的事情了!
你要做的就是做幾個指針接收這則消息就這么簡單那而已!
注意空郵箱是要初始化的,還有就是郵箱的個數(shù)是由任務(wù)控制塊決定在這里:
OSEventTbl[OS_MAX_EVENTS]
其實這個和就緒表是差不多的,也有一個指針指向空的任務(wù)控制塊池,持的大小也是用戶決定!相當(dāng)爽!指針入下: *OSEventFreeList; ,這個是只想當(dāng)前空閑的任務(wù)控制塊!
這是APP
static void AppTask_LED (void *p_arg)
{
INT8U mistak_mabox_led;//消息錯誤存儲
INT8U *mes;
(void)p_arg;
while (1)
{
mes=(INT8U*)OSMboxPend (MBOX_LED, (INT16U )0, &mistak_mabox_led);
if(*mes==3)
{
LED_On();
OSTimeDlyHMSM(0,0,0,500);
LED_Off();
OSTimeDlyHMSM(0,0,0,500);
}
else
{
LED_On();
OSTimeDlyHMSM(0,0,3,0);
LED_Off();
OSTimeDlyHMSM(0,0,3,0);
}
}
}
static void AppTask_LED1 (void *p_arg)
{
static INT8U tab[4]={2,4};
(void)p_arg;
while (1)
{
OSMboxPost (MBOX_LED,&tab);
// OSTimeDlyHMSM(0,0,5,0);
}
}
一個簡單的測試:消息=3執(zhí)行短循環(huán),反之執(zhí)行長循環(huán)!
王均偉
沒發(fā)工資他大爺?shù)模?nbsp;
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1