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

下面给出消息邮箱的使用例程

OS_EVENT *Str_Box;


Str_Box = OSMboxCreate ((void*)0);	//创建消息邮箱
//任务1
//控制DS0的亮灭.
void TaskLed(void *pdata)
{	u8 result=0;
	while(1)
	{	result= *((u8 *)OSMboxPend(Str_Box,0,&err)); //请求消息邮箱
		if(result ==1||result ==3){ 
		  LED0=!LED0;
		}
		OSTimeDlyHMSM(0,0,0,200);	
	}
}

//任务3
//按键检测  
 void TaskKey(void *pdata)
 {
 	u8  key=0,i=0;
   
    while(1){
	  key=KEY_Scan();
	  if(key==1) 
	  {
 	   i=1;
	   OSMboxPost(Str_Box,&i); //发送消息1
	  }
	  else if(key==2)
	  {
	   i=2;
	   OSMboxPost(Str_Box,&i); //发送消息2
	    	
	  }				
	  else if(key==3)
	  {	
	   i=3;
	   OSMboxPostOpt(Str_Box,&i,OS_POST_OPT_BROADCAST); //向所有任务广播消息3
 	  }
	  OSTimeDlyHMSM(0,0,0,20);		 
	}
 }



 

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值