- 或同步——等待多个事件发生,任何一个事件发生,任务就发生(同步)
- 与同步——等待多个事件发生,当所有事件都发生,任务就发生(同步)
使用方法
- OSFlagCreate() 创建事件标志组
- OSFlagPend()
等待事件标志 - OSFlagPost()
向事件标志组发布标志
void OSFlagCreate(OS_FLAG_GRP
OS_FLAGS
opt
OS_FLAGS
opt
使用实例
#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);
}
}
实验结果