ESP32中xTaskCreate创建的任务与主循环的优先级对比疑问
问题:FreeRTOS创建任务与主循环的优先级对比
在FreeRTOS中,xTaskCreate函数可指定uxPriority参数,数值越高代表任务优先级越高。现有如下代码,想知道通过xTaskCreate创建的myTask,和app_main中主循环(标注为myTaskMain)哪一个优先级更高?
void myTask(void *p) { // // Doing stuff... // } void init() { xTaskCreate(myTask, "myStuff", 8*1024, NULL, 1, NULL); // Priority 1 or any other number. } void app_main() { init(); while (1) { // // **myTaskMain** doing other stuff. // } }
解答
首先要明确:app_main所在的上下文本身就是一个FreeRTOS任务(比如在ESP-IDF这类基于FreeRTOS的开发框架中,app_main是系统启动后创建的第一个用户级任务)。
默认情况下,app_main对应的任务优先级为1(不同框架可能存在细微差异,但多数主流基于FreeRTOS的嵌入式框架都采用这个默认值)。
据此可分为三种情况判断优先级关系:
- 若
myTask的uxPriority设置为大于1的数值:myTask优先级更高,会抢占主循环的执行时间,主循环只有在myTask进入阻塞状态时才能获得CPU资源; - 若
myTask的uxPriority等于1:两者优先级相同,FreeRTOS会采用时间片轮转调度策略,交替分配CPU时间给两个任务; - 若
myTask的uxPriority小于1:主循环优先级更高,只有当主循环主动进入阻塞状态(比如调用vTaskDelay、等待队列/信号量等接口)时,myTask才有机会执行。
额外注意:如果主循环是纯while(1)死循环且没有任何阻塞操作,那么即使是同优先级的任务也无法获得执行机会——因为FreeRTOS的抢占式调度仅在当前任务主动放弃CPU(阻塞)或更高优先级任务就绪时才会触发任务切换。
内容的提问来源于stack exchange,提问作者decadenza
相关产品推荐
相关产品推荐

