FreeRTOS_事件标志组

原创
09/27 11:23
阅读数 144

一、介绍

    事件位用来表明某个事件是否发生,事件位通常用作事件标志;事件组就是一组的事件位。

 

二、创建事件标志组

    函数原型:

EventGroupHandle_t xEventGroupCreate( void );

    参数:

    返回值:NULL,事件标志组创建失败;

                  其他值,创建成功的事件标志组句柄

    示例:

/* 事件标志组句柄 */
EventGroupHandle_t xCreatedEventGroup; 
/* 创建事件标志组 */
xCreatedEventGroup = xEventGroupCreate(); 

三、设置事件位

    (一)在任务中设置事件位

    函数原型:

EventBits_t xEventGroupSetBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet );

   参数:

    xEventGroup:要操作的事件标志组句柄;

    uxBitsToSet :要置1的事件位,比如将bit3置1就设置(1<<3);也可同时将多个bit置1;

    返回值:在将指定事件位置1后的事件组值。

    示例:

#define BIT_0 ( 1 << 0 )
#define BIT_4 ( 1 << 4 ) 

void vATask( void *pvParameters )
{
	EventBits_t uxBits; 
	
	while(1)
	{
		if(xCreatedEventGroup  != NULL)
		{
			/* 将事件标志组的bit0位置1 */
			uxBits = xEventGroupSetBits( xCreatedEventGroup, BIT_0);   			
		}
		
		vTaskDelay(1000);
	}
}

    (二)在中断中设置事件位

    函数原型:

BaseType_t xEventGroupSetBitsFromISR( EventGroupHandle_t xEventGroup, 
									  const EventBits_t uxBitsToSet, 
									  BaseType_t *pxHigherPriorityTaskWoken );

    参数:

    xEventGroup:要操作的事件标志组句柄;

    uxBitsToSet:要置1的事件位,比如将bit3置1就设置(1<<3);也可同时将多个bit置1;

    pxHigherPriorityTaskWoken :标记退出此函数之后是否进行任务切换,当此值为pdTRUE的时候在退出中断服务函数之前必须进行一次任务切换;

    返回值:pdPASS,事件位置1成功;

                  pdFALSE,事件位置1失败。

    示例:


#define BIT_0 ( 1 << 0 )
#define BIT_4 ( 1 << 4 ) 

void anInterruptHandler( void )
{
	BaseType_t xHigherPriorityTaskWoken, xResult;    
	
	xHigherPriorityTaskWoken = pdFALSE;    
	
	/* 将事件标志组中的bit4位置1 */
	xResult = xEventGroupSetBitsFromISR( xCreatedEventGroup , BIT_4, &xHigherPriorityTaskWoken );
	if( xResult == pdPASS )
	{
		/* 设置成功切换任务 */
		portYIELD_FROM_ISR( xHigherPriorityTaskWoken );
	}
}

 

四、等待事件标志组值

    函数原型:

EventBits_t xEventGroupWaitBits(    EventGroupHandle_t xEventGroup,
                                    const EventBits_t uxBitsToWaitFor,
                                    const BaseType_t xClearOnExit,
                                    const BaseType_t xWaitForAllBits,
                                    const TickType_t xTicksToWait );

   参数:

    xEventGroup:要等待的事件标志组句柄;

    uxBitsToWaitFor:要等待的事件位,比如等待bit0和(或)bit2的时候参数就是(1<<0|1<<2);

    xClearOnExit:当参数为pdTRUE,在退出此函数之前由参数uxBitsToWaitFor设置的事件位就会清零;当参数为pdFALSE则不会改变;

    xWaitForAllBits:当参数为pdTRUE,只有uxBitsToWaitFor所设置的事件位都置1或者阻塞时间到该函数才返回;当参数为pdFALSE,只要uxBitsToWaitFor所设置的事件位任意一个置1或者阻塞时间到该函数才返回;

    xTicksToWait :阻塞时间;

    返回值:任何值,返回当前所等待的事件位置1以后的事件标志组值,或者阻塞时间到。

    示例:

#define BIT_0 ( 1 << 0 )
#define BIT_4 ( 1 << 4 ) 

void vATask( void *pvarameters )
{
	EventBits_t uxBits; 
	const TickType_t xTicksToWait = 100 / portTICK_PERIOD_MS;
	
	for(;;)
	{
		if(xCreatedEventGroup != NULL)
		{
			uxBits = xEventGroupWaitBits( xCreatedEventGroup , 
							  BIT_0 | BIT_4, 		/* 设置要等待的事件位 */
							  pdTRUE, 				/* 如果为pdTRUE退出该函数前bit0和bit4会被清零,如果为pdFALSE退出该函数则不改变 */
							  pdFALSE, 				/* 如果为pdTRUEbit0和bit4都被置1或者阻塞时间结束才会返回,如果为pdFALSE当bit0和bit4任意位被置1或者阻塞时间到会返回 */
							  xTicksToWait);		/* 阻塞时间 */	
			switch(uxBits)
			{
				case BIT_0:
					break;
				case BIT_4:
					break;
				default:
					break;
			}
		}
		else
		{
			vTaskDelay(1000);
		}
	}
}

 

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部