ucosiii之事件标志组
事件标志组
有时候一个任务需要多个事件同步时,就需要用到事件标志组了。
相关函数
一般情况下只用到OSFlagPost(),OSFlagPend(),OSFlagCreate()三个函数
OSFlagPost()函数的返回值是当前的事件标志组的事件标志位的值
//例子如下
//创建事件标志组
OS_FLAG_GRP 里有一个OS_FLAGS 是一个32位事件标志位,也就是说一个事件标志组可以同时标志32个事件
OS_FLAG_GRP EventFlags; //定义一个事件标志组
//创建一个事件标志组
OSFlagCreate((OS_FLAG_GRP*)&EventFlags, //指向事件标志组
(CPU_CHAR* )"Event_Flags", //名字
(OS_FLAGS )0, //事件标志组初始值
(OS_ERR* )&err); //错误码
//使用OSFlagPost函数
void EventPend_task(void *p_arg)
{
OS_FLAGS flags_num;
OS_ERR err;
while(1)
{
//向事件标志组EventFlags发送标志
flags_num=OSFlagPost((OS_FLAG_GRP*)&EventFlags,
(OS_FLAGS )0x01, //设置标志位对应的位的值,当前设置标志位的bit0位
(OS_OPT )OS_OPT_POST_FLAG_SET, //对事件标志位置1,如果OS_OPT_POST_FLAG_CLR则对事件标志位置0
(OS_ERR* )&err);
printf("事件标志组111111:%d\r\n",flags_num); //打印当前事件标志位的值
//向事件标志组EventFlags发送标志
flags_num=OSFlagPost((OS_FLAG_GRP*)&EventFlags,
(OS_FLAGS )0x02, //设置标志位对应的位,当前设置标志位的bit1位
(OS_OPT )OS_OPT_POST_FLAG_SET, /对事件标志位对应位置1,如果OS_OPT_POST_FLAG_CLR则对事件标志位对应位置0
(OS_ERR* )&err);
printf("事件标志组222222:%d\r\n",flags_num); //打印当前事件标志位的值
OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_PERIODIC,&err);
}
}
//使用OSFlagPend()事件请求函数
void EventPost_task(void *p_arg)
{
OS_ERR err;
while(1)
{
//等待事件标志组
OSFlagPend((OS_FLAG_GRP*)&EventFlags,
(OS_FLAGS )1+2, //事件标志位的bit0和bit1位为该事件的标志位,如果满足条件则执行,不满足则挂起
(OS_TICK )0,
(OS_OPT )OS_OPT_PEND_FLAG_SET_ALL+OS_OPT_PEND_FLAG_CONSUME, //当1+2的标志位被置位时,条件满足,OS_OPT_PEND_FLAG_CONSUME满足条件后标志位清0。OS_OPT_PEND_FLAG_SET_ALL:bit0和bit1都要满足条件
(CPU_TS* )0,
(OS_ERR* )&err);
printf("事件标志组Post:%d\r\n",EventFlags.Flags); //EventFlags.Flags事件标志组的标志位的值
}
}
//程序效果