UCOSIII事件标志组

两种同步机制

“或”同步
“与”同步

使能

#define OS_CFG_FLAG_EN 1u /* Enable (1) or Disable (0) code generation for EVENT FLAGS */

主结构体

typedef struct os_flag_grp OS_FLAG_GRP;
struct  os_flag_grp {                          /* Event Flag Group */

    OS_OBJ_TYPE          Type;                 /* Should be set to OS_OBJ_TYPE_FLAG */
    CPU_CHAR            *NamePtr;              /* Pointer to Event Flag Name (NUL terminated ASCII) */
    OS_PEND_LIST         PendList;             /* List of tasks waiting on event flag group */
#if OS_CFG_DBG_EN > 0u
    OS_FLAG_GRP         *DbgPrevPtr;
    OS_FLAG_GRP         *DbgNextPtr;
    CPU_CHAR            *DbgNamePtr;
#endif

    OS_FLAGS             Flags;                /* 8, 16 or 32 bit flags */
    CPU_TS               TS;                   /* Timestamp of when last post occurred */
};

API函数

//创建
void OSFlagCreate (OS_FLAG_GRP *p_grp,
                   CPU_CHAR *p_name,
                   OS_FLAGS flags,
                   OS_ERR *p_err);

#if OS_CFG_FLAG_DEL_EN > 0u
//删除
OS_OBJ_QTY OSFlagDel (OS_FLAG_GRP *p_grp,
                      OS_OPT opt,
                      OS_ERR *p_err);
#endif

/*
* opt           specifies whether you want ALL bits to be set or ANY of the bits to be set.                                                                                                  
*               You can specify the 'ONE' of the following arguments:
*
*                   OS_OPT_PEND_FLAG_CLR_ALL   You will wait for ALL bits in 'flags' to be clear (0) 
*                   OS_OPT_PEND_FLAG_CLR_ANY   You will wait for ANY bit  in 'flags' to be clear (0) 
*                   OS_OPT_PEND_FLAG_SET_ALL   You will wait for ALL bits in 'flags' to be set   (1) 
*                   OS_OPT_PEND_FLAG_SET_ANY   You will wait for ANY bit  in 'flags' to be set   (1) 
*
*               You can 'ADD' OS_OPT_PEND_FLAG_CONSUME if you want the event flag to be 'consumed' by
*                         the call.  Example, to wait for any flag in a group AND then clear
*                         the flags that are present, set 'wait_opt' to: 
*
*                         OS_OPT_PEND_FLAG_SET_ANY + OS_OPT_PEND_FLAG_CONSUME
*
*               You can also 'ADD' the type of pend with 'ONE' of the two option:
*
*                   OS_OPT_PEND_NON_BLOCKING   Task will NOT block if flags are not available
*                   OS_OPT_PEND_BLOCKING       Task will     block if flags are not available
*/
//等待-1
OS_FLAGS OSFlagPend (OS_FLAG_GRP *p_grp,
                     OS_FLAGS flags,
                     OS_TICK timeout,
                     OS_OPT opt,
                     CPU_TS *p_ts,
                     OS_ERR *p_err);

#if OS_CFG_FLAG_PEND_ABORT_EN > 0u
//取消等待
OS_OBJ_QTY OSFlagPendAbort (OS_FLAG_GRP *p_grp,
                            OS_OPT opt,
                            OS_ERR *p_err);
#endif

//获取使任务就绪的事件标志
OS_FLAGS OSFlagPendGetFlagsRdy (OS_ERR *p_err);

//发送+1
OS_FLAGS OSFlagPost (OS_FLAG_GRP *p_grp,
                     OS_FLAGS flags,
                     OS_OPT opt,
                     OS_ERR *p_err);

应用举例

#define FLAG1       (1 << 0)
#define FLAG2       (1 << 1)
OS_FLAG_GRP EventFlags;     //定义一个事件标志组

void task1(void *p_arg)
{
    while(1)
    {
        //向事件标志组EventFlags发送标志
        flags_num=OSFlagPost((OS_FLAG_GRP*)&EventFlags,
                             (OS_FLAGS    )FLAG1,
                             (OS_OPT      )OS_OPT_POST_FLAG_SET,
                             (OS_ERR*     )&err);
        printf("task1事件标志组EventFlags的值:%d\r\n",flags_num);

        OSTimeDlyHMSM(0,0,2,0,OS_OPT_TIME_PERIODIC,&err);

        //向事件标志组EventFlags发送标志
        flags_num=OSFlagPost((OS_FLAG_GRP*)&EventFlags,
                             (OS_FLAGS    )FLAG2,
                             (OS_OPT      )OS_OPT_POST_FLAG_SET,
                             (OS_ERR*     )&err);
        printf("task1事件标志组EventFlags的值:%d\r\n",flags_num);

        OSTimeDlyHMSM(0,0,2,0,OS_OPT_TIME_PERIODIC,&err);
    }
}

void task2(void *p_arg)
{
    while(1)
    {
        //等待事件标志组
        OSFlagPend((OS_FLAG_GRP*)&EventFlags,
                   (OS_FLAGS    )FLAG1|FLAG2,
                   (OS_TICK     )0,
                   (OS_OPT      )OS_OPT_PEND_FLAG_SET_ALL+OS_OPT_PEND_FLAG_CONSUME,
                   (CPU_TS*     )0,
                   (OS_ERR*     )&err);
        printf("task2事件标志组EventFlags的值:%d\r\n",EventFlags.Flags);
    }
}

实验现象
1

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值