freeRTOS小結——事件管理

概述

事件(Event)用於任務之前的同步和通信。freeRTOS中包含的事件分爲如下幾類,

·           消息(Message),用於任務之前通信

·           信號量(Semaphore)和互斥信號量,用於任務之前的同步(控制多個任務對同一資源的訪問)

本小節主要討論消息,信號量和互斥信號量主要用於資源管理,將在後邊講到。

基於消息的任務間通信過程如下圖所示,發送者任務將消息發送給郵箱(MailBox)或消息隊列(Message Queue),郵箱或消息隊列則將該消息轉發給接收者任務,並更新接收者任務的狀態(掛起 -> 就緒),並在接收者任務的優先級高於當前任務時觸發任務切換。


其中,

·           消息對象(Message Object)用於承載消息內容和基本信息。

·           郵箱用於早期的RTOS,freeRTOS已經不再支持,但在其他的RTOS如ucos中存在,實際上,郵箱可以看做隊列長度爲1的消息隊列。

·           消息隊列實際上爲基於鏈表實現的FIFO buffer,其每一個節點對應爲一個消息對象。

·           一般而言,發送者總是將消息發送到消息隊列的隊尾,當然也支持將優先級特別高的消息插入到隊首

 

freeRTOS中,消息隊列佔用的存儲空間全部從heap中分配得到。發送消息時,消息內容將會被全部複製到消息對象中;接收消息時,消息內容將會被全部複製到接收者任務提供的存儲空間中。因此,freeRTOS較爲推薦如下的消息結構,以減少複製消息的時間,


其中消息內容以地址形式提供(MessageContent Address,即C語言中的指針類型)。

 

事件傳輸過程

TASK在發送事件時,會檢查當前是否存在因爲等待該事件而處於鎖定態的TASK,若有則將其狀態更新到就緒態,並在自己優先級不是就緒態 TASK集合中最高的情況下觸發TASK切換過程。

TASK接收事件時,首先檢查需要接收的事件是否已經存在,若存在則取出該事件處理;若沒有則進入鎖定態等待該事件,並觸發TASK切換,讓就緒態TASK集合中最高優先級TASK運行。等待的時間可由用戶設定,當等待時間超時後,前邊提到的時間片機制會將該TASK更新到就緒態。

如下圖所示,低優先級TASK發送消息到高優先級TASK,會觸發TASK切換,讓高優先級TASK運行;反之,則不會。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章