freertos(第八課, event group)

semaphore只能用於單個事件的進程同步,如果需要進行多事件同步,就需要使用eventgroup。
一個eventgroup就是一組eventbit。
我們可以自行約定eventbit所代表的含義。
事件組的類型是EventGroupHandle_t。
一個事件組,可以存儲24個事件位。高8位有其他用處。

freertos提供了一系列的API。

EventGroupHandle_t xEventGroupCreate(void);
void vEventGroupDelete(EventGroupHandle_t xEventGroup);

EventBits_t 
xEventGroupSetBits(
		EventGroupHandle_t xEventGroup,
		const EventBist_t uxBitsToSet
		);

EventBits_t 
xEventGroupClearBits(
		EventGroupHandle_t xEventGroup,
		const EventBist_t uxBitsToClear
		);

BaseType_t
xEventGroupSetBitsFromISR(
		EventGroupHandle_t xEventGroup,
		const EventBist_t uxBitsToSet,
		BaseType_t* pxHigherPriorityTaskWoken
		);
		
BaseType_t
xEventGroupClearBitsFromISR(
		EventGroupHandle_t xEventGroup,
		const EventBist_t uxBitsToClear,
		BaseType_t* pxHigherPriorityTaskWoken
		);

EventBits_t xEventGroupGetBits(EventGroupHandle_t xEventGroup);
EventBits_t xEventGroupGetBitsFromISR(EventGroupHandle_t xEventGroup);

EventBits_t 
xEventGroupWaitBits(
		EventGroupHandle_t xEventGroup,
		const EventBits_t uxBitsToWaitFor,
		const BaseType_t xClearOnExit,
		const BaseType_t xWaitForAllBits,
		const TickType_t xTicksToWait
		);

和所有的進程同步一樣,eventgroup機制,也是進程向OS申請PV操作的。
waitbits就是進程向OS申請P操作的API。
setbits就是進程向OS申請V操作的API。

任務等待的多個eventbit,可以是邏輯與的關係,也可以是邏輯或的關係,這取決於xWaitforallbits的設置情況,如果設置成pdTRUE,就是邏輯與的關係,如果設置成pdFALSE,就是邏輯或的關係。
eventbit可以作爲常規的事件量來使用,即,當event發生時,在ISR或者某個任務中setbit,而在另一個waitbit的進程中,執行event對應的action,並在action完成後,clearbit。從setbit到clearbit,這是一個交互過程,代表一個event從發生到被響應的過程。
eventbit也可以作爲狀態指示量來使用,即,當event發生時,在ISR或者某個任務中setbit,表示當前處於某個status,而在另一個waitbit的進程中,執行status對應的action,但是執行action的進程,並不負責clearbit,而是由其他的進程或者ISR負責清除。從setbit到clearbit,這是一個狀態指示的過程,代表一個status從出現到消失的過程。
這取決於xClearonexit的設置,如果設置成pdTRUE,則eventibit用於常規事件量,如果設置成pdFALSE,則eventbit用於狀態指示量。

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