标签:style blog http color io os 使用 ar strong
使用情况
当任务需要与多个事件的发生同步,可以使用事件标志组。有两种情况:
使用方法
事件标志组服务函数的实现代码在os_flag.c文件中,在编译时,将os_cfg.h文件中的配置常数OS_CFG_FLAG+EN设为1就可启用这些服务函数。
常用的事件标志组的服务函数有:
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 清零
使用实例
1 #define APP_TASK_START_PRIO 4u 2 #define APP_TASK_1_PRIO 5u 3 #define APP_TASK_2_PRIO 6u 4 #define APP_TASK_3_PRIO 7u 5 6 7 #define APP_TASK_START_STK_SIZE 256u 8 #define APP_TASK_1_STK_SIZE 256u 9 #define APP_TASK_2_STK_SIZE 256u 10 #define APP_TASK_3_STK_SIZE 256u 11 12 13 #define TASK1 (OS_FLAGS)0x0003 14 #define TASK2 (OS_FLAGS)0x0001 15 #define TASK3 (OS_FLAGS)0x0002 16 17 18 static OS_TCB AppTaskStartTCB; 19 static OS_TCB AppTask1TCB; 20 static OS_TCB AppTask2TCB; 21 static OS_TCB AppTask3TCB; 22 23 24 static OS_FLAG_GRP MyFLAGGRP; 25 26 27 static CPU_STK AppTaskStartStk[APP_TASK_START_STK_SIZE]; 28 static CPU_STK AppTask1Stk[APP_TASK_1_STK_SIZE]; 29 static CPU_STK AppTask2Stk[APP_TASK_2_STK_SIZE]; 30 static CPU_STK AppTask3Stk[APP_TASK_3_STK_SIZE]; 31 32 33 static void AppTaskStart(void *p_arg); 34 void AppTask1(void *p_arg); 35 void AppTask2(void *p_arg); 36 void AppTask3(void *p_arg); 37 38 39 40 41 int main (void) 42 { 43 OS_ERR err; 44 45 46 47 48 OSInit(&err); 49 50 51 OSFlagCreate(&MyFLAGGRP, 52 "MyFLAGGRP", 53 (OS_FLAGS)0, 54 &err); 55 56 57 OSTaskCreate((OS_TCB *)&AppTaskStartTCB, 58 (CPU_CHAR *)"App Task Start", 59 (OS_TASK_PTR ) AppTaskStart, 60 (void *) 0, 61 (OS_PRIO ) APP_TASK_START_PRIO, 62 (CPU_STK *)&AppTaskStartStk[0], 63 (CPU_STK_SIZE) APP_TASK_START_STK_SIZE / 10u, 64 (CPU_STK_SIZE) APP_TASK_START_STK_SIZE, 65 (OS_MSG_QTY ) 0u, 66 (OS_TICK ) 0u, 67 (void *) 0, 68 (OS_OPT )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR), 69 (OS_ERR *)&err); 70 71 72 OSStart(&err); 73 } 74 75 76 static void AppTaskStart (void *p_arg) 77 { 78 OS_ERR err; 79 80 81 82 83 (void)p_arg; 84 85 86 CPU_Init(); 87 88 89 OSTaskCreate((OS_TCB *)&AppTask1TCB, 90 (CPU_CHAR *)"AppTask1", 91 (OS_TASK_PTR)AppTask1, 92 (void *)0, 93 (OS_PRIO)APP_TASK_1_PRIO, 94 (CPU_STK *)&AppTask1Stk[0], 95 (CPU_STK_SIZE)APP_TASK_1_STK_SIZE / 10u, 96 (CPU_STK_SIZE)APP_TASK_1_STK_SIZE, 97 (OS_MSG_QTY)0u, 98 (OS_TICK)0u, 99 (void *)0, 100 (OS_OPT)(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR), 101 (OS_ERR *)&err); 102 OSTaskCreate((OS_TCB *)&AppTask2TCB, 103 (CPU_CHAR *)"AppTask2", 104 (OS_TASK_PTR)AppTask2, 105 (void *)0, 106 (OS_PRIO)APP_TASK_2_PRIO, 107 (CPU_STK *)&AppTask2Stk[0], 108 (CPU_STK_SIZE)APP_TASK_2_STK_SIZE / 10u, 109 (CPU_STK_SIZE)APP_TASK_2_STK_SIZE, 110 (OS_MSG_QTY)0u, 111 (OS_TICK)0u, 112 (void *)0, 113 (OS_OPT)(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR), 114 (OS_ERR *)&err); 115 OSTaskCreate((OS_TCB *)&AppTask3TCB, 116 (CPU_CHAR *)"AppTask3", 117 (OS_TASK_PTR)AppTask3, 118 (void *)0, 119 (OS_PRIO)APP_TASK_3_PRIO, 120 (CPU_STK *)&AppTask3Stk[0], 121 (CPU_STK_SIZE)APP_TASK_3_STK_SIZE / 10u, 122 (CPU_STK_SIZE)APP_TASK_3_STK_SIZE, 123 (OS_MSG_QTY)0u, 124 (OS_TICK)0u, 125 (void *)0, 126 (OS_OPT)(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR), 127 (OS_ERR *)&err); 128 } 129 130 131 void AppTask1(void *p_arg) 132 { 133 OS_ERR err; 134 CPU_TS ts; 135 136 137 (void)p_arg; 138 139 140 while (DEF_ON){ 141 OSFlagPend(&MyFLAGGRP, 142 TASK1, 143 (OS_TICK)0, 144 (OS_OPT)OS_OPT_PEND_FLAG_SET_ALL+OS_OPT_PEND_FLAG_CONSUME, 145 &ts, 146 &err); 147 APP_TRACE_DBG(("Task1 is running...\n\r")); 148 OSTimeDlyHMSM(0, 0, 1, 0, OS_OPT_TIME_DLY, &err); 149 } 150 } 151 152 153 void AppTask2(void *p_arg) 154 { 155 OS_ERR err; 156 157 158 (void)p_arg; 159 160 161 while (DEF_ON){ 162 APP_TRACE_DBG(("Task2 is running...\n\r")); 163 OSFlagPost(&MyFLAGGRP, 164 TASK2, 165 OS_OPT_POST_FLAG_SET, 166 &err); 167 OSTimeDlyHMSM(0, 0, 1, 0, OS_OPT_TIME_DLY, &err); 168 } 169 } 170 171 172 void AppTask3(void *p_arg) 173 { 174 OS_ERR err; 175 (void)p_arg; 176 while (DEF_ON){ 177 APP_TRACE_DBG(("Task3 is running...\n\r"/*,OSTimeGet(&err)*/)); 178 OSFlagPost(&MyFLAGGRP, 179 TASK3, 180 OS_OPT_POST_FLAG_SET, 181 &err); 182 OSTimeDlyHMSM(0, 0, 1, 0, OS_OPT_TIME_DLY, &err); 183 } 184 }
实验结果
标签:style blog http color io os 使用 ar strong
原文地址:http://www.cnblogs.com/chenliang826380678/p/chenliang1.html