Ucosii消息邮箱使用

来源:互联网 发布:创维酷开电视直播软件 编辑:程序博客网 时间:2024/05/02 00:17

//设置任务优先级
#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?
  1. OS_EVENT *Str_Box;  
  2.   
  3.   
  4. Str_Box = OSMboxCreate ((void*)0);  //创建消息邮箱  
  5. //任务1  
  6. //控制DS0的亮灭.  
  7. void TaskLed(voidvoid *pdata)  
  8. {   u8 result=0;  
  9.     while(1)  
  10.     {   result= *((u8 *)OSMboxPend(Str_Box,0,&err)); //请求消息邮箱  
  11.         if(result ==1||result ==3){   
  12.           LED0=!LED0;  
  13.         }  
  14.         OSTimeDlyHMSM(0,0,0,200);     
  15.     }  
  16. }  
  17.   
  18. //任务3  
  19. //按键检测    
  20.  void TaskKey(voidvoid *pdata)  
  21.  {  
  22.     u8  key=0,i=0;  
  23.      
  24.     while(1){  
  25.       key=KEY_Scan();  
  26.       if(key==1)   
  27.       {  
  28.        i=1;  
  29.        OSMboxPost(Str_Box,&i); //发送消息1     //注意:消息邮箱的要发送的数据变量可以是临时变量!!!因为这个临时变量在任务生存期间一直存在
  30.       }  
  31.       else if(key==2)  
  32.       {  
  33.        i=2;  
  34.        OSMboxPost(Str_Box,&i); //发送消息2       //注意:消息邮箱的要发送的数据变量可以是临时变量!!!
  35.               
  36.       }               
  37.       else if(key==3)  
  38.       {   
  39.        i=3;  
  40.        OSMboxPostOpt(Str_Box,&i,OS_POST_OPT_BROADCAST); //向所有任务广播消息3       //注意:消息邮箱的要发送的数据变量可以是临时变量!!!
  41.       }  
  42.       OSTimeDlyHMSM(0,0,0,20);         
  43.     }  
  44.  }  
原创粉丝点击