Ucosii消息邮箱使用

  • 来源:新网
  • 更新日期:2018-03-13

摘要://设置任务优先级 #define LED_TASK_Prio       6 #define LED1_TASK_Prio      5   用到的UCOSII函数 消息邮箱创建函数:  OS_EVENT  *OSMboxCreate (void *msg) 请求消息邮箱函数:   void  *OSMboxPend (OS_EVENT *pevent, INT16U tim

//设置任务优先级

t0184c9caf027793522.jpg
#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);}}