10.2-uC/OS-III内部任务管理(任务状态)
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内部任务管理(任务状态)的更多相关文章
- uc/os iii移植到STM32F4---IAR开发环境
也许是先入为主的原因,时钟用不惯Keil环境,大多数的教程都是拿keil写的,尝试将官方的uc/os iii 移植到IAR环境. 1.首先尝试从官网上下载的官方移植的代码,编译通过,但是执行会报堆栈溢 ...
- uC/OS - III 移植 IAR平台
关于移植uC/OS-III 网上已经有很多教程了此处只是做个记录 首先下载源码然后解压得到下面的文件: 然后在模版工程里新建各种文件夹: 最后全部都添加进工程: OK了,编译一下,惊呆了,竟然 0错误 ...
- uC/OS II原理分析及源码阅读(一)
uC/OS II(Micro Control Operation System Two)是一个可以基于ROM运行的.可裁减的.抢占式.实时多任务内核,具有高度可移植性,特别适合于微处理器和控制器,是和 ...
- 基于μC/OS—III的CC1120驱动程序设计
基于μC/OS—III的CC1120驱动程序设计 时间:2014-01-21 来源:电子设计工程 作者:张绍游,张贻雄,石江宏 关键字:CC1120 嵌入式操作系统 STM32F103ZE ...
- 【小梅哥SOPC学习笔记】NIOS II处理器运行UC/OS II
SOPC开发流程之NIOS II 处理器运行 UC/OS II 这里以在芯航线FPGA学习套件的核心板上搭建 NIOS II 软核并运行 UCOS II操作系统为例介绍SOPC的开发流程. 第一步:建 ...
- 在STM32F401上移植uC/OS的一个小问题 [原创]
STM32F401xx是意法半导体新推出的Cortex-M4内核的MCU,相较于已经非常流行的STM32F407xx和STM32F427xx等相同内核的MCU而言,其特点是功耗仅为128uA/MHz, ...
- uc/os 任务删除
问题描述: uc/os 任务删除 问题解决: uc/os任务删除流程图 具体代码 注: 如上是关中断,以及取消优先级对应的就绪标志 关中断代码为: 取消就绪标志,实际上是将就绪表中指定 ...
- uc/os任务创建
问题描述: uc/os中任务创建 问题解决: 创建一个任务,任务从无到有.任务创建函数分两种, 一种是基本的创建函数OSTaskCreate, 另一种是扩展的任务创建函数OSTaskCrea ...
- uC/OS 的任务调度解析 (转)
uC/OS 的任务调度解析 1.任务调度器启动之后(初始化,主要是TCB的初始化),就可以创建任务,开始任务调度了,实际上第一个任务准确的说不是进行任务切换,而是进行启动当前最高优先级任务.uC/OS ...
- 关于uC/OS的简单学习(转)
1.微内核 与Linux的首要区别是,它是一个微内核,内核所实现的功能非常简单,主要包括: 一些通用函数,如TaskCreate(),OSMutexPend(),OSQPost()等. 中断处理函数, ...
随机推荐
- Spark学习笔记——泰坦尼克生还预测
package kaggle import org.apache.spark.SparkContext import org.apache.spark.SparkConf import org.apa ...
- Pika的设计及实现
Pika pika是360奇虎公司开源的一款类redis存储系统,主要解决的是用户使用 Redis 的内存大小超过 50G.80G 等等这样的情况,会遇到启动恢复时间长,一主多从代价大,硬件成本贵,缓 ...
- maven 打包报错(增加调试信息)
eclipse配置debug详细信息 如下图:
- vb编程学习之路之基础与概念总结
OOP (Object Oriented Programming)面向对象程序设计/面向对象编程 对象是代码和数据的集合,对象的三要素:属性.事件.方法 对象的命令规则:必须以字母或汉字开头,不能以数 ...
- MYSQL 如何完全卸载数据库
有时候MySQL不能完全卸载,这时候必须通过一些途径删除掉注册表和一些残余的文件,然后才能重新安装才可以成功! 1.控制面板——>所有控制面板项——>程序和功能,卸载mysql serve ...
- Centos下磁盘管理---分区
1.磁盘分区格式说明 linux分区不同于windows,linux下硬盘设备名为(IDE硬盘为hdx(x为从a—d)因为IDE硬盘最多四个,SCSI,SATA,USB硬盘为sdx(x为a—z ...
- centos7 安装redis服务及phpredis扩展
闲话少说 服务器版本:centos7.6 64位 软件包:https://pan.baidu.com/s/1Gb4iz5mqLqNVWvvZdBiOMQ 提取码: xrhx 一.安装redis 放在/ ...
- Code first 数据迁移
前段时间用到了EF,整理一下 EF ,全称Entity FramWork.就是微软以ADO.NET为基础发展的所谓ORM(对象关系映射框架,或者说是数据持久化框架). 简单说就是根据实体对象操作数据库 ...
- Python数据结构———队列
队列(Queue) 队列也是一系列有顺序的元素的集合,新元素的加入在队列的一端,叫做“队尾”(rear),已有元素的移除发生在队列的另一端,叫做“队首”(front),和栈不同的是,队列只能在队尾插入 ...
- C#打印标签
一个复杂的标签包括一个复杂的表格样式和二维码.条形码等内容.所以如果直接绘制的方式将会非常的麻烦,所以采用使用的方案是使用模板的方式:1.使用Excel创建出想要的模板的样式.2.对模板中的动态内容进 ...