1.任务状态
从用户的观点来看,任务可以是有 5种状态,见图 5-6。展示了任务状态间的转换关系。
{休眠状态,就绪状态,运行状态,挂起状态,中断状态}

(1).处于休眠状态的任务驻留于内存但未被uC/OS-III使能。通过调用OSTaskCreate()函数uC/OS-III创建任务。 任务代码是存在于ROM的。但需要用OSTaskCreate()函数通知uC/OS-III关于任务的相关信息。如果任务的使命完成了,就要调用 OSTaskDel()删除该任务。OSTaskDel()实际上不是删除任务的代码,只是让任务不再具有使用CPU的资格而已。
(2).就绪状态的任务根据优先级有序地排列于就绪列表中。就绪列表中对就绪任务的个数没有限制。
(3). 正在运行的任务被置为运行状态。 在单CPU中, 任何时刻只能有一个任务被运行。当应用程序调用 OSStart()或者调用 OSIntExit()或者调用OS_TASK_SW()时 uC/OS-III从就绪队列中选择优先级最高的任务去运行。正如前面所提到的,有些时候任务必须等待某些事件发生,若事件还未发生时,任务就会被设置为挂起状态。
(4).挂起状态的任务被放置在挂起列表中以表明任务在等待某些事件的发生。 等待的时候, 任务是不会占用CPU的。 事件发生时,该任务会被放到就绪队列中。 在这种情况下, 正在运行的任务可能会被抢占 ( 被放回就绪列表), 并由uC/OS-III选择优先级最高的任务去运行。换句话说,如果新的任务优先级最高,那么它就会被立即运行。
请注意, 调用OSTaskSuspend()会任务无条件地停止运行。 有些时候调用 OSTaskSuspend()不是为了等待某个事件的发生,而是等待另一个任务调用OSTaskResume()函数恢复这个任务。
(5).若中断发生, 中断会挂起正在执行的任务并去处理ISR。ISR中可能有某些任务等待的事件。 一般来说, 中断用来通知任务某些事件的发生,并让在任务级处理实际的响应操作。 ISR程序越短越好,实际响应中断的操作应该被设置在任务级以便能让 uC/OS-III管理这些操作。 ISR中只允许调用一些提交函数(OSFlagPost(),OSQPost(),OSSemPost() , OSTaskQPost() , OSTaskSemPost()) ,除 了OSMutexPost()。因为mutex只允许在任务级被修改。
2.任务追踪
uC/OS-III一直追踪着任务的状态如图 5-7。事实上,这些都是以
一个变量的形式保存在每个任务的 TCB中。图小括号中的数值表示
着任务的状态,每个任务都可以有 8 种状态。(详见 OS.H,
OS_TASK_STATE_???)
图中不包括休眠态, 因为uC/OS-III不支持休眠态。 在这里, 中断
以及中断的嵌套会有更深的讲解。

(0).状态 0表示任务已经就绪。每个任务在被运行之前都必须处于就绪状态。
(1).任务可以通过调用 OSTimeDly()或者 OSTimeDlyHMSM()等待期满。 当期满或者延时删除时 ( 通过调用OSTimeDlyResume()),任务会转为就绪状态。
(2).任务可以通过调用挂起函数 ( OSFlagPend(),OSMutexPend(),OSQPend, OSSemPend, OSTaskQPend(), OSTaskSemPend())等待某事件的发生。 当事件发生时、 该任务被删除、 或者被另一个任务取消等待时,等待停止。
(3).如前面所说,任务可以等待事件发生。但任务也可以被设等待多少时间。 如果在这段时间内事件没有发生, 任务也会被设为就绪状态,并通知这个任务是等待超时而被挂起的。{挂起函数都有一个关于函数执行结果错误代号,可以查看这个代号知道任务是因何被就绪的}
(4).任务暂停自己或者被其他任务暂停(通过调用OSTaskSuspend())。暂停中的任务只能通过调用OSTaskResume()被恢复。
(5).一个延时中的任务也可以被其它任务设置为停止。在这种情况下, 效果会被叠加。 换句话说, 延时需被执行、 停止状态需被解除。该任务才会被执行。
(6).一个挂起状态中的任务也可能被其它任务设置为停止。同样的, 效果会被叠加。 事件发生且停止状态被移除后, 任务才会被执行。
(7).任务可以等待事件的发生,但可以给它设定一个期限。同样的, 它也可能被设为停止, 效果是叠加的。 除非移除停止状态并事件发生或等待事件超时,任务才会被执行。

10.2-uC/OS-III内部任务管理(任务状态)的更多相关文章

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

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

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

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

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

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

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

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

  5. 【小梅哥SOPC学习笔记】NIOS II处理器运行UC/OS II

    SOPC开发流程之NIOS II 处理器运行 UC/OS II 这里以在芯航线FPGA学习套件的核心板上搭建 NIOS II 软核并运行 UCOS II操作系统为例介绍SOPC的开发流程. 第一步:建 ...

  6. 在STM32F401上移植uC/OS的一个小问题 [原创]

    STM32F401xx是意法半导体新推出的Cortex-M4内核的MCU,相较于已经非常流行的STM32F407xx和STM32F427xx等相同内核的MCU而言,其特点是功耗仅为128uA/MHz, ...

  7. uc/os 任务删除

    问题描述:     uc/os 任务删除 问题解决: uc/os任务删除流程图 具体代码 注:     如上是关中断,以及取消优先级对应的就绪标志 关中断代码为: 取消就绪标志,实际上是将就绪表中指定 ...

  8. uc/os任务创建

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

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

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

  10. 关于uC/OS的简单学习(转)

    1.微内核 与Linux的首要区别是,它是一个微内核,内核所实现的功能非常简单,主要包括: 一些通用函数,如TaskCreate(),OSMutexPend(),OSQPost()等. 中断处理函数, ...

随机推荐

  1. Mysql系列五:数据库分库分表中间件mycat的安装和mycat配置详解

    一.mycat的安装 环境准备:准备一台虚拟机192.168.152.128 1. 下载mycat cd /softwarewget http:-linux.tar.gz 2. 解压mycat tar ...

  2. Angular4学习笔记(六)- Input和Output

    概述 Angular中的输入输出是通过注解@Input和@Output来标识,它位于组件控制器的属性上方. 输入输出针对的对象是父子组件. 演示 Input 新建项目connInComponents: ...

  3. ABBYY FineReader Pro for Mac有哪些特性(下)

    使用ABBYY FineReader Pro for Mac轻松转换纸质文档.PDF文件和数字文本照片为可编辑和可搜索的文件,再也不需要手动重新输入或格式化了,相反,可以编辑.搜索.共享.归档和复制文 ...

  4. [Bayes] runif: Inversion Sampling

    runifum Inversion Sampling 看样子就是个路人甲. Ref: [Bayes] Hist & line: Reject Sampling and Importance S ...

  5. 解决Win10 Virtualbox5.2.18桥接不能联网小记

    1.设备管理器,右键没添加过时硬件(如果没有,则在cmd中键入命令hdwwiz C:\windows\system32>hdwwiz),按照如下图操作 如此安装Microsoft KM-TEST ...

  6. Linux Platform驱动模型(三) _platform+cdev

    平台总线是一种实现设备信息与驱动方法相分离的方法,利用这种方法,我们可以写出一个更像样一点的字符设备驱动,即使用cdev作为接口,平台总线作为分离方式: xjkeydrv_init():模块加载函数 ...

  7. elastaicsearch基础----->elastaicsearch的使用(一)

    这里面我们总结一下es的一些基础使用. es的基础用法 一.es索引的创建 在postman中,请求url地址:192.168.1.112:9200/user.请求方式:PUT.请求内容如下: { & ...

  8. QT 获取电脑时间

    使用环境: VS2010 & QT Designer5 #include <QDateTime>  //包含头文件 QDateTime local(QDateTime::curre ...

  9. Git版本控制工具的简单使用

    1.下载gitd客户端,注册github账号. 2.本地生成公钥和私钥,并将公钥粘贴到github上,测试连接. 3.先pull,从远程服务器中下载项目文件,然后再pushi,提交至服务器. 4. g ...

  10. thinkphp 无限极 评论

    郑创 今天用啦一天的时间用了各种方法终于把评论成无限极了,随便评论,有判断自己不能评论自己,下面先说前台源代码! 要实现的视图 前台源代码html模板 <div class="wen_ ...