本文内容简介: 一共分为三部分: 第一部分:事件标志组,用于等待多个事件 第二部分:同时等待多个内核对象,比如同时等待多个信号量 第三部分:存储管理,ucosIII提供的存储管理很容易内存泄露,建议直接使用正点原子提供的内存管理。 |
有时候一个任务需要与多个事件同步,这个时候就需要使用事件标志组。事件标志组与任务之间有两种同步机制:“或”同步和“与”同步。
“或”同步:等待多个事件时,任何一个事件发生 ,任务都被同步,这个就称为“或”同步。
“与”同步:当所有的事件都发生时任务才被同步,这种同步机制被称为“与”同步。
在UCOSIII中事件标志组为OS_FLAG_GRP,如果需要使用事件标志组的时候需要将宏OS_CFG_FLAG_EN置1
事件标志组结构体
struct os_flag_grp {
OS_OBJ_TYPE Type;
CPU_CHAR *NamePtr;
OS_PEND_LIST PendList;
#if OS_CFG_DBG_EN > 0u
OS_FLAG_GRP *DbgPrevPtr;
OS_FLAG_GRP *DbgNextPtr;
CPU_CHAR *DbgNamePtr;
#endif
OS_FLAGS Flags;
CPU_TS TS;
};
OS_FLAG_GRP EventFlags;
OSFlagCreate((OS_FLAG_GRP*)&EventFlags,
(CPU_CHAR* )"Event Flags",
(OS_FLAGS )KEYFLAGS_VALUE,
(OS_ERR* )&err);
flags_num=OSFlagPost((OS_FLAG_GRP*)&EventFlags,
(OS_FLAGS )KEY0_FLAG,
(OS_OPT )OS_OPT_POST_FLAG_SET,
(OS_ERR* )&err);
OSFlagPend((OS_FLAG_GRP*)&EventFlags,
(OS_FLAGS )KEY0_FLAG+KEY1_FLAG,
(OS_TICK )0,
(OS_OPT )OS_OPT_PEND_FLAG_SET_ALL+OS_OPT_PEND_FLAG_CONSUME,
(CPU_TS* )0,
(OS_ERR* )&err);
OS_OBJ_QTY index;
OS_PEND_DATA pend_multi_tbl[CORE_OBJ_NUM];
pend_multi_tbl[0].PendObjPtr=(OS_PEND_OBJ*)&Test_Sem1;
pend_multi_tbl[1].PendObjPtr=(OS_PEND_OBJ*)&Test_Sem2;
pend_multi_tbl[2].PendObjPtr=(OS_PEND_OBJ*)&Test_Q;
index=OSPendMulti((OS_PEND_DATA* )pend_multi_tbl,
(OS_OBJ_QTY )CORE_OBJ_NUM,
(OS_TICK )0,
(OS_OPT )OS_OPT_PEND_BLOCKING,
(OS_ERR* )&err);
因为ucosIII自带的存储管理很不好,所以建议不使用内带的内存管理。