概要
当某任务要与多个事件同步时,使用事件标志组。
同步方式又分为独立型同步和关联型同步。
独立型同步下图表示:事件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
);
}
}
```