一 事件标志组相关函数
创建事件标志组 | OSFlagCreate() | OS_CFG_FLAG_EN | OS_FLAG_GRP EngineStatus; OS_ERR err; OSFlagCreate(&EngineStatus, |
删除事件标志组 | OSFlagDel() | OS_CFG_FLAG_EN OS_CFG_FLAG_DEL_EN | OS_FLAG_GRP Flags; OS_ERR err; qty = OSFlagDel(&Flags, |
等待事件标志组 | OSFlagPend() | OS_CFG_FLAG_EN | OS_FLAG_GRP EngineStatus; OS_ERR err; OSFlagPend(&EngineStatus,0x01, |
取消等待事件标志组 | OSFlagPendAbort() | OS_CFG_FLAG_EN OS_CFG_FLAG_PEND_ABORT_EN | OS_FLAG_GRP EngineStatus; OS_ERR err; nbr_tasks = OSFlagPendAbort(&EngineStatus, |
获取使任务就绪的事件标志 | OSFlagPendGetFlagsRdy() | OS_CFG_FLAG_EN | OS_ERR err; flags_rdy = OSFlagPendGetFlagsRdy(&err); |
向事件标志组发布标志 | OSFlagPost() | OS_CFG_FLAG_EN | OS_FLAG_GRP EngineStatusFlags; OS_ERR err; flags = OSFlagPost(&EngineStatusFlags, |
二 使用时间标志组
一个任务可能需要和多个事件同步,这个时候就需要使用事件标志组
下面是使用事件标志组的例子:
OS_FLAG_GRP flag_grp; //声明事件标志组
#define BIT0_EVENT (0x01 << 0)//设置事件掩码的位 0
#define BIT1_EVENT (0x01 << 1)//设置事件掩码的位 1
OSFlagCreate ((OS_FLAG_GRP *)&flag_grp, //指向事件标志组的指针
(CPU_CHAR *)"FLAG For Test", //事件标志组的名字
(OS_FLAGS )0, //事件标志组的初始值
(OS_ERR *)&err); //返回错误类型
void flag_grp0_task(void *p_arg)
{
OS_ERR err;
p_arg = p_arg;
while(1)
{
OSFlagPost ((OS_FLAG_GRP *)&flag_grp,
(OS_FLAGS )BIT0_EVENT, //将标志组的 BIT0 置 1
(OS_OPT )OS_OPT_POST_FLAG_SET,
(OS_ERR *)&err);
OSFlagPost ((OS_FLAG_GRP *)&flag_grp,
(OS_FLAGS )BIT1_EVENT,//将标志组的 BIT1 置 1
(OS_OPT )OS_OPT_POST_FLAG_SET,
(OS_ERR *)&err);
OSTimeDly (1000, OS_OPT_TIME_DLY, &err );//延时
}
}
void flag_grp1_task(void *p_arg)
{
OS_ERR err;
OS_FLAGS flags_rdy;
p_arg = p_arg;
while(1)
{
//等待标志组的的 BIT0 和 BIT1 均被置 1
flags_rdy = OSFlagPend ((OS_FLAG_GRP *)&flag_grp,
(OS_FLAGS )( BIT0_EVENT | BIT1_EVENT ),
(OS_TICK )0,
(OS_OPT)OS_OPT_PEND_FLAG_SET_ALL |
OS_OPT_PEND_BLOCKING |
OS_OPT_PEND_FLAG_CONSUME,
(CPU_TS *)0,
(OS_ERR *)&err);
if ((flags_rdy & (BIT0_EVENT|BIT1_EVENT)) == (BIT0_EVENT|BIT1_EVENT))
{
/* 如果接收完成并且正确 */
printf ( "标志组的BIT0与BIT1 均被置 1\n");
}
OSTimeDly (1000, OS_OPT_TIME_DLY, &err );//延时
}
}