ucosII 事件标志组 使用总结

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/fengweibo112/article/details/89707667

概要

当某任务要与多个事件同步时,使用事件标志组。
同步方式又分为独立型同步和关联型同步。
独立型同步下图表示:事件1到事件n中,任意一个事件发生,则产生一个信号量到任务。
在这里插入图片描述
关联型同步下图表示:事件1到事件n中,所有事件都发生,则产生一个信号量到任务。
在这里插入图片描述

应用场景

例如:迅雷需要下载一部10集的连续剧,下载完成之后才执行“观看”动作。每一集电影下载时一个独立的事件,比如第3集下载完了,通过OSFlagPost()登记到事件组,不关心其它领友是否完成。等10集都登记完成过后,进入“观看”事件。

函数接口

OSFlagCreate(),OSFlagPend(),OSFlagPost(),这三个函数是事件标志组最基本的功能。
OSFlagAccept(),OSFlagDel(),OSFlagQuery(),这三个函数可以在OS_CFG.H中使能相应的功能。

使用实例

实现功能:当串口接收到"task1 suc"和"task2 suc"两条消息消息过后,执行应答"OK"

OS_FLAG_GRP *Sem_F;
void main(void)
{
 ...
 Sem_F = OSFlagCreate(0,&err);
 OSTaskCreate(Task1...);
 ...
}
void Task1(void *pdata)
{
    INT8U error;
    INT8U i=0;
    pdata = pdata;
    while(1)
    {    
         //若等待事件标志没有发生 该函数挂起该任务
        OSFlagPend(
                  Sem_F,             //请求信号量集
                  (OS_FLAGS)3,       //请求第0位和第1位信号
                  OS_FLAG_WAIT_SET_ALL,//且都置为1时为有效 否则任务挂在这里
                  0,                  //无限等待 直到收到为止
                  &error);
        //执行应答OK
        uartSend("OK");
        OSFlagPost(     //清除信号量0位和1位
	        os_flag,
	        (OS_FLAGS)3,    
	         OS_FLAG_CLR,    
	        &err
	         ); 
	  }
}
void uartHandle(char* str)
{
	 if(strstr(str,"task1 suc"))
	 {
	  OSFlagPost(     //发送信号量集
		  Sem_F,
		  (OS_FLAGS)1,    //给第0位发信号
		  OS_FLAG_SET,    //信号量置1
		  &error
		    );  
		 }
	 if(strstr(str,"task2 suc"))
	 {
	    OSFlagPost(     //发送信号量集
		       Sem_F,
		       (OS_FLAGS)2,    //给第1位发信号
		       OS_FLAG_SET,    //信号量置1
		       &error
		     );   
		 }
	}
	```
	

猜你喜欢

转载自blog.csdn.net/fengweibo112/article/details/89707667