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用于状态指示量。

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