#define LED1_TASK_Prio 5
用到的UCOSII函數(shù)
消息郵箱創(chuàng)建函數(shù):
OS_EVENT *OSMboxCreate (void *msg)
請(qǐng)求消息郵箱函數(shù):
void *OSMboxPend (OS_EVENT *pevent, INT16U timeout, INT8U *err)
向郵箱發(fā)送消息函數(shù):
INT8U OSMboxPost (OS_EVENT *pevent, void *msg)//向等待任務(wù)表中高優(yōu)先級(jí)的任務(wù)發(fā)送消息
廣播郵箱消息函數(shù):
INT8U OSMboxPostOpt (OS_EVENT *pevent, void *msg, INT8U opt)//向等待任務(wù)表中所有任務(wù)發(fā)送消息
按鍵掃描任務(wù)中,如果KEY0被按下,那么將向消息郵箱Str_Box發(fā)送消息1,
i=1;
OSMboxPost(Str_Box,&i); //發(fā)送消息1
如果KEY1被按下,那么將發(fā)送消息2,
i=2;
OSMboxPost(Str_Box,&i); //發(fā)送消息2
如果KEY2(WK_UP)被按下,將向所有等待任務(wù)表中所有任務(wù)發(fā)送消息3,
i=3;
OSMboxPostOpt(Str_Box,&i,OS_POST_OPT_BROADCAST); //向所有任務(wù)廣播消息3
實(shí)驗(yàn)現(xiàn)象:
我們可以看到,如果我們按下KEY0,因?yàn)門askLed1的優(yōu)先級(jí)別高于TaskLed,所以當(dāng)兩個(gè)任務(wù)都在等待的時(shí)候,只有TaskLed1可以收到消息1,所以兩個(gè)LED都不反轉(zhuǎn)。
如果按下KEY1,那么TaskLed1收到消息2,狀態(tài)反轉(zhuǎn)。
如果按下KEY2,那么TaskLed1和TaskLed都會(huì)收到消息,這個(gè)時(shí)候兩個(gè)LED狀態(tài)都會(huì)反轉(zhuǎn)。
OSMboxPostOpt()和OSMboxPost()的區(qū)別在于前者是廣播消息,所有等待任務(wù)都可以收到,后者只會(huì)高優(yōu)先級(jí)的任務(wù)收到。
下面給出消息郵箱的使用例程