六、FreeRTOS学习之 事件组

1、基本概念

事件组:用于任务同步的一种方法。

通过使能宏configUSB_16_BIT_TICKS来确定事件组使用的位数,

当该宏为 1 时,那么整数是16位的,高八位给内核使用,低八位用来表示事件。

当该宏为 0 时,整数是32位的,用低24位来表示事件。

2、事件组的创建

动态创建:

EventGroupHandle_t xEventGroupCreate( void );

//返回值:返回NULL,无法创建事件组,没有足够的FreeRTOS堆可用。
//       返回新创建事件组的句柄,事件组创建成功。

//该函数不能在中断中调用

静态创建:

EventGroupHandle_t xEventGroupCreateStatic( StaticEventGroup_t * pxEventGroupBuffer );

//参数:创建前先定义StaticEventGroup_t类型的变量,事件组的数据结构将存储在该变量中。

//返回值:返回NULL,创建事件组失败;返回新创建事件组的句柄,创建成功。

//该函数不能在中断中调用

3、事件组的删除

void vEventGroupDelete( EventGroupHandle_t xEventGroup )

//参数:要删除的目标事件组句柄

//该函数不能在中断中调用

4、设置事件

EventBits_t xEventGroupSetBits( 
                                  EventGroupHandle_t xEventGroup,//目标事件组句柄
                                  const EventBits_t uxBitsToSet //在事件中设置位
                              )
//返回值:返回设置之前的事件组的值


//在中断中使用
BaseType_t xEventGroupSetBitsFromISR( EventGroupHandle_t xEventGroup,
									  const EventBits_t uxBitsToSet,
									  BaseType_t * pxHigherPriorityTaskWoken );

5、等待事件

EventBits_t xEventGroupWaitBits(
                                     EventGroupHandle_t xEventGroup,//目标事件组句柄
                                     const EventBits_t uxBitsToWaitFor,//需要测试的位
                                     const BaseType_t xClearOnExit,//清除指定的位
                                     const BaseType_t xWaitForAllBits,//pdTRUE: 清除指定的位
                                                                      //pdFALSE: 不清除
                                     TickType_t xTicksToWait//阻塞时间
                                )

//返回值:之前事件组的值

6、事件同步

EventBits_t xEventGroupSync(    
                                EventGroupHandle_t xEventGroup,//事件组句柄
                                const EventBits_t uxBitsToSet,//设置位
                                const EventBits_t uxBitsToWaitFor,//等待事件位
                                TickType_t xTicksToWait //阻塞时间
                            )


/*返回值:The value of the event group at the time either the bits being waited for  became set, or the block time expired.  Test the return value to know which  bits were set.                                                                      

         If xEventGroupSync() returned because its timeout expired then not all the  bits being waited for will be set in the returned value.
         If xEventGroupSync() returned because all the bits it was waiting for were  set then the returned value is the event group value before any bits were  automatically cleared.
*/

7、实例

/* FreeRTOS头文件 */
#include "FreeRTOS.h"
#include "task.h"
#include "queue.h"
#include "semphr.h"
#include "event_groups.h"


#define EVENTBIT  (1<<2)//事件位
 
TaskHandle_t xHandleTask1 = NULL;//任务句柄,用于删除
TaskHandle_t xHandleTask2 = NULL;
 
EventGroupHandle_t  EventGroupHandle;//事件组句柄

 
void Task1(void *param)
{    
	while(1)
	{
		if(EventGroupHandle!=NULL)
	   {
		    xEventGroupSetBits( EventGroupHandle, EVENTBIT);              
	   }
	   vTaskDelay(10);
	}	
}
 
void Task2(void *param)
{
    EventBits_t EventValue;//接收返回值
  
	while(1)
	{
		if(EventGroupHandle != NULL)
		{
		     EventValue = xEventGroupWaitBits((EventGroupHandle_t) EventGroupHandle,
										       (EventBits_t) EVENTBIT_ALL,
										       (BaseType_t)  pdTRUE,
										       (BaseType_t)  pdTRUE,
										       (TickType_t)  portMAX_DELAY );
		     printf("bits set =%#x!\r\n",EventValue);	
		}
        else
            vTaskDelay(10);
	}	
}
 
 
int main( void )
{
 
    EventGroupHandle = xEventGroupCreate();
	if(EventGroupHandle == NULL)
	{
	  printf("Event Group Failed!\r\n");
	}
 
	xTaskCreate(Task1,"Task1",100,NULL,2,&xHandleTask1);
	xTaskCreate(Task2,"Task2",100,NULL,1,&xHandleTask2);
    
    vTaskStartScheduler();  // 启动任务,开启调度
 
    while(1);   // 正常不会执行到这里 
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值