1. 程式人生 > >ucos ii的事件標誌組原理分析

ucos ii的事件標誌組原理分析

很早以前就開始學習移植USOS ii了,移植倒沒什麼難的,主要是要清楚自己的微控制器,最好是將啟動程式碼分析一遍,那麼在移植的時候,很多概念就不會陌生了。我用的是

stm32f103ze.

移植完了之後,就不知道幹嘛了,於是中間擱置了很久,這幾天又想到這個系統,於是又重新移植了一遍,把程式碼結構又明晰了一點,這次我就想,要把這個作業系統弄清楚。

那麼切入正題吧,我是先從事件標誌組開始分析的。首先看幾個資料結構和資料型別:

typedef struct os_flag_grp {                /* Event Flag Group                                        */
    INT8U         OSFlagType;               /* Should be set to OS_EVENT_TYPE_FLAG                     */
    void         *OSFlagWaitList;           /* Pointer to first NODE of task waiting on event flag     */
    OS_FLAGS      OSFlagFlags;              /* 8, 16 or 32 bit flags                                   */
#if OS_FLAG_NAME_EN > 0u
    INT8U        *OSFlagName;
#endif
} OS_FLAG_GRP;

在使用時間標誌組之前,都要先宣告這樣一個變數,然後使用OSFlagCreate函式來初始化這個變數。

初始化這個變數之後,比如說任務一TASK1要等待這個事件標誌組的某幾位,就要使用OSFlagPend函式來進行這個操作,這個函式首先比較你要等待的標誌位和事件標誌組的標誌位是否吻合,吻合就直接返回成功,不吻合,就呼叫OS_FlagBlock函式,在這個函式裡:

主要目的是將等待事件標誌組這個狀態更新到當前任務的任務控制塊裡,然後設定好等待時間,如果設定成0,則表示無限等待。此時又用到了另外一個數據型別:

typedef struct os_flag_node {               /* Event Flag Wait List Node                               */
    void         *OSFlagNodeNext;           /* Pointer to next     NODE in wait list                   */
    void         *OSFlagNodePrev;           /* Pointer to previous NODE in wait list                   */
    void         *OSFlagNodeTCB;            /* Pointer to TCB of waiting task                          */
    void         *OSFlagNodeFlagGrp;        /* Pointer to Event Flag Group                             */
    OS_FLAGS      OSFlagNodeFlags;          /* Event flag to wait on                                   */
    INT8U         OSFlagNodeWaitType;       /* Type of wait:                                           */
                                            /*      OS_FLAG_WAIT_AND                                   */
                                            /*      OS_FLAG_WAIT_ALL                                   */
                                            /*      OS_FLAG_WAIT_OR                                    */
                                            /*      OS_FLAG_WAIT_ANY                                   */
} OS_FLAG_NODE;

OS_FlagBlock函式裡,使用你呼叫OSFlagPend函式時的引數對OS_FLAG_NODE變數進行填充,然後將這個node連線到OS_FLAG_GRP的OSFlagWaitList上,很多工都可以同時對同一個OS_FLAG_GRP使用OSFlagPend函式,那麼,也就是都有可能同時使用OS_FlagBlock函式,這樣,就會建立很多個相對於各自任務的OS_FLAG_NODE變數,這些OS_FLAG_NODE變數連線成雙鏈表,使用OS_FLAG_GRP的OSFlagWaitList指標來訪問這個雙鏈表。處理完OS_FLAG_NODE變數的填充和連線之後OS_FlagBlock函式再將當前任務的就緒狀態取消。然後返回到OSFlagPend函式,OSFlagPend函式隨即呼叫任務排程函式,將自己阻塞起來。

此時,能使這個任務恢復執行的辦法有兩個,一個就是時鐘滴答裡邊會檢測每個任務的timeout,當timeout等於1時,就會檢測任務的狀態位,如果狀態不是就緒,則清空等待標誌,將pend狀態設定為pend過期,如果是就緒,則設定成pend成功,隨即在任務就緒組和任務就緒表裡恢復這個任務的就緒狀態。二是通過OSFlagPost函式,只需傳遞給該函式相應的OS_FLAG_GRP變數和要設定的位掩碼,即可完成相應的設定,並且據此更改各個對該OS_FLAG_GRP變數使用過OSFlagPend函式的任務的態。OSFlagsPost函式先根據要求更新事件標誌,然後通過OS_FLAG_GRP變數取得等待該標誌組的任務連結串列的指標,接著遍歷該連結串列,檢查每個節點要求的標誌位是否得到滿足,如果滿足,則呼叫OS_FlagTaskRdy函式,在該函式裡,將當前TCB等待flag的狀態清除掉,如果此TCB沒有其他的原因阻塞,則進入到就緒狀態,然後該函式將這個TCB對應的任務就緒組合任務就緒表更新在OS_FLAG_NODE連結串列中將該節點刪除,然後返回到OSFlagsPost函式中,呼叫任務排程函式,完成此次標誌位的傳送

相關推薦

ucos ii事件標誌原理分析

很早以前就開始學習移植USOS ii了,移植倒沒什麼難的,主要是要清楚自己的微控制器,最好是將啟動程式碼分析一遍,那麼在移植的時候,很多概念就不會陌生了。我用的是 stm32f103ze. 移植完了之後,就不知道幹嘛了,於是中間擱置了很久,這幾天又想到這個系統,於是又重新移

FreeRTOS 事件標誌

func ear rtos 內核 stm32f407 rto 指定 ora mage 為什麽要使用事件標誌事件標誌組是實現多任務同步的有效機制之一。也許有不理解的初學者會問采用事件標誌組多麻煩,搞個全局變量不是更簡單?其實不然,在裸機編程時,使用全局變量的確比較方便,但是在

Freertos-事件標誌,消息隊列,信號量,二值信號量,互斥信號量

text pri 消息隊列 解決 消息 無需 出現 任務 一個 任務間的通信和同步機制 在裸機編程時,使用全局變量的確比較方便,但是在加上 RTOS 後就是另一種情況了。 使用全局變量相比事件標誌組主要有如下三個問題: 1、使用事件標誌組可以讓 RTOS 內核有效地管理任

FreeRTOS事件標誌的學習

1、背景 由於在搞ESP32的WIFI部分時,出現"wifi: Haven't to connect to a suitable AP now"的異常。分析完WIFI流程後,去除事件組後,正常執行,因此需要分析一下事件組哪裡學習不到位。 事件組的存在,影響我想達到的目標。 // wi

FreeRTOS 任務通知模擬事件標誌

實驗 //設定事件位的任務 void eventsetbit_task(void *pvParameters) { u8 key; while(1) { if(EventGroupTask_Handler!=NULL)

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

1.1事件標誌組:        有時候一個任務需要與多個事件同步,這個時候就需要使用事件標誌組。事件標誌組與任務之間有兩種同步機制:“或”同步和“與”同步。      “或”同步:等待多個事件時,任何一個事件發生 ,任務都被同步,這個就稱為“或”同步。     

UCOS2:對於訊號量,互斥訊號量,事件標誌

2.訊號量:    至於訊號量,和互斥訊號量是用區別的,簡單來說(個人理解,歡迎糾正)就是互斥訊號量再同一時刻,任務得到互斥訊號量量後是獨佔共享資源的,在他沒有釋放訊號量之前,任何其他任務都是不能訪問共享資源的。而訊號量的不同在於。訊號量可以設定一個值,允許最多又幾個任務同時去訪問共享資源。比如我給他設定一個

FreeRTOS 之 事件標誌及實現FreeRTOS看門狗

  事件標誌組是實現多工同步的有效機制之一。任務間事件標誌組的實現是指各個任務之間使用事件標誌組實現任務的通訊或者同步機制。FreeRTOS在event_groups.c/h檔案中提供了事件標誌組的具體實現。 事件標誌組簡介   根據具體平臺的不同,FreeRT

ucosII的事件標誌的使用心得

UCOSII的FLAG使用類似於RTTHREAD的事件,我沒仔細的研究過ucosII的手冊,感覺RTTHREAD的事件更好用些,功能上應該是ucos跟強大 以下為例子: OS_TMR *MyTimer; OS_FLAG_GRP *MyGflag; void mytime

Ucos-ii中獲取最高優先順序的原理(任務和事件

1.      任務優先順序表是按照由左至右,由上至下的順序增長的,且優先順序號越小優先順序越高。 2.      任務優先順序儲存在一個位元組型數組裡,陣列大小為8,其還有一個行表,即一個位元組單元,用於確定在陣列的哪行有任務。 3.      任務優先順序由一個位元組的低6個bit組成,其最低優先順序為

Android官方架構件:Lifecycle詳解&迪士尼彩樂園網站架設原理分析

ner 觀察者 and 順序 觸發 組件 oncreate mcr save 我們先將重要的這些類挑選出來: LifecycleObserver接口( Lifecycle觀察者):實現該接口的類,通過註解的方式,可以通過被LifecycleOwner類的addObserve

Android官方架構件:Lifecycle詳解&迪士尼彩樂園定制開發原理分析

npr save this end ons 關於 直接 能夠 封裝 Lifecycle 是一個類,它持有關於組件(如 Activity 或 Fragment)生命周期狀態的信息,並且允許其他對象觀察此狀態。 我們只需要2步: 1、Prestener繼承LifecycleOb

Android官方架構件:Lifecycle詳解&迪士尼彩樂園平臺搭建原理分析

基類 客服 androi lifecycle 利用 思想 pub 遇到 原理 在過去的谷歌IO大會上,Google官方向我們推出了 Android Architecture Components,其中談到Android組件處理生命周期的問題,向我們介紹了 Handling

uCOS-II任務就緒表OSRdyGrp、OSRdyTbl、OSUnMapTbl原理

uCOS版本:V2.91     使用過uCOS的人應該都知道,每一個uCOS的任務都有一個特定的優先順序,就像人的身份證一樣,是唯一的,這個優先順序在建立的時候就有直到這個任務被刪除,整個生命週期都是存在的。優先順序越低,任務的優先順序就越高。 &n

uCOS-II OSTaskCreate函式分析

ucos版本:V2.91 函式名:OSTaskCreate 函式原型位置:os_task.c:206行 首先看形參列表及返回值: 返回值型別為INT8U,用於儲存錯誤標誌。 第一個引數為:void (*task)(void *p_arg),此處為一函式指標,用於指定任務執行的函式。

let用來處理迴圈事件繫結問題的原理分析

      在編寫js程式碼時,有一個問題基本上人人都會遇到,那就是用for迴圈為一組DOM物件繫結事件響應回撥,每個事件回掉函式中i的值都是DOMlist.length。 上程式碼: var btns = document.getElements

事件觸發機制:Poll,Select和Epoll實現原理分析

Poll和Select和Epoll都是事件觸發機制,當等待的事件發生就觸發進行處理,多用於linux實現的伺服器對客戶端連線的處理。 Poll和Select都是這樣的機制:可以阻塞地同時探測一組支援非阻塞的IO裝置,是否有事件發生(如可讀,可寫,有高優先順序的錯誤輸出,出現

多播(播)原理分析

 為什麼要使用多播:        網卡從網路上接收到目標實體地址對應的所有bit位都為1的資料報時,會收到這條訊息並將其上傳給驅動程式,網絡卡的這種工作模式稱為廣播模式,網絡卡的預設工作模式包含直接模式和廣播模式。利用這一特性,UDP(使用者資料報協議)還提供了向多個目標

嵌入式實時作業系統ucos/ii 原理與應用(七)

第八章 在51微控制器上移植μC/OS-Ⅱ 8.1 μC/OS-Ⅱ移植的一般性問題 8.1.1 可重入函式 能允許同時被多個任務所呼叫,而不會通過函式中變數的耦合引起任務之間的相互干擾的函式叫做可重入函式。 一個可重入函式只使用區域性變數,因為函式的區域性變數儲存

linux udp播接收問題及原理分析

現象: 在某個網路環境下,同一個udp組播源(igmpv2),同樣的收流程式碼,在windows上能收到,linux上收不到。排除網路拓撲結構、程式語言、硬體驅動等問題,我們就此問題來分析原理及解決方案。 環境: 交換機出,組播地址224.X.X.X,機器多網絡卡,eth