关于抢占调度模式(时间片调度不

🔍 溯源 ✍️ Jack | 📅 2024-09-11 | 👍 0 | 原帖↗
#知识星球 #立芯嵌入式 #来源/立芯星球 #技术/FreeRTOS #技术/任务调度 #技术/优先级继承 #质量/普通

原帖 | Jack | 2024-09-11 16:35 | 👍0 | 阅读约1

关于抢占调度模式(时间片调度不开):

FreeRTOS在在抢占式调度任务的模式下(时间片切换不开),如果A和B是两个优先级相同的任务,假如A正在运行串口打印,并且一直没有调用osDelay(1);之类的让出当前CPU的操作,那么B是不会得到运行机会的。同样,如果B先获得CPU的运行权,如果没有让出CPU,那么A也不可能得到运行。但是有种例外可以颠倒这种情况:

有三个线程,线程A、线程B和线程C。A和B有一样的优先级,如果有一个线程C,它的优先级比A和B都要高,并且A和C之间有一把互斥锁。系统上电时,线程C处于阻塞状态,线程A和线程B都处于就绪状态。此时,B先启动,先获得了运行机会,如果接下来线程B如果没有执行osDelay(1);之类的让出当前CPU的操作,则线程B一直会占有线程,A并不会得到运行。若此时,处于阻塞状态的线程C处于就绪态,则在任务链表里,FreeRTOS会立刻开始执行线程C,线程C的启动会先尝试获取互斥锁,但若此时互斥锁已经被线程A取得,则线程C将会阻塞,FreeRTOS会立刻将线程A的优先级提高至C一样的优先级(互斥锁与优先级继承的概念见 FreeRTOS中互斥锁和信号),并让A执行到释放掉互斥锁后,立刻唤醒线程C,继续执行。

如果同时打开抢占模式,和时间片切换,那么每到时间片到来时,相同优先级任务就会切换。


相关笔记