原帖 | 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
相关笔记