Ucosii消息邮箱使用

//设置任务优先级

创新互联坚持“要么做到,要么别承诺”的工作理念,服务领域包括:成都做网站、网站制作、企业官网、英文网站、手机端网站、网站推广等服务,满足客户于互联网时代的正蓝网站设计、移动媒体设计的需求,帮助企业找到有效的互联网解决方案。努力成为您成熟可靠的网络建设合作伙伴!

#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()的区别在于前者是广播消息,所有等待任务都可以收到,后者只会高优先级的任务收到。

下面给出消息邮箱的使用例程
[objc]view plain copy print?
OS_EVENT*Str_Box;Str_Box=OSMboxCreate((void*)0);//创建消息邮箱//任务1//控制DS0的亮灭.voidTaskLed(voidvoid*pdata){u8result=0;while(1){result=*((u8*)OSMboxPend(Str_Box,0,&err));//请求消息邮箱if(result==1||result==3){LED0=!LED0;}OSTimeDlyHMSM(0,0,0,200);}}//任务3//按键检测voidTaskKey(voidvoid*pdata){u8key=0,i=0;while(1){key=KEY_Scan();if(key==1){i=1;OSMboxPost(Str_Box,&i);//发送消息1 //注意:消息邮箱的要发送的数据变量可以是临时变量!!!因为这个临时变量在任务生存期间一直存在}elseif(key==2){i=2;OSMboxPost(Str_Box,&i);//发送消息2 //注意:消息邮箱的要发送的数据变量可以是临时变量!!!}elseif(key==3){i=3;OSMboxPostOpt(Str_Box,&i,OS_POST_OPT_BROADCAST);//向所有任务广播消息3 //注意:消息邮箱的要发送的数据变量可以是临时变量!!!}OSTimeDlyHMSM(0,0,0,20);}}

标题名称:Ucosii消息邮箱使用
文章源于:http://scyanting.com/article/cgjije.html