如下图所示,在调度表中有很多 Expiry Points,下面是一个20ms的调度表。有每2.5ms触发一次2.5ms的TASK,以及等等其他按照时间的TASK触发;并且根据配置也可以看出,所有的任务都是基于全抢占模式触发的,也就是说,如果任务没有执行完,但是又更高优先级的任务进来了,此时,旧的任务将挂起,先执行新来的高优先级任务,等到高优先级任务执行完,再去执行旧的低优先级任务;但是这样触发有一个前提,第一个是两个任务都是在同一个Expiry Points点触发,此时按照全抢占模式处理。还有一个就是在达到期点 Expiry Points 时,旧的任务没有执行完,但是新的任务优先级又比较低,此时依旧会处理旧的高优先级任务,直到完成,新任务会等待下一个调度周期才会获得执行机会。除此之外,如果新的任务优先级比旧的任务的优先级高,会执行高优先级任务,旧的低优先级任务会等到下一个周期再去执行。
理解一个概念,调度表的周期性任务与alarm周期性任务,假设调度表任务的周期性与alarm任务的周期性是一致的,并且在各个周期性任务执行后,有更高优先级的周期性任务。如果到了触发时间,有高优先级的任务抢占了低优先级的任务,调度表触发的任务会将任务挂起,之后等到下一个周期在重新执行(前提条件是达到了Expiry Points),而alarm触发的任务是等高优先级任务执行完,就立即执行低优先级任务。
调度策略:
全抢占式:
非抢占式: