(freeRTOS)EventGroup的使用
(freeRTOS)EventGroup的使用
事件组简单配置的数据类型
EventGroup_t
点击查看EventGroup_t数据结构
typedef struct xEventGroupDefinition {
EventBits_t uxEventBits;
List_t xTasksWaitingForBits;
}EventGroup_t;
xEventGroupCreate
EventGroupHandle_t xEventGroupCreate( void )
Create a new event group.
创建一个事件组
点击查看代码
EventGroupHandle_t xEventGroupCreate( void )
{
EventGroup_t *pxEventBits;
/* Allocate the event group. */
pxEventBits = ( EventGroup_t * ) pvPortMalloc( sizeof( EventGroup_t ) );
if( pxEventBits != NULL )
{
pxEventBits->uxEventBits = 0;
vListInitialise( &( pxEventBits->xTasksWaitingForBits ) );
#if( configSUPPORT_STATIC_ALLOCATION == 1 )
{
/* Both static and dynamic allocation can be used, so note this
event group was allocated statically in case the event group is
later deleted. */
pxEventBits->ucStaticallyAllocated = pdFALSE;
}
#endif /* configSUPPORT_STATIC_ALLOCATION */
traceEVENT_GROUP_CREATE( pxEventBits );
}
else
{
traceEVENT_GROUP_CREATE_FAILED();
}
return ( EventGroupHandle_t ) pxEventBits;
}
代码理解
- 通过上面 这两行代码
- EventGroup_t *pxEventBits;
- return ( EventGroupHandle_t ) pxEventBits;
可以看出 EventGroupHandle_t 就是 EventGroup_t 的转换
vEventGroupDelete
void vEventGroupDelete(EventGroupHandle_t xEventGroup)
事件组删除
点击查看代码
void vEventGroupDelete(EventGroupHandle_t xEventGroup) {
EventGroup_t *pxEventBits = (EventGroup_t *) xEventGroup;
const List_t *pxTasksWaitingForBits = &(pxEventBits->xTasksWaitingForBits);
vTaskSuspendAll();
{
traceEVENT_GROUP_DELETE(xEventGroup);
while (listCURRENT_LIST_LENGTH(pxTasksWaitingForBits) > (UBaseType_t) 0) {
/* Unblock the task, returning 0 as the event list is being deleted
and cannot therefore have any bits set. */
configASSERT(
pxTasksWaitingForBits->xListEnd.pxNext != (const ListItem_t *) &(pxTasksWaitingForBits->xListEnd));
vTaskRemoveFromUnorderedEventList(pxTasksWaitingForBits->xListEnd.pxNext, eventUNBLOCKED_DUE_TO_BIT_SET);
}
#if((configSUPPORT_DYNAMIC_ALLOCATION == 1) && (configSUPPORT_STATIC_ALLOCATION == 0))
{
/* The event group can only have been allocated dynamically - free
it again. */
vPortFree( pxEventBits );
}
#elif((configSUPPORT_DYNAMIC_ALLOCATION == 1) && (configSUPPORT_STATIC_ALLOCATION == 1))
{
/* The event group could have been allocated statically or
dynamically, so check before attempting to free the memory. */
if( pxEventBits->ucStaticallyAllocated == ( uint8_t ) pdFALSE )
{
vPortFree( pxEventBits );
}
else
{
mtCOVERAGE_TEST_MARKER();
}
}
#endif /* configSUPPORT_DYNAMIC_ALLOCATION */
}
(void) xTaskResumeAll();
}
上面的代码可以看出这个代码断主要的是这两段
- vTaskRemoveFromUnorderedEventList(pxTasksWaitingForBits->xListEnd.pxNext, eventUNBLOCKED_DUE_TO_BIT_SET);
- 用来移除进程等待位的LIST
- vPortFree( pxEventBits );
- 用来移除事件等待位的缓存
xEventGroupCreateStatic
EventGroupHandle_t xEventGroupCreateStatic( StaticEventGroup_t /*pxEventGroupBuffer )
创建一个静态事件组
要创建静态事件组,必须在FreeRTOS上面将 configSUPPORT_STATIC_ALLOCATION 设置为1,才能开启静态事件创建功能
xEventGroupWaitBits
EventBits_t xEventGroupWaitBits(EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToWaitFor, const BaseType_t xClearOnExit, const BaseType_t xWaitForAllBits, TickType_t xTicksToWait)
xEventGroupSetBits
EventBits_t xEventGroupSetBits(EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet)
设置事件组位
xEventGroupGetBits
xEventGroupGetBits(xEventGroup)
获取事件组的BITS
xEventGroupClearBits
EventBits_t xEventGroupClearBits(EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToClear)
清除事件组位
xEventGroupSync
EventBits_t xEventGroupSync(EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet,
const EventBits_t uxBitsToWaitFor, TickType_t xTicksToWait)
xEventGroupSetBitsFromISR
xEventGroupSetBitsFromISR(xEventGroup, uxBitsToSet, pxHigherPriorityTaskWoken)
xEventGroupClearBitsFromISR
xEventGroupClearBitsFromISR(xEventGroup, uxBitsToClear)
xEventGroupGetBitsFromISR
EventBits_t xEventGroupGetBitsFromISR(EventGroupHandle_t xEventGroup)