在FreeRTOS中,低优先级AppTaskCreate创建高优先级任务会被挂起吗?
FreeRTOS任务创建时的调度行为问题
你的理解存在偏差——当AppTaskCreate在调度器启动后执行,并创建优先级更高的任务时,这些高优先级任务会立即抢占AppTaskCreate,导致它被挂起。
具体逻辑如下:
vTaskStartScheduler()调用后,FreeRTOS调度器正式启动,此时会直接切换到当前就绪队列中优先级最高的任务执行。你代码里创建的AppTaskCreate优先级为1,所以调度器启动后它会率先运行。- 当在AppTaskCreate内部调用
xTaskCreate()创建更高优先级的任务时,xTaskCreate()函数内部会自动检查新任务优先级是否高于当前运行的任务(即AppTaskCreate)。如果是,FreeRTOS会触发即时上下文切换,暂停AppTaskCreate的执行,转而运行刚创建的高优先级任务。 - 调度器启动后,只要有更高优先级的任务进入就绪状态,调度就会立刻发生,并非仅在
vTaskStartScheduler()启动那一刻执行一次调度。
举个清晰的执行流程:
- 调用
xTaskCreate()创建AppTaskCreate任务(优先级1)。 - 调用
vTaskStartScheduler(),调度器启动,AppTaskCreate开始执行。 - AppTaskCreate内部调用
xTaskCreate()创建优先级为2的任务A。 - 由于任务A优先级更高,调度器立刻切换到任务A执行,AppTaskCreate被挂起;直到任务A主动让出CPU(比如调用
vTaskDelay()、xQueueSend()等阻塞API),或者任务A被删除,AppTaskCreate才会继续执行剩余逻辑。
另外你提供的代码存在几处语法错误,修正后的示例如下:
BaseType_t xReturn = xTaskCreate((TaskFunction_t) AppTaskCreate, (const char*) "AppTaskCreate", (uint16_t)512, (void*)NULL, (UBaseType_t)1, (TaskHandle_t*) &AppTaskCreate_Handle); vTaskStartScheduler();
内容的提问来源于stack exchange,提问作者pray
相关产品推荐
相关产品推荐

