FreeRTOS同核多任务调度:任务延迟被超后的调度行为问题
问题描述
假设在同一内核上启动了Task 1与Task 2两个任务,调度器优先运行Task 1,Task 1调用vTaskDelay(100 / portTICK_PERIOD_MS)进入阻塞态,调度器随后切换至就绪态的Task 2运行,但Task 2执行需耗时200ms,此时Task 1会出现哪种情况:
- 调度器在100ms到后阻塞Task 2,切回Task 1执行
- 调度器持续运行Task 2至完成再切回Task 1,导致Task 1实际延迟大于100ms
曾尝试将Task 2阻塞时长设为超过Task 1的延迟时间,未复现预期现象。
补充测试:Task 1优先级高于Task 2场景
Task 1因优先级更高首先执行,运行中调用100ms延迟接口进入阻塞态;调度器周期性轮询所有任务状态,发现Task 1阻塞、Task 2就绪,便切换至Task 2运行;100ms延迟时间到后,调度器检测到Task 1进入就绪态,由于其优先级高于当前运行的Task 2,便阻塞Task 2切回Task 1执行;待Task 1运行完成后,调度器再切换回就绪态的Task 2继续执行。
调度逻辑说明
该调度逻辑依托任务通知机制:任务调用延迟接口时进入阻塞态,延迟时间到后收到通知进入就绪态;调度器会周期性检查任务状态,若发现优先级高于当前运行任务的就绪态任务,便会抢占当前任务,切换至高优先级任务执行。
最终结论
- a) 仅当Task 1优先级高于Task 2时,调度器会在100ms到后阻塞Task 2切回Task 1
- b) 仅当Task 1与Task 2优先级相同时,调度器会执行完Task 2再切回Task 1,导致Task 1实际延迟大于100ms
内容的提问来源于stack exchange,提问作者Georgi Peev
相关产品推荐
相关产品推荐

