1. 程式人生 > >UCOSIII事件標誌組和同時等待多個核心物件

UCOSIII事件標誌組和同時等待多個核心物件

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;