调度任务
MQX提供如下任务调度策略:
a),FIFO(先来先服务)
b),时间片轮循(RR)
c),使用任务队列
第三种为可选组件,可以不做讨论。系统默认FIFO,同时,也可以通过在任务模板列表中指定任务属性来改变任务调度策略,倒数第三个参数。
FIFO(先来先服务)
是基于优先级抢占机制的调度方式,运行的任务是拥有最高优先级且等待时间最长的那个任务。当发生以下任意一种情况时,活动任务停止运行:
(1)由于调用了 MQX 阻塞功能函数,活动任务主动放弃处理器。
(2)产生了一个比活动任务优先级高的中断。
(3)更高优先级的任务已经处于就绪状态。
RR调度
RR 调度即时间片轮询调度方式,其将调度等待时间最长且未消耗自身时间片的任务。RR 调度的特点在于每个轮询任务有最长时间限制(时间片),在此时间内该任务可以被激活。
当一个活动的轮询任务的时间片用完时,MQX 将会保存该任务的现场参数,执行切换操作,并检查就绪队列选择优先级最高的任务进入激活状态。MQX 将已过期的任务放到任务就绪队列的末尾,这样就可以开始控制就绪队列中的下一个任务。如果在就绪队列中没有其他的任务,则到期的任务将继续运行。 在RR调度策略中,相同优先级的任务将以一种时间均等的方式共享处理器时间。如果多个具有相同优先级的任务进入就绪状态,则就绪队列中的最前面的任务将被激活。
任务切换
通过调用_time_delay(), _sched_execute_scheduler_internal()。MQX中的_sched_execute_scheduler_internal等系统服务主要由执行调度(SVC_RUN_SCHED)(SVC_TASK_BLOCK)(SVC_TASK_SWITCH)构成,他们通过执行svc #num;指令触发SVC中断,在_svc_handler中断服务例程中处理。在MQX中num服务号1为执行调度,2为任务阻塞,3为任务切换。SVC触发后必须立即得到响应,而PendSV不同,它可以像普通中断一样被推迟执行,推迟方法是往PendSV挂起寄存器中写1,推迟后优先级不够高则等待。
两个异常,第一个是SVC,另一个是PendSV。这两个异常都拿来给用户自定义用的,前一个一般用于系统调用,后一个一般用于任务切换。