(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;
}

代码理解

  • 通过上面 这两行代码
    1. EventGroup_t *pxEventBits;
    2. 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)