ESP32 ESP-IDF下FreeRTOS事件组位定义与WaitBits接口问题咨询
FreeRTOS事件组测试问题排查
场景说明
测试逻辑设计为:程序最长等待5秒,待MYTASK_Bit对应事件位满足等待条件后,创建任务vMyTask,该任务每隔1秒循环执行printf打印。开发环境为ESP32 + ESP-IDF框架,测试代码如下:
#define MYTASK_Bit (1 << 0) EventGroupHandle_t xMyEventGroup; void vMyTask() { for (;;){ printf("This is in vMyTask.\n"); vTaskDelay(1000 / portTICK_PERIOD_MS); } } void app_main(void) { xMyEventGroup = xEventGroupCreate(); xEventGroupWaitBits(xMyEventGroup, MYTASK_Bit, pdTRUE, pdFALSE, 5000 / portTICK_PERIOD_MS); printf("Starting vMyTask\n"); xTaskCreate(&vMyTask, "vMyTask", 4096, NULL, 1, NULL); }
运行过程中遇到两个疑问,对应解答如下:
疑问1:MYTASK_Bit定义为(1 << 0)时,为什么程序仍然等待满5秒才向下执行?
- 根本原因:你从未对目标事件位执行置位操作。
#define MYTASK_Bit (1 << 0)的作用只是声明“要等待事件组的第0位”,不代表这个位默认是置1状态。调用xEventGroupCreate()创建事件组时,所有事件位的初始值全为0,你的代码在调用xEventGroupWaitBits()前,没有任何地方调用xEventGroupSetBits()把第0位置为1,等待条件始终不成立,函数自然会阻塞到设置的5秒超时阈值才返回。- 如果需要等待立即触发,只需要在WaitBits调用前添加置位代码即可:
xEventGroupSetBits(xMyEventGroup, MYTASK_Bit);
疑问2:MYTASK_Bit定义为(0 << 0)时,触发断言assert failed: xEventGroupWaitBits event_groups.c:371 (uxBitsToWaitFor != 0)是什么原因?
- 该断言的含义是:传入
xEventGroupWaitBits的待等待事件位参数不能为0。 - 触发原因很直接:
(0 << 0)的计算结果为0,相当于告知内核“我不需要等待任何事件位”,这个操作没有实际业务意义,属于非法入参,FreeRTOS的参数校验逻辑会直接触发断言拦截非法调用,避免后续逻辑异常。 - FreeRTOS事件组接口明确要求:调用等待事件位相关接口时,必须传入至少1个有效事件位,禁止传0作为等待掩码。
内容的提问来源于stack exchange,提问作者Zeni
相关产品推荐
相关产品推荐

