//设置任务优先级
#define LED_TASK_Prio 6
#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()的区别在于前者是广播消息,所有等待任务都可以收到,后者只会高优先级的任务收到。
下面给出消息邮箱的使用例程