1. 事件标志组相关API函数
函数 | 描述 |
---|---|
xEventGroupCreate() | 使用动态方式创建事件标志组 |
xEventGroupCreateStatic() | 使用静态方式创建事件标志组 |
vEventGroupDelete() | 删除事件标志组 |
xEventGroupSetBits() | 将指定的事件位置1, 用于任务中 |
xEventGroupSetBitsFromISR() | 将指定的事件位置1,用于中断服务函数 |
xEventGroupClearBits() | 将指定的事件位清零, 用于任务 |
xEventGroupClearBitsFromISR() | 将指定的事件位清零,用于中断服务函数 |
xEventGroupGetBits | 获取当前事件标志组的值(各个事件位的值),用在任务中 |
xEventGroupGetBitsFromISR() | 获取当前事件标志组的值, 用在中断服务中 |
xEventGroupWaitBits() | 事件组等待位 |
xEventGroupSync() | 事件组同步函数 |
事件标志组中其它重要的API函数:
函数 | 描述 |
---|---|
xTaskRemoveFromUnorderedEventList() | 将阻塞的任务从事件列表中移除,并添加到就绪列表中 |
vTaskPlaceOnUnorderedEventList() | 将任务添加到事件列表中 |
prvTestWaitCondition() | 判断当前事件位是否匹配当前等待的事件 |
2. 事件标志组的基本概念
事件标志组是实现多任务同步的有效机制之一。
事件标志组数据类型:
typedef struct xEventGroupDefinition
{
/* 储存事件标志组中的事件位 */
EventBits_t uxEventBits;
/* 事件标志组列表 */
List_t xTasksWaitingForBits;
/* 启用可视化跟踪调试 */
#if( configUSE_TRACE_FACILITY == 1 )
UBaseType_t uxEventGroupNumber;
#endif
/* 用于标记事件标志组申请内存的方式 */
#if( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) )
uint8_t ucStaticallyAllocated;
#endif
} EventGroup_t;
时间标志组中的事件位储存在EventBits_t类型变量中,其中:
typedef TickType_t EventBits_t;
又:
#if( configUSE_16_BIT_TICKS == 1 )
typedef uint16_t TickType_t;
#define portMAX_DELAY ( TickType_t ) 0xffff
#else
typedef uint32_t TickType_t;
#define portMAX_DELAY ( TickType_t ) 0xffffffffUL
#define portTICK_TYPE_IS_ATOMIC 1
#endif
可以看出,当configUSE_16_BIT_TICKS为1时,EventBits_t是16位的数据类型,为0时,EventBits_t是32位的数据类型。
当EventBits_t是16位的数据类型,只储存8个事件位,当EventBits_t是32位的数据类型,只储存24个事件位,其高8位用于其他用途。
高8位用途:
#if configUSE_16_BIT_TICKS == 1
#define eventCLEAR_EVENTS_ON_EXIT_BIT 0x0100U
#define eventUNBLOCKED_DUE_TO_BIT_SET 0x0200U
#define eventWAIT_FOR_ALL_BITS 0x0400U
#define eventEVENT_BITS_CONTROL_BYTES 0xff00U
#else
/* 表示事件退出时,是否需要删除事件位 */
#define eventCLEAR_EVENTS_ON_EXIT_BIT 0x01000000UL
/* 标记该任务事件位设置了,已解除阻塞 */
#define eventUNBLOCKED_DUE_TO_BIT_SET 0x02000000UL
/* 表示设置的所有事件位都为1才有效 */
#define eventWAIT_FOR_ALL_BITS 0x04000000UL
#define eventEVENT_BITS_CONTROL_BYTES 0xff000000UL
#endif
#define taskEVENT_LIST_ITEM_VALUE_IN_USE 0x80000000UL
3. 事件标志组的创建
函数 | 描述 |
---|---|
xEventGroupCreate() | 动态方式创建事件标志组 |
xEventGroupCreateStatic() | 静态方式创建事件标志组 |
3.1 动态方式创建
使用动态方式创建事件标志组,需要将configSUPPORT_DYNAMIC_ALLOCATION设置为1。
函数原型如下:
/********************************************************
参数:无
返回:事件标志组的句柄
*********************************************************/
EventGroupHandle_t xEventGroupCreate( void )
EventGroupHandle_t是新定义的类型:
typedef void * EventGroupHandle_t;
函数源代码如下:
EventGroupHandle_t xEventGroupCreate( void )
{
EventGroup_t *pxEventBits;
/* 为事件标志组申请内存 */
pxEventBits = ( EventGroup_t * ) pvPortMalloc( sizeof( EventGroup_t ) );
if( pxEventBits != NULL )
{
pxEventBits->uxEventBits = 0; /* 初始化事件位都为0 */
vListInitialise( &( pxEventBits->xTasksWaitingForBits ) ); /* 初始化事件标志组的列表 */
/* 如果使能了静态申请方式 */
#if( configSUPPORT_STATIC_ALLOCATION == 1 )
{
/* 标记不是通过静态申请方式 */
pxEventBits->ucStaticallyAllocated = pdFALSE;
}
#endif /* configSUPPORT_STATIC_ALLOCATION */
traceEVENT_GROUP_CREATE( pxEventBits );
}
else
{
traceEVENT_GROUP_CREATE_FAILED();
}
return ( EventGroupHandle_t ) pxEventBits; /* 返回事件标志组的句柄 */
}
3.1 静态方式创建
使用静态方式创建事件标志组,需要将configSUPPORT_STATIC_ALLOCATION设置为1。
函数原型如下: