ucos-ii的任务
- 任务状态
ucos-ii是按照系统中只有一个CPU来设计的,所以任何一个时刻只会有一个任务在占用CPU处于运行状态,而其他任务只能处于其他状态。所以ucos-ii操作系统中将任务分成了5种状态,分别是:
任务的状态 | 说明 |
---|---|
睡眠状态 | 任务在没有配备任务控制块或被剥夺了任务控制块时的状态叫做任务的睡眠状态 |
就绪状态 | 系统为任务配备了任务控制块且在任务就绪表中进行了就绪登记时,任务具备运行条件,这时就是就绪状态 |
运行状态 | 等其他任务优先级高于就绪状态的任务的任务都处于等待状态时,就绪任务就会获得CPU使用权,从而进入运行状态 |
等待状态 | 当正在运行的任务需要等待一段时间或等待一个事件发生再运行时,就会把CPU使用权让出去,进入等待状态 |
中断服务状态 | 一个正在运行的任务一旦响应中断就会中止运行而去执行中断服务函数,这时就是中断服务状态 |
-
任务分类
ucos-ii任务可以分为两种:用户任务和系统任务。
用户任务就是我们自己写的任务。系统任务是ucos-ii的系统自带的任务,比如空闲任务和统计任务。 -
任务优先级
前面介绍任务状态时,假如有两个任务都处于就绪状态,当正在运行的任务进入等待状态时,那这两个就绪任务谁去先运行呢?这就是优先级的作用了。每个任务都有一个优先级,注意ucos-ii中的任务优先级有唯一性,所以优先级也可以作为任务的标识。优先级在创建任务时调用的OSTaskCreate()函数的参数中会有确定任务优先级的参数。用数字0,1,2…64表示,数字越小,优先级越高。 -
任务的创建
我想创建一个任务,那ucos-ii的任务到底是个什么东西呢?同样是c语音编写代码,所以一定也是c语音的范畴之内的东西了,先说一下,创建任务实际就是创建一个任务控制块,任务控制块实际就是个c语音中所说的结构体,它包括了一堆必要的东西去描述任务,而且把任务代码和任务堆栈关联起来形成了一个完整的任务。那刚刚提到的“任务控制块”、“任务堆栈”又是什么呢?稍后再总结。
继续说任务创建,ucos-ii有两个用来创建任务的函数:OSTaskCreate()和OSTaskCreateExt()。其中OSTaskCreateExt()是OSTaskCreate()的扩展,并提供了一些附加功能,比如我想监控我任务的运行情况时,就可以使用OSTaskCreateExt()来创建任务,但用Ext()来创建任务也会增加一些额外的开销。OSTaskCreate()和OSTaskCreateExt()的函数源码不总结了。讲一下创建任务时注意的点,ucos-ii有个规定就是在调用启动任务函数OSStart()之前,必须已经创建了至少一个任务,所以,在调用OSStart()函数之前,一般会创建一个起始任务,再调用OSStart()让任务调度开始,然后在起始任务中再创建其他任务。
好了,现在开始说“任务控制块”、“任务堆栈”分别是个啥东西。 -
任务控制块和任务堆栈
先说任务堆栈:ucos-ii可以创建很多任务,比如说创建了三个,那这三个任务就会在ucos-ii的调度下,根据优先级和自身运行状态等条件进行切换运行。任务1运行一会儿,然后任务3运行一会儿,然后任务2运行一会儿,然后任务1运行一会儿…当任务切换的速度快了,看起来就好像三个任务在同时运行。这里提到的任务切换,实际上在切换到另一个任务运行时需要保存当前任务的运行状态(寄存器中的值等等),等到切换回来,又是当前任务运行时再恢复切换前的状态,就好像运行没有中断一样。那任务运行状态保存到哪呢?所以每个任务都需要一个存储空间去存,这就是堆栈,所谓堆栈,就是存储器中按数据“后进先出(LIFO)”的原则组织的连续存储空间,它满足了任务切换和响应中断时保存CPU寄存器中的内容及任务调度用其他函数时的需要。
任务堆栈在ucos-ii中,实际就是个数组,创建一个数组,然后把数组的指针与任务关联起来,到时,任务存数据的时候就会存到这个数组了。
关于任务堆栈要注意的点就是在数组中存数据是向上增加还是向下增加是与处理器有关系的,注意这一点。另外还有任务堆栈的初始化,这个初始化会在在创建任务时进行,详细过程就暂时不总结了。
再说任务控制块:上面说到任务控制块实际就是个结构体,里面包含了关于任务的很多属性信息,这就是任务控制块,它相当于一个任务的身份证,系统就是通过任务控制块来感知和管理任务的,没有任务控制块的任务不能被系统承认和管理。ucos-ii把系统所有任务的控制块链接为两条链表,并通过它们管理各个任务。这部分只通过语音描述是不能建立对它们的认识的,还是结合程序去理解比较好理解。