FreeRTOS原理剖析:事件标志组

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。

函数原型如下:

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值