12.0-uC/OS-III任务调度

调度器,决定了任务的运行顺序。 uC/OS-III是一个可抢占的, 基
于优先级的内核。根据其重要性每个任务都被分配了一个优先级。
uC/OS-III支持多个任务拥有相同的优先级。

1.抢占式调度

uC/OS-III通过两种方法处理中断提交的事件:直接提交或延迟提交。

调度的角度看, 这两种方法产生的结果是一样的;

最高优先级的就绪任务会占用CPU

直接提交:

1)一个低优先级任务正在执行,这时中断发生了。

2)如果中断使能,指令指针IP会跳转到中断服务程序。
3)中断服务程序处理相关的程序,发送信号量或消息给一个
高优先级任务。高优先级任务被就绪。

4)中断服务程序完成操作后,它将CPU的控制权还给uC/OS-III

5uC/OS-III执行相应的操作。
6) 因为就绪队列中有一个更重要的任务, uC/OS-III将不会返
回中断前那个低优先级的任务。而是执行高优先级任务。
7)开始执行高优先级任务
8)高优先级任务处理完成后,将CPU的控制权交给uC/OS-III

9uC/OS-III执行相应的操作。
10uC/OS-III转向执行原先那个低优先级任务。
11)低优先级任务从被中断处继续执行。

延迟提交:

当选择延迟提交中断产生的事件的方式时的一些额外步
骤。最后的结果是一样的:高优先级任务抢占了低优先级任务。

 

1)中断服务程序中,不是直接发送信号量或消息给任务。而

是先将信号量或消息放人外部消息队列,并就绪中断处理任务。
 2)当ISR处理完它的工作时,就把CPU的使用权交给
uC/OS-III

3uC/OS-III处理一些操作。

4)因为中断处理任务被就绪, uC/OS-IIICPU的使用权交给它。

5uC/OS-III处理一些操作。
6) 中断处理任务将外部消息队列中的消息移除并重新提交给
相应的任务。这样,就将这个过程消息提交从中断级变成了任务级。
使用这种方法的目的是为了减小关中断时间(详见第
9章)。当消息
队列为空时,
uC/OS-III将中断处理任务从就绪队列中移除,然后执
行就绪队列中的最高优先级任务。

2.调度点

当出现以下情况时会发生调度:
(1).任务被标记或发送消息给另一个任务

 

(2).任务调用OSTimeDly()OSTimeDlyHMSM():

(3).任务所等待的事件发生或超时

(4).任务取消挂起

(5).新任务被创建

(6).任务被删除

(7).内核对象被删除

(8).任务改变自身的优先级或其它任务的优先级

(9).当任务通过调用OSTaskSuspend()停止自身

(10).任务调用OSTaskResume()恢复其它停止了的任务

(11).退出中断服务程序

(12).通过调用OSSchedUnlock()调度器被解锁

(13).调用OSSchedRoundRobinYield()任务放弃了分配给它的时间片

(14).用户调用OSSched()

3.循环轮转调度

当多个任务有相同的优先级时, uC/OS-III允许每个任务运行规定
的时间片。 当任务没有用完分配给它的时间片时, 它可以自愿地放弃
CPUuC/OS-III允许任务在运行时开启或者关闭循环轮转调度。

图, 有三个优先级都为X的任务。为了说明,时间片的长度为4

 

1)任务3正在被运行。在这段时间内,时基中断发生,但任
3还没有到期。
2)任务3主动放弃剩下的时间片。
3uC/OS-III恢复任务1,因为它是队列中任务3的下一个任
务。
4)任务1被执行直到分配给它的时间片到期。

5)任务3正在被运行。在这段时间内,时基中断发生,但任
3还没有到期。
6)任务3主动放弃剩下的时间片。
7) 有趣的事情发生了, uC/OS-III会重新设置任务1的时间片
长度为
4个时基。 但剩余时间片的计数是每个时基中断递减, 即在第
4个时基中断发生时时间片到期。 而任务1是在时基即将发生时接手
的,所以事实上它的时间片会少一个时基。

8) 任务1执行, uC/OS-III允许用户在任务运行时修改时间片
的长度( 通过
OSSchedRoundRobinCfg())。 这个函数也
可以用于开启或关闭循环轮转调度。

uC/OS-III允许用户为每个任务设置不同的时间片。 不同的任务可
以有不同的时间片。 当任务被创建时, 其时间片长度被设置。 也可以
在运行时调用
OSTaskTimeQuantaSet()修改。

 

posted @ 2018-07-31 17:02  西贡小傻  Views(217)  Comments(0Edit  收藏  举报