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
    评论
本人原创,包括各个例程,希望与大家一起交流,转载请声明,谢谢! BSP文件夹为各类驱动,各个工程文件夹里的APP对应着各自的应用程序及配置。 注意,这些工程是在IAR 6.10.5下建立的,请使用该版本或更高的版本打开, 否则原有配置将被重置,编译时会出错。当然,如果你知道怎么配置的话,也 就无所谓了。 1、FirstLED 只是将官方的例程的管脚重新定义了一下, 另外将原来STM32的库函数由2.0升级为3.4。 现象是神舟IV号上的3个LED灯以0.5s的间隔闪烁; 2、Sem 为UCOS II信号量的使用提供一个参考       任务AppTaskKeyScan每50ms扫描KEY2状态,若KEY2按键按下,        则释放信号量激活任务AppTaskSem,使LED2状态反转 3、Mbox 为UCOS II邮箱使用提供一个参考        任务AppTaskKeyScan每50ms扫描KEY2状态,若KEY2按键按下,        则向邮箱发送1个字符,同时字符加1(即A->B->C...->Z->A),        任务AppTaskMbox当邮箱非空时获取邮箱内容并通过串口1输出。        有一个细节在此说明一下,本工程中AppTaskMbox的优先级比        AppTaskKeyScan的优先级高,这样保证了在字符递增前输出       即AppTaskMbox会抢占AppTaskKeyScan。这间接地说明了,        发送邮箱时是把内容的地址指针给了邮箱,而不是内容本身。        读者可以自己试着把两个任务优先调换,会发现,第1个字母        A将无法输出。 4、Mutex 为UCOS II互斥型信号量的使用提供一个参考        任务AppTaskKeyScan每50ms扫描KEY2状态,若KEY2按键按下,        则向邮箱发送1个字符,同时字符加1(即A->B->C...->Z->A),        任务AppTaskMbox当邮箱非空时获取邮箱内容并通过串口1输出。        由于AppTaskMbox的优先级比AppTaskKeyScan高,所以一旦        AppTaskKeyScan向邮箱发送了内容,系统会马上调度使 AppTaskMbox先运行。但本例中使用了互斥型信号量,在        互斥型信号量释放前,尽管AppTaskMbox优先级高,但并不        优先调度。读者可以这样进行验:该工程默认情况下使用互斥        型信号量,直接编译运行,可以看到串口先输出"Mutex Test"        而后输出字符'A'等;若将两个任务中的OSMutexPend,OSMutexPost 语句注释掉,则可以看到先输出字符后输出"Mutex Test" 5、Flag 为UCOS II事件标志组的使用提供一个参考,同时使用邮箱广播功能        任务AppTaskTx向邮箱广播发送1个字符,而后等待两个接收        任务接收完成并将相应的标志位置1,当相应位均置1后,        字符递增,并广播,如此循环。为了验证标志组的作用,        读者可试着将其中的一个接收任务的OSFlagPost注释后观察。 6、Queue 为UCOS II消息队列的使用提供一个参考        任务AppTaskKeyScan每50ms扫描KEY2状态,若KEY2按键按下,        通过消息队列发送消息"Key Down!",任务AppTaskQueue        将接收消息队列中的消息并通过串口输出。与邮箱类似,        消息队列也可广播,这里不具体示例,请读者自行编写程序 7、KeyExti 为UCOS II中断的使用提供一个参考        任务AppTaskKeyScan每50ms扫描KEY2状态,若KEY2按键按下,        通过消息队列发送消息"Key2 Down!",任务AppTaskQueue        将接收消息队列中的消息并通过串口输出。该工程使能了        外部中断0,与按键WAKEUP相连,当该按键按下时向消息        队列发送消息"Key Wakeup Down!"。可以看到,中断比扫描        更灵敏,按一次,有时会发送多次消息(因为没有消抖) 8、StackCheck 为UCOS II检查堆栈和CPU使用率提供一个参考 程序运行后,串口每隔1秒打印出每个任务的堆栈使用情况        和该程序的CPU使用率。若不想检查堆栈并打印,将宏定义        #define DEBUG_CHECK_STACK 注释掉即可。        任务需要运行足够长的时间,并要考虑各种情况,才能得到        正确数据。最后确定的堆栈大小,还须考虑今后的扩展,        一般多分配10%-25%,或者更多。如果系统对稳定性要求高,        则应该多1倍以上。通过堆栈检查操作,得到的是曾经被使用        过的堆栈区域的大小,而不可能得到完全精确的实际使用情况。        本例中,读者可以对比一下按键按下前后AppTaskQueue的        堆栈使用情况,可以发现有明显的区别。 CPU使用率的精度是1%.
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值