FreeRTOS事件标志组的学习

1、背景

由于在搞ESP32的WIFI部分时,出现"wifi: Haven't to connect to a suitable AP now"的异常。分析完WIFI流程后,去除事件组后,正常运行,因此需要分析一下事件组哪里学习不到位。

事件组的存在,影响我想达到的目标。

//	wifiBits = xEventGroupWaitBits(wifi_event_group, ST_ALLBITS,
//			false, false, portMAX_DELAY);
//	if((wifiBits & CONNECTED_BIT)==CONNECTED_BIT)
//	{
//		st = SM_getSongFile(tmp_url);
//	}

1.1 参考资料

2、基础知识

事件标志组——任务间的通信和同步机制之一。

2.1 事件组对比全局变量的优点

事件组对比全局变量,在RTOS内有诸多好处是全局变量所达不到的---这些好处还带我去体验

1、让RTOS内核更有效地管理任务;用全局变量时,任务超时等机制需要自己实现。

2、使用事件标志组,不用担心多任务的访问冲突;用全局变量时,为了访问共享要加锁。

3、事件标志组还可有效解决中断服务程序和任务之间的同步问题。

可以看出,事件标志组相当于RTOS给出的全局标志,特别好用的样子

2.2 事件标志组的实现

接下去就要将任务间或任务和中断服务程序间的同步或通信问题。

这就存在一个任务处于阻塞态,等待另一任务或中断服务程序给它需要的事件标志位置1或等待超时,以使之从阻塞态转为运行态。

2.2.1 事件标志组的定义

在FreeRTOS中事件标志的配置

从ESP32的esp-idf的FreeRTOS组件分析

event_groups.h 查找EventBits_t 变量类型的定义

typedef TickType_t EventBits_t;

在 portmacro.h中分析TickType_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
#endif

 当configUSE_16_BIT_TICKS为1时,每创建一个事件组标志,其实定义了一个16位变量,仅使用低8bit;

当configUSE_16_BIT_TICKS为0时,每创建一个事件组标志,其实定义了一个32位变量,仅使用低24bit。

认创建一个事件标志,支持24个事件标志设置

 2.2.2两个任务间使用EventGroups保持同步或通信

任务间事件标志组的实现的过程

简单说明:任务1从运行态Run 调用XEventGroupWaitBits转为阻塞等待Blocked(等待需要的事件标志被置位),任务2置位事件标志。任务1在所需事件标志置位后,转为就绪态Ready,在调度器的作用下从就绪态转为运行态。

 2.2.3 任务和中断使用EventGroups保持同步或通信

 

 简单说明:任务1从运行态Run 调用XEventGroupWaitBits转为阻塞等待Blocked(等待需要的事件标志被置位),串口接收到数据进入到 串口中断服务程序,在中断服务程序中设置任务1 所需的时间标志。任务1在所需事件标志置位后,转为就绪态Ready,在调度器的作用下从就绪态转为运行态。

3、灵活运用

时间标志组相关的函数有11个,目前先关注使用最频繁的4个。

3.1函数xEventGroupCreate()

#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 )
	EventGroupHandle_t xEventGroupCreate( void ) PRIVILEGED_FUNCTION;
#endif

用这个函数会创建一个事件组,自动分配事件组所需的memory block。

返回值:成功创建事件组,则返回事件组的句柄。否则,返回NULL(heap空间不足)

EventGroupHandle_t xCreatedEventGroup;

xCreatedEventGroup = xEventGroupCreate();

if( xCreatedEventGroup == NULL )
{
   // The event group was not created because there was insufficient
   // FreeRTOS heap available. FreeRTOS的堆空间不足
}
 else
 {
    // The event group was created.
 }

 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值