ucos II 任務間同步原始碼分析(二)

2021-08-28 10:41:41 字數 1453 閱讀 5471

事件標誌組也是任務同步的一種機制,它實現的同步機制是針對多個條件,因此類似event但引入了乙個flag變數,假設這個flag是個int8u,那麼其0x00010010每個bit位的1或者0表示乙個條件的滿足或不滿足。

事件標誌組管理的全域性變數(下述變數在os_flaginit中初始化):

typedef struct  os_flag_grp;
os_ext  os_flag_grp       osflagtbl[os_max_flags];  /* table containing event flag groups  */

os_ext os_flag_grp *osflagfreelist; /* pointer to free list of event flag groups */

在每個任務的os_tcb結構體中由成員:

os_flag_node  *ostcbflagnode; /* pointer to event flag node */
typedef struct  os_flag_node;
事件標誌組管理的主要函式分析:

建立乙個事件標誌組 osflagcreate:初始化乙個os_flag_grp資源,儲存乙個flag的初始值至osflagflags成員;

等待事件組的事件標誌位 os_flags  osflagpend (os_flag_grp *pgrp, os_flags flags, int8u wait_type, int16u timeout, int8u *err) ,函式處理如下:

引數wait_type表示等待flag的型別,包括os_flag_wait_clr_all(等待所有的標誌清0),os_flag_wait_clr_any(等待任一標誌位清0),os_flag_wait_set_all(等待所有標誌位置1),os_flag_wait_set_any(等待任一標誌置1)。當選擇方式為「任一」時,引數flags指示該位。

根據wait_type比較osflagflags的值,如果滿足條件則返回;

否則,呼叫函式os_flagblock,該函式中將當前任務的狀態置位為os_stat_flag,並且將自己新增在事件標誌組的等待佇列中;

置位或清0乙個標誌組中的標誌位 os_flags  osflagpost (os_flag_grp *pgrp, os_flags flags, int8u opt, int8u *err),函式處理如下:

根據入參opt和flags重新對pgrp->osflagflags進行置位;

遍歷pgrp->osflagwaitlist,查詢事件標誌組的等待任務,判斷此時是否有任務滿足標誌位要求;

若有滿足,呼叫os_flagtaskrdy,將該任務由os_stat_flag狀態改為os_stat_rdy,從等待佇列中刪除該任務;

呼叫os_sched(),觸發重新排程;

ucos II 任務間通訊原始碼分析

ucos ii 2.0版本的任務間通訊提供訊息郵箱和訊息佇列兩種機制,都基於核心的事件控制塊機制實現。訊息郵箱 訊息郵箱主要函式分析 訊息佇列 訊息佇列全域性變數 typedef struct os q os q typedef struct os q data os ext os q osqfre...

uC OS II原始碼分析(四)

核心結構 1,臨界區,os enter critical 和os exit critical 為了處理臨界區 必須關中斷,等處理完畢後,再開中斷。關中斷可以避免其他任務或中斷進入臨界區 uc os ii 定義了這兩個巨集來實現,但注意一條 呼叫 uc os ii 功能函式時,中斷應該總是開著的。1 ...

uC OS II原始碼解析 includes h

ver 2.52 file includes.h brief 標頭檔案集合,其他.c檔案都會包括該標頭檔案 include 包含 stdio.h c標準函式庫標頭檔案 include 包含 string.h c標準函式庫標頭檔案 include 包含 ctype.h c標準函式庫標頭檔案 inclu...