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

1.抢占式调度

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

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

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

直接提交:

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

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

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

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

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

延迟提交:

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

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

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

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

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

( 5) uC/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允许每个任务运行规定
的时间片。 当任务没有用完分配给它的时间片时, 它可以自愿地放弃
CPU。 uC/OS-III允许任务在运行时开启或者关闭循环轮转调度。

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

( 1)任务3正在被运行。在这段时间内,时基中断发生,但任
务3还没有到期。
( 2)任务3主动放弃剩下的时间片。
( 3) uC/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()修改。

12.0-uC/OS-III任务调度的更多相关文章

  1. uC/OS 的任务调度解析 (转)

    uC/OS 的任务调度解析 1.任务调度器启动之后(初始化,主要是TCB的初始化),就可以创建任务,开始任务调度了,实际上第一个任务准确的说不是进行任务切换,而是进行启动当前最高优先级任务.uC/OS ...

  2. uc/os iii移植到STM32F4---IAR开发环境

    也许是先入为主的原因,时钟用不惯Keil环境,大多数的教程都是拿keil写的,尝试将官方的uc/os iii 移植到IAR环境. 1.首先尝试从官网上下载的官方移植的代码,编译通过,但是执行会报堆栈溢 ...

  3. uC/OS - III 移植 IAR平台

    关于移植uC/OS-III 网上已经有很多教程了此处只是做个记录 首先下载源码然后解压得到下面的文件: 然后在模版工程里新建各种文件夹: 最后全部都添加进工程: OK了,编译一下,惊呆了,竟然 0错误 ...

  4. 【原创】uC/OS II 任务切换原理

    今天学习了uC/OS II的任务切换,知道要实现任务的切换,要将原先任务的寄存器压入任务堆栈,再将新任务中任务堆栈的寄存器内容弹出到CPU的寄存器,其中的CS.IP寄存器没有出栈和入栈指令,所以只能引 ...

  5. uC/OS II原理分析及源码阅读(一)

    uC/OS II(Micro Control Operation System Two)是一个可以基于ROM运行的.可裁减的.抢占式.实时多任务内核,具有高度可移植性,特别适合于微处理器和控制器,是和 ...

  6. uc/os任务创建

    问题描述:      uc/os中任务创建 问题解决: 创建一个任务,任务从无到有.任务创建函数分两种, 一种是基本的创建函数OSTaskCreate, 另一种是扩展的任务创建函数OSTaskCrea ...

  7. VMware 12安装Mac OS X 10.11&解决上网的问题

    近日想在Win10上安装Mac OS 玩玩,于是上网搜了相关资源,查看了相关经验分享,开始着手安装.系统很快成功安装,但最大问题是虚拟机中的Mac OS无法上网.费了很长时间,最终看到Ping通结果, ...

  8. kubernetes之Kubeadm快速安装v1.12.0版

    通过Kubeadm只需几条命令即起一个单机版kubernetes集群系统,而后快速上手k8s.在kubeadm中,需手动安装Docker和kubeket服务,Docker运行容器引擎,kubelet是 ...

  9. 【原创】uC/OS 中LES BX,DWORD PTR DS:_OSTCBCur的作用及原理

    LES BX, DWORD PTR DS:_OSTCBCur ;OSTCBCur->OSTCBStkPtr = SS:SP!!! ], SS ;将当前SS(栈的基地址)寄存器值存放至当前任务控制 ...

  10. 基于μC/OS—III的CC1120驱动程序设计

    基于μC/OS—III的CC1120驱动程序设计 时间:2014-01-21 来源:电子设计工程 作者:张绍游,张贻雄,石江宏 关键字:CC1120   嵌入式操作系统   STM32F103ZE   ...

随机推荐

  1. Delphi XE以后的版本 程序如何瘦身

    第一步:关闭debug infomation. 打开工程后,依次点击project--option--delphi compiler--linking 将右边Debug information改为Fa ...

  2. TCP 协议简析

    TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的.可靠的.基于字节流的通信协议,数据在传输前要建立连接,传输完毕后还要断开连接.它是个超级麻烦的协议, ...

  3. 如何用cmd命令递归文件夹中的所有特定文件,拷贝到另一个文件夹中

    现在有一个文件夹,里面有很多子文件夹,每个子文件夹中有很多不同类型的图片,现在想将其所有.png图片整理出来,一开始我是手动拷贝的,拷贝了几个图片后,突然想能不能让计算机来自动完成此项功能,经过一番尝 ...

  4. 程序猿必备的8款web前端开发插件三

    1.HTML5 Canvas 3D波浪翻滚动画 之前我们分享过好几款基于HTML5 Canvas的波浪和水波纹动画,比如这款HTML5 3D波浪起伏动画特效和这款超酷无比的HTML5 WebGL水面水 ...

  5. Linux零基础入门第五课

    文件的基本操作(下) 文件属性 file命令 语法 >$ file file0 [file1 file2 ...] file命令用于确认文件的类型. 在Linux下,通常并不会严格按照文件扩展名 ...

  6. JDK 自带的观察者模式源码分析以及和自定义实现的取舍

    前言 总的结论就是:不推荐使用JDK自带的观察者API,而是自定义实现,但是可以借鉴其好的思想. java.util.Observer 接口源码分析 该接口十分简单,是各个观察者需要实现的接口 pac ...

  7. shadowMap

    采用PCF软化阴影,感觉还是不够柔软

  8. 基金 、社保和QFII等机构的重仓股排名评测

    基金前15大重仓股持仓股排名 基金重仓前15大个股,相较于同期沪深300的平均收益, 近1月:2.45%, 近3月:10.0%, 近1年:11.22%, 近3年:105.23%. 1,中国平安(SH6 ...

  9. [原]win10下编译lua5.3.4

    1.下载lua源码http://www.lua.org/ftp/ 2.打开vs2012工具命令提示 3.cd 到lua源码的src目录 4.依次执行以下代码 cl /MD /O2 /c /DLUA_B ...

  10. linux命令中的字符串中间增加指令,例如路径中增加日期变量,实时获取当前的日期

    `command` 倒引号 (backticks) 在前面的单双引号,括住的是字串,但如果该字串是一列命令列,会怎样?答案是不会执行.要处理这种情况,我们得用倒单引号来做.fdv=`date +%F` ...