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()等. 中断处理函数, ...
随机推荐
- .Net MVC Cache 缓存技术总结
一.细说 ASP.NET Cache 及其高级用法 二..Net环境下的缓存技术介绍 (转) 三.asp.net中缓存的使用介绍一 四.HttpContext.Current.Cache 过期时间
- Ubuntu下Apache虚拟主机+反向代理
反向代理 就是通过一台代理服务器,让Internet用户可以访问到内部网络上的服务器 下图中192.168.0.4 可以理解带有2个网卡,一个是公网ip,一个是192.168.0.4 代理内外中的2个 ...
- nginx负载均衡一:基础知识
基础信息 nginx 的 upstream目前支持 4 种方式的分配 1).轮询(默认) 每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除. 2).weight ...
- python中,numeric(数字类型)和integer(整型)的区别
说明: 在今天做int实现的过程中,官方函数的解释是将numeric转换为integer,就突然不明白,两个有啥区别. numeric-数字类型包括: int,float,bool,complex i ...
- 理解Generic.xaml和Themes
"Generic.xaml"这个名称并非偶然 通过上面的叙述,你可能会有冲动将Generic.xaml中的Style代码剪切出来,粘贴到任何一个我们的控件可以找到的地方,然后把Ge ...
- ios开发之--valueForKeyPath的用法
1.获取数组中的平均值,最大值,最小值,总和,代码如下: NSArray *ary = @[@,@,@,@,@,@,@]; [self caculateArray:ary]; -(NSString * ...
- .bat文件调用java类的main方法
此处记录一个小例子,备用,说不定哪天写小工具时会用到. @echo on set JAVA_HOME=C:\Program Files\Java\jdk1.6.0_43 set classpath=. ...
- Android编译环境——ubuntu12.04上android2.3.4编译错误以及解决
Android编译环境——ubuntu12.04上android2.3.4编译错误以及解决 分类: android应用开发2013-08-21 09:20 4222人阅读 评论(3) 收藏 举报 li ...
- MVC和普通三层架构的区别
MVC和普通三层架构的区别 其中这里的模型(Model)和视图(View )是完全区别于三层架构中的模型(Model)和视图(View)的. MVC 1)MVC中的模型(Model)指的是数据模型,用 ...
- 部门sonarque代码扫描测试服务器docker化
部门内部的服务器太多了,打算将对应的测试环境docker化. 转成docker后,以后不管是升级调研还是定制化开发测试都方便,就是事情太多,一直没有抽出身来做,今天处理下并把过程记录下来跟大家分享下. ...