一 事件標誌組相關函數
創建事件標誌組 | OSFlagCreate() | OS_CFG_FLAG_EN |
OS_FLAG_GRP EngineStatus; OS_ERR err; OSFlagCreate(&EngineStatus, |
刪除事件標誌組 | OSFlagDel() |
OS_CFG_FLAG_EN OS_CFG_FLAG_DEL_EN |
OS_FLAG_GRP Flags; OS_ERR err; qty = OSFlagDel(&Flags, |
等待事件標誌組 | OSFlagPend() | OS_CFG_FLAG_EN |
OS_FLAG_GRP EngineStatus; OS_ERR err; OSFlagPend(&EngineStatus,0x01, |
取消等待事件標誌組 | OSFlagPendAbort() |
OS_CFG_FLAG_EN OS_CFG_FLAG_PEND_ABORT_EN |
OS_FLAG_GRP EngineStatus; OS_ERR err; nbr_tasks = OSFlagPendAbort(&EngineStatus, |
獲取使任務就緒的事件標誌 | OSFlagPendGetFlagsRdy() | OS_CFG_FLAG_EN |
OS_ERR err; flags_rdy = OSFlagPendGetFlagsRdy(&err); |
向事件標誌組發佈標誌 | OSFlagPost() | OS_CFG_FLAG_EN |
OS_FLAG_GRP EngineStatusFlags; OS_ERR err; flags = OSFlagPost(&EngineStatusFlags, |
二 使用時間標誌組
一個任務可能需要和多個事件同步,這個時候就需要使用事件標誌組
下面是使用事件標誌組的例子:
OS_FLAG_GRP flag_grp; //聲明事件標誌組
#define BIT0_EVENT (0x01 << 0)//設置事件掩碼的位 0
#define BIT1_EVENT (0x01 << 1)//設置事件掩碼的位 1
OSFlagCreate ((OS_FLAG_GRP *)&flag_grp, //指向事件標誌組的指針
(CPU_CHAR *)"FLAG For Test", //事件標誌組的名字
(OS_FLAGS )0, //事件標誌組的初始值
(OS_ERR *)&err); //返回錯誤類型
void flag_grp0_task(void *p_arg)
{
OS_ERR err;
p_arg = p_arg;
while(1)
{
OSFlagPost ((OS_FLAG_GRP *)&flag_grp,
(OS_FLAGS )BIT0_EVENT, //將標誌組的 BIT0 置 1
(OS_OPT )OS_OPT_POST_FLAG_SET,
(OS_ERR *)&err);
OSFlagPost ((OS_FLAG_GRP *)&flag_grp,
(OS_FLAGS )BIT1_EVENT,//將標誌組的 BIT1 置 1
(OS_OPT )OS_OPT_POST_FLAG_SET,
(OS_ERR *)&err);
OSTimeDly (1000, OS_OPT_TIME_DLY, &err );//延時
}
}
void flag_grp1_task(void *p_arg)
{
OS_ERR err;
OS_FLAGS flags_rdy;
p_arg = p_arg;
while(1)
{
//等待標誌組的的 BIT0 和 BIT1 均被置 1
flags_rdy = OSFlagPend ((OS_FLAG_GRP *)&flag_grp,
(OS_FLAGS )( BIT0_EVENT | BIT1_EVENT ),
(OS_TICK )0,
(OS_OPT)OS_OPT_PEND_FLAG_SET_ALL |
OS_OPT_PEND_BLOCKING |
OS_OPT_PEND_FLAG_CONSUME,
(CPU_TS *)0,
(OS_ERR *)&err);
if ((flags_rdy & (BIT0_EVENT|BIT1_EVENT)) == (BIT0_EVENT|BIT1_EVENT))
{
/* 如果接收完成並且正確 */
printf ( "標誌組的BIT0與BIT1 均被置 1\n");
}
OSTimeDly (1000, OS_OPT_TIME_DLY, &err );//延時
}
}