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保持同步或通信
![](https://i-blog.csdnimg.cn/blog_migrate/baeec7fd908eafe55557ed688413a633.png)
简单说明:任务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.
}