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用於狀態指示量。