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