事件組
原文鏈接
事件組是一個整數,其中的高8位留給內核,只能用其他位來表示時間
每一位代表一個事件,且每個時間的含義由程序員決定
1為發生,0為未發生
一個/多個任務或ISR都能讀寫這些位
可以等待某一位,也可以等待多個位
事件組有廣播作用,會喚醒所有復合條件的任務;而隊列和信號量只會喚醒一個任務。
事件組喚醒任務后,可以讓事件不動,也可以清除事件。
事件組函數
創建
成功返回句柄,失敗返回NULL
EventGroupHandle_t xEventGroupCreate( void );// 動態創建
EventGroupHandle_t xEventGroupCreateStatic( StaticEventGroup_t * pxEventGroupBuffer );
//靜態創建
示例:
g_xEventCar = xEventGroupCreate();
刪除
void vEventGroupDelete( EventGroupHandle_t xEventGroup )
設置事件
xEventGroup: 哪個事件組
uxBitsToSet: 設置哪些位?
- 如果uxBitsToSet的bitX, bitY為1, 那么事件組中的bitX, bitY被設置為1
- 可以用來設置多個位,比如 0x15 就表示設置bit4, bit2, bit0
返回值EventBits_t: 返回原來的事件值(沒什么意義, 因為很可能已經被其他任務修改了)
pxHigherPriorityTaskWoken: 有沒有導致更高優先級的任務進入就緒態? pdTRUE-有, pdFALSE-沒有
返回值BaseType_t: pdPASS-成功, pdFALSE-失敗
/*在任務中使用*/
EventBits_t xEventGroupSetBits( EventGroupHandle_t xEventGroup,const EventBits_t uxBitsToSet );
/*在ISR中使用*/
BaseType_t xEventGroupSetBitsFromISR( EventGroupHandle_t xEventGroup,const EventBits_t uxBitsToSet,BaseType_t * pxHigherPriorityTaskWoken );
示例:
xEventGroupSetBits(g_xEventCar, (1<<0));
(1<<0)是二進制掩碼,表示將1左移0位(00000001),指等待第0位
等待事件
xEventGroup 等待哪個事件組?
uxBitsToWaitFor 等待哪些位?哪些位要被測試?
xClearOnExit 函數提出前是否要清除事件? pdTRUE: 清除uxBitsToWaitFor指定的位 pdFALSE: 不清除
xWaitForAllBits 怎么測試?是"AND"還是"OR"? pdTRUE: 等待的位,全部為1; pdFALSE: 等待的位,某一個為1即可
xTicksToWait 如果期待的事件未發生,阻塞多久。 可以設置為0:判斷后即刻返回; 可設置為portMAX_DELAY:一定等到成功才返回; 可以設置為期望的Tick Count,一般用*pdMS_TO_TICKS()*把ms轉換為Tick Count
返回值 返回的是事件值, 如果期待的事件發生了,返回的是"非阻塞條件成立"時的事件值; 如果是超時退出,返回的是超時時刻的事件值。
EventBits_t xEventGroupWaitBits( EventGroupHandle_t xEventGroup,const EventBits_t uxBitsToWaitFor,const BaseType_t xClearOnExit,const BaseType_t xWaitForAllBits,TickType_t xTicksToWait );
示例:
xEventGroupWaitBits(g_xEventCar, (1<<0)|(1<<1), pdTRUE, pdFALSE, portMAX_DELAY);
(1<<0)|(1<<1)表示關心第0和第1位,且他們有一個為1時觸發。
同步點
如果有ABC多個任務需要全部做完才能進行下一步,可以使用xEventGroupSync()
xEventGroup 哪個事件組?
uxBitsToSet 要設置哪些事件?我完成了哪些事件? 比如0x05(二進制為0101)會導致事件組的bit0,bit2被設置為1
uxBitsToWaitFor 等待那個位、哪些位? 比如0x15(二級制10101),表示要等待bit0,bit2,bit4都為1
xTicksToWait 如果期待的事件未發生,阻塞多久。 可以設置為0:判斷后即刻返回; 可設置為portMAX_DELAY:一定等到成功才返回; 可以設置為期望的Tick Count,一般用*pdMS_TO_TICKS()*把ms轉換為Tick Count
返回值 返回的是事件值, 如果期待的事件發生了,返回的是"非阻塞條件成立"時的事件值; 如果是超時退出,返回的是超時時刻的事件值。
EventBits_t xEventGroupSync( EventGroupHandle_t xEventGroup,const EventBits_t uxBitsToSet,const EventBits_t uxBitsToWaitFor,TickType_t xTicksToWait );
示例:
xEventGroupSync(g_xEventCar, (1<<0),(1<<1)|(1<<2), portMAX_DELAY);
會設置第0位,等待第1,2位