μC/OSIII——任务同步(事件标志组)

 使用情况

    当任务需要与多个事件的发生同步,可以使用事件标志组。有两种情况:

  1. 或同步——等待多个事件发生,任何一个事件发生,任务就发生(同步)
  2. 与同步——等待多个事件发生,当所有事件都发生,任务就发生(同步)

使用方法

    事件标志组服务函数的实现代码在os_flag.c文件中,在编译时,将os_cfg.h文件中的配置常数OS_CFG_FLAG+EN设为1就可启用这些服务函数。

    常用的事件标志组的服务函数有:

  • OSFlagCreate() 创建事件标志组
  • OSFlagPend()    等待事件标志
  • OSFlagPost()     向事件标志组发布标志

void OSFlagCreate(OS_FLAG_GRP  *p_grp,            指向事件标志组的指针

                               CPU_CHAR       *p_name,         字符串——事件标志组的名字

                               OS_FLAGS         flags,               事件标志组的初始值

                               OS_ERR             err)                  该函数返回的错误码

 

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)     该函数返回的错误码

opt  决定任务等待的条件

            OS_OPT_PEND_FLAG_CLR_ALL           等待标志组所有的标志清零

            OS_OPT_PEND_FLAG_CLR_ANY          等待标志组任意一个标志清零

            OS_OPT_PEND_FLAG_SET_ALL            等待标志组所有的标志置位

            OS_OPT_PEND_FLAG_SET_ANY          等待标志组任意一个标志置位

        辅助选项

            +OS_OPT_PEND_FLAG_CONSUME     等待条件满足后将对应的标志清零

            +OS_OPT_PEND_BLOCKING (OS_OPT_PEND_NON_BLOCKING)

            在标志组不满足条件时,任务选择挂起(不挂起)

 

OS_FLAGS OSFlagPost(OS_FLAG_GRP   *p_grp,     指向事件标志组的指针

                                     OS_FLAGS          flags,        决定对哪些标志位进行置位或清零

                                     OS_OPT             opt,

                                     OS_ERR              *p_err)     函数返回错误码

opt   OS_OPT_POST_FLAG_SET 置位  OS_OPT_POST_FLAG_CLR 清零

 

使用实例

#define  APP_TASK_START_PRIO                               4u
#define  APP_TASK_1_PRIO                                   5u
#define  APP_TASK_2_PRIO                                   6u
#define  APP_TASK_3_PRIO                                   7u

 

#define  APP_TASK_START_STK_SIZE                           256u
#define  APP_TASK_1_STK_SIZE                               256u
#define  APP_TASK_2_STK_SIZE                               256u
#define  APP_TASK_3_STK_SIZE                               256u

 

#define  TASK1 (OS_FLAGS)0x0003
#define  TASK2 (OS_FLAGS)0x0001
#define  TASK3 (OS_FLAGS)0x0002

 

static  OS_TCB   AppTaskStartTCB;
static  OS_TCB   AppTask1TCB;
static  OS_TCB   AppTask2TCB;
static  OS_TCB   AppTask3TCB;

 

static  OS_FLAG_GRP MyFLAGGRP;

 

static  CPU_STK  AppTaskStartStk[APP_TASK_START_STK_SIZE];
static  CPU_STK  AppTask1Stk[APP_TASK_1_STK_SIZE];
static  CPU_STK  AppTask2Stk[APP_TASK_2_STK_SIZE];
static  CPU_STK  AppTask3Stk[APP_TASK_3_STK_SIZE];

 

static  void  AppTaskStart(void  *p_arg);
void AppTask1(void *p_arg);
void AppTask2(void *p_arg);
void AppTask3(void *p_arg);

 

int  main (void)
{
    OS_ERR  err;


    OSInit(&err);

    OSFlagCreate(&MyFLAGGRP,
                           "MyFLAGGRP",
                           (OS_FLAGS)0,
                           &err);

    OSTaskCreate((OS_TCB     *)&AppTaskStartTCB,             
                           (CPU_CHAR   *)"App Task Start",
                           (OS_TASK_PTR ) AppTaskStart,
                           (void       *) 0,
                           (OS_PRIO     ) APP_TASK_START_PRIO,
                           (CPU_STK    *)&AppTaskStartStk[0],
                           (CPU_STK_SIZE) APP_TASK_START_STK_SIZE / 10u,
                           (CPU_STK_SIZE) APP_TASK_START_STK_SIZE,
                           (OS_MSG_QTY  ) 0u,
                           (OS_TICK     ) 0u,
                           (void       *) 0,
                           (OS_OPT      )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),
                           (OS_ERR     *)&err);

     OSStart(&err);

}

 

static  void  AppTaskStart (void *p_arg)
{
    OS_ERR  err;


    (void)p_arg;

    CPU_Init();

    OSTaskCreate((OS_TCB     *)&AppTask1TCB,               
                           (CPU_CHAR   *)"AppTask1",
                           (OS_TASK_PTR)AppTask1,
                           (void       *)0,
                           (OS_PRIO)APP_TASK_1_PRIO,
                           (CPU_STK    *)&AppTask1Stk[0],
                           (CPU_STK_SIZE)APP_TASK_1_STK_SIZE / 10u,
                           (CPU_STK_SIZE)APP_TASK_1_STK_SIZE,
                           (OS_MSG_QTY)0u,
                           (OS_TICK)0u,
                           (void       *)0,
                           (OS_OPT)(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),
                           (OS_ERR     *)&err);
    OSTaskCreate((OS_TCB     *)&AppTask2TCB,
                           (CPU_CHAR   *)"AppTask2",
                           (OS_TASK_PTR)AppTask2,
                           (void       *)0,
                           (OS_PRIO)APP_TASK_2_PRIO,
                           (CPU_STK    *)&AppTask2Stk[0],
                           (CPU_STK_SIZE)APP_TASK_2_STK_SIZE / 10u,
                           (CPU_STK_SIZE)APP_TASK_2_STK_SIZE,
                           (OS_MSG_QTY)0u,
                           (OS_TICK)0u,
                           (void       *)0,
                           (OS_OPT)(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),
                           (OS_ERR     *)&err);
    OSTaskCreate((OS_TCB     *)&AppTask3TCB,
                           (CPU_CHAR   *)"AppTask3",
                           (OS_TASK_PTR)AppTask3,
                           (void       *)0,
                           (OS_PRIO)APP_TASK_3_PRIO,
                           (CPU_STK    *)&AppTask3Stk[0],
                           (CPU_STK_SIZE)APP_TASK_3_STK_SIZE / 10u,
                           (CPU_STK_SIZE)APP_TASK_3_STK_SIZE,
                           (OS_MSG_QTY)0u,
                           (OS_TICK)0u,
                           (void       *)0,
                           (OS_OPT)(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),
                           (OS_ERR     *)&err);
}

 

void AppTask1(void *p_arg)
{
   OS_ERR  err;
   CPU_TS ts;

   (void)p_arg;

   while (DEF_ON){
       OSFlagPend(&MyFLAGGRP,
                            TASK1,
                            (OS_TICK)0,
                            (OS_OPT)OS_OPT_PEND_FLAG_SET_ALL+OS_OPT_PEND_FLAG_CONSUME

                            &ts,
                            &err);
       APP_TRACE_DBG(("Task1 is running...\n\r"));
       OSTimeDlyHMSM(0, 0, 1, 0, OS_OPT_TIME_DLY, &err);
     }
}

void AppTask2(void *p_arg)
{
   OS_ERR  err;

   (void)p_arg;

   while (DEF_ON){
      APP_TRACE_DBG(("Task2 is running...\n\r"));
      OSFlagPost(&MyFLAGGRP,
                          TASK2,
                          OS_OPT_POST_FLAG_SET,
                          &err);
      OSTimeDlyHMSM(0, 0, 1, 0, OS_OPT_TIME_DLY, &err);
 }
}

void AppTask3(void *p_arg)
{
    OS_ERR err;
    (void)p_arg;
    while (DEF_ON){
       APP_TRACE_DBG(("Task3 is running...\n\r"));
       OSFlagPost(&MyFLAGGRP,
                           TASK3,
                           OS_OPT_POST_FLAG_SET,
                           &err);
       OSTimeDlyHMSM(0, 0, 1, 0, OS_OPT_TIME_DLY, &err);
 }
}

 

实验结果





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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值