freertos中任务的调度方式

freertos中任务调度⽅式
⼀、freertos的调度⽅式
在单核⼼处理器在任何给定时间只能有⼀个任务处于运⾏状态
FreeRTOS操作系统⽀持三种调度⽅式:抢占式调度(Pre-emptive),时间⽚调度(time slice)和合作式调度(co-operative)。实际应⽤主要是抢占式调度和时间⽚调度结合的调度⽅法,合作式调度⽤到的很少。
co-operative = Non-Pre-emptive = 不可剥夺 = ⾮抢占式
Pre-emptive = 抢占式 = 可剥夺
1、抢占式调度(Pre-emptive)
Pre-emptive scheduling algorithms will immediately ‘pre-empt’ the Running state task if a task that has a priority higher than the Running state task enters the Ready state. Being pre-empted means bein involuntarily (without
explicitly yielding or blocking) moved out of the Running state and into the Ready state to allow a different task to enter the Running state.
CPU总是运⾏多个任务中优先级别最⾼的那个任务,即使CPU正在运⾏某个低级别的任务,当有更⾼优先级别的任务准备就绪时,更⾼优先级别的任务就会剥夺正在运⾏任务的CPU使⽤权,从⽽使⾃⼰获得CPU的使⽤权。
上图中任务优先级:
照射雷达
Task1 > Task2 > Task3 > idle Task
空闲任务以最低优先级运⾏,因此每次更⾼优先级的任务进⼊就绪状态时都会被抢占——例如,在时间 t3、t5 和 t9。桂系演义
task 3 是⼀个事件驱动的任务,以相对较低的优先级执⾏,但⾼于空闲优先级。
男性研发重大突破task 2是是⼀个周期性任务,分别在t1、t6和t9执⾏。
2、合作式调度(co-operative)
When the co-operative scheduler is used, a context switch will only occur when the Running state task enters the Blocked state, or the Running state task explicitly yields (manually requests a re-schedule) by calling taskYIELD().
Tasks are never pre-empted, so time slicing cannot be used.
使⽤合作调度器时,只有在Running状态任务进⼊Blocked状态,或者Running状态任务通过调⽤taskYIELD()显式让步(⼿动请求重新调度)时才会发⽣任务切换。 任务永远不会被抢占,因此不能使⽤时间切⽚。
虚线表⽰任务处于就绪状态
task 1 具有最⾼优先级。 它以阻塞状态开始,等待信号量。在时间 t3 ⼀个中断给出信号量,导致任务 1 离开阻塞状态并进⼊就绪状态。但是在co-operative调度模式下task1并不会⽴即执⾏,因为task3还在占⽤调度器。
task 2:在时间 t2 task2 是最⾼优先级的就绪状态任务,但由于是co-operative调度模式,task2并不会⽴即执⾏,除⾮task3进⼊阻塞状态或者调⽤taskYIELD()。在T4,task3调⽤taskYIELD()让出调度器,但此时task 1 是最⾼优先级的就绪状态任务,所以任务 2 并没有真正执⾏,直到任task1 在 t5 重新进⼊阻塞状态。
3、时间⽚调度(time slice)
在FreeRTOS操作系统中只有同优先级任务才会使⽤时间⽚调度。最常⽤的的时间⽚调度算法就是Round-robin调度算法(时间⽚轮
转),freertos就是⽤的该算法。⼀个时间⽚等于freertos中滴答定时器的时间间隔。
上图中任务优先级:
Task1 = Task2 = Task3 = Task4
先运⾏Task1,运⾏够⼀个时间⽚后,通过时间⽚调度切换到Task2。Task2 运⾏够⼀个时间⽚后,通过时间⽚调度切换到Task3。
Task3 在运⾏期间调⽤了阻塞式 API 函数,虽然⼀个时间⽚还没有⽤完,此时依然会通过时间⽚调度切换到下⼀个任务 Task4。 (注意,没有⽤完的时间⽚不会再使⽤,下次任务 Task3 得到执⾏还是按照 ⼀个时间⽚运⾏),任务 Task4 运⾏够⼀个时间⽚后,通过时间⽚调度切换到任务 Task1。
⼆、抢占式调度和时间⽚调度结合的调度⽅法
这种⽅法是freertos中常⽤的调度⽅法,⽰意图如下:
上图中的优先级:
task 1 > task 2 = idle task
上图中⼀个新的时间⽚开始在每⼀个滴答定时器中断上,t1、t2、t3、t4、t5、t8、t9、t10 和 t11。
在t1 - t5,只有task2和idle task两个任务,这两个task 优先级相等(都是0),因此调度器将轮流执⾏这两个任务。即t1 - t2分配给idle task,t2 - t3分配给task2,t3 - t4分配给idle task .......(t1 -t2时间间隔也就是time slicing,⼀般是systick中断时间)。
在t5 -t8时间段,前段在执⾏idle task,中段task1打断了idle task,task 1执⾏完毕之后,由于要轮流执⾏,所以后段执⾏的是task2。到了t8,到了下⼀个slice time,切换到idle task继续执⾏。
在上图中,task2和idle task的优先级相同(都是0)。则在没有其他更⾼优先级的任务的时候,这两个任务轮流调度。但如果task2有⼯作要做,但idle task是空任务,那么将那么多处理时间分配给idle task可能是不可取的。因此,freertos中可以通过设置谷氨酸发酵
configIDLE_SHOULD_YIELD来减⼩idle task的占⽤时间。
如果 configIDLE_SHOULD_YIELD 设置为 0,则空闲任务将在其整个时间⽚内保持运⾏状态,除⾮它被更⾼优先级的任务抢占。(就是上⾯图⽚的所⽰)
如果 configIDLE_SHOULD_YIELD 设置为 1,那么如果有其他空闲优先级任务处于就绪状态,则空闲任务将在其循环的每次迭代中让步(⾃愿放弃其分配的时间⽚的剩余部分)。如下图所⽰:
社会化用工>tua
ref:

本文发布于:2024-09-21 01:37:02,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/284460.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:任务   时间   调度   状态   就绪   抢占   式调度   切换
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议