UCOSIII事件標誌組和同時等待多個核心物件
阿新 • • 發佈:2019-01-23
1.1事件標誌組:
有時候一個任務需要與多個事件同步,這個時候就需要使用事件標誌組。事件標誌組與任務之間有兩種同步機制:“或”同步和“與”同步。
“或”同步:等待多個事件時,任何一個事件發生 ,任務都被同步,這個就稱為“或”同步。
“與”同步:當所有的事件都發生時任務才被同步,這種同步機制被稱為“與”同步。
在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; };
1.2、事件標誌組API函式:
函式名 |
作用 |
OSFlagCreate() |
建立事件標誌組 |
OSFlagDel() |
刪除事件標誌組 |
OSFlagPend() |
等待事件標誌組 |
OSFlagPendAbort() |
取消等待事件標誌 |
OSFlagPendGetFlagsRdy() |
獲取使任務就緒的事件標誌 |
OSFlagPost() |
向事件標誌組釋出標誌 |
1.2.1 建立事件標誌組
void OSFlagCreate (OS_FLAG_GRP *p_grp,//事件標誌組 OS_FLAG_GRP EventFlag
CPU_CHAR *p_name,//事件標誌組名字
OS_FLAGS flags,//定義事件標誌組的名字
OS_ERR *p_err)
1.2.2 等待事件標誌組
OS_FLAGS OSFlagPend (OS_FLAG_GRP *p_grp,//事件標誌組 OS_FLAGS flags,//bit序列,把對應序列置1 OS_TICK timeout,//超時時間,同訊號量 OS_OPT opt,//決定任務等待的條件,四個選項可選 CPU_TS *p_ts,//指向時間戳,記錄傳送、終止等事件時刻 OS_ERR *p_err)
1.2.3 向事件標誌組釋出標誌
OS_FLAGS OSFlagPost (OS_FLAG_GRP *p_grp,//指向事件標誌組
OS_FLAGS flags,//決定對哪些位清零和置位
OS_OPT opt,//決定對標誌位的操作,有兩種選項
OS_ERR *p_err)
2.1、同時等待多個核心物件
前面我們講過都是等待單個核心物件,包括:訊號量、互斥訊號量、訊息佇列和事件標誌組。在UCOSIII中允許任務同時等待多個訊號量和多個訊息佇列,也就是說,UCOSIII不支援同時等待多個事件標誌組或互斥訊號量。
一個任務可以等待任意數量的訊號量和訊息佇列,第一個訊號量或訊息佇列的釋出會導致該任務進入就緒態。
2.2、OSPendMulti()函式:等待多個核心物件
一個任務可以呼叫函式OSPendMulti()函式來等待多個物件,並且可以根據需要指定一個等待超時值,函式OSPendMulti()原型如下:
OS_OBJ_QTY OSPendMulti (OS_PEND_DATA *p_pend_data_tbl,//指向OS_PEND_DATA表的指標
OS_OBJ_QTY tbl_size,//表p_pend_data_tbl的大小:核心物件數量
OS_TICK timeout,//超時時間
OS_OPT opt,//選擇是否使用阻塞模式,兩個選項
OS_ERR *p_err)
在呼叫函式OSPendMulti()之前我們需要先初始化OS_PEND_DATA陣列,陣列的大小取決於任務同時等待的核心物件的總數量。
2.3、初始化OS_PEND_DATA陣列
2.3.1、定義核心物件,如下:
OS_SEM Test_Sem1; //訊號量1
OS_SEM Test_Sem2; //訊號量2
OS_Q Test_Q; //訊息佇列
2.3.2、初始化OS_PEND_DATA陣列
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;