如果系统开始运行后,A任务运行了0.5S就DELAY阻塞

🔍 溯源 ✍️ Jack | 📅 2025-12-16 | 👍 2 | 原帖↗
#知识星球 #立芯嵌入式 #来源/立芯星球 #技术/FreeRTOS #技术/任务调度 #质量/普通

原帖 | Jack | 2025-12-16 20:56 | 👍2 | 阅读约1

如果系统开始运行后,A任务运行了0.5S就DELAY阻塞了,但一个SYSTICK周期只过去一半,这时触发调度之后下一个任务是不是只会运行剩下的0.5S,然后下下次调度就又触发了?

假如最开始是A运行,Systick周期是10ms,从t=0ms开始,A运行4ms然后delay之后,这个任务A就会被放进阻塞列表(这时候t=4ms),然后就绪列表的下一个任务B就会被切换出来,开始从t=4ms开始运行,接着运行了6ms,pendsv中断中会判断是否有其他同优先级任务,如果有则立马切换到C(这时候是t=10ms的时候切换),然后下次就是t=20ms的时候systick再次产生中断pendsv,这时候就会发生时间片到任务B(时间片与 SysTick 的概念辨析见 抢占模式下,每个systick 都会去判断有没有高优先级任务就绪,时间片是时间片

t = 0ms
SysTick
A 运行

t = 4ms
A vTaskDelay(100)
→ A Blocked
→ PendSV
→ B 运行

t = 10ms
SysTick
→ 发现 B、C 同优先级
→ PendSV
→ 切换到 C

t = 20ms
SysTick
→ 发现 B、C 同优先级
→ PendSV
→ 切换到 B


相关笔记