uCOS-II操作系统内核的主要工作就是对任务进行管理和调度,理解什么任务、任务的结构和ucos-II对任务的管理办法,对了解uCOS-II的体系结构无疑是最重要的。
任务的基本概念:
当我们在开发一个复杂的项目时,一个简单有效的方法就是“分解”,将大的应用项目分解成若干小的项目,在计算机中运行这些小的项目,也就完成大的项目开发。
在uCOS-II中把上述小项目对应的程序实体叫做‘任务’,uCOS-II对这些小项目进行管理和调度,从而可以并发方式执行这些小任务的多任务操作系统。通常处理器就一个,系统中的多任务以一种被处理器轮询的方式处理,宏观上看就像在并发处理,处理器始终处于工作状态,从而提高运行效率。
操作系统想要管理任务,通过任务控制块,就是形同上一届说到的控制块那个结构体中的函数指针指向的C函数,表面上看很类似,其实不同,任务是一个个体,类似于我们跑裸机时候的main()函数,但任务有他自己的私有堆栈----任务堆栈用来保护因调用或中断产生的断点。
任务的管理:
uCOS-II中任务有两种:用户任务、系统任务。顾名思义uCOS-II最多可管理64个任务。
系统为了对多任务进行管理,就要将任务进行登记造册,这就用到了上一届说的把一个任务控制块加入到链表中。插一条线程与进程的概念:简单来说进程拥有自己独立的运行空间,在uCOS中的单一任务是在操作系统管理下运行没有自己独立的空间故被称为线程,但是多任务整体他们的自己的运行空间就被称为进程。
任务的状态:
uCOS-II是按照一个cpu设计的,当运行其中一个任务,可看作这个任务处于运行状态,那么其他任务的状态呢,uCOS定义了5种状态:
睡眠状态(被抛弃状态,该任务没有任务控制块或者被处理器剥夺了任务控制块,除非给他一个,否则这个任务永远不会被执行),就绪状态(该任务什么都不缺,在任务就绪表中登记了,就等处理器去使用时的状态),运行状态(没啥还解释的),等待状态(这个任务开始被CPU处理,发现他需要等待某个时间或者等待一个事件发生才能继续运行,CPU不能闲啊,开始去处理其他任务,等条件产生了再去执行这个任务),中断服务状态(当某个条件发生了,CPU去处理中断函数,转让CPU使用权,的任务状态)。
用户任务代码的一般结构:
一个uCOS-II任务代码就是一个C语言函数void Mytask(void * pdata),其形参可以是数据或者是函数,所以用void*作为其形参,其执行代码就是一个无限循环结构.
当你写好这个任务函数后,就需要为这个任务创建任务控制块了,否则他就是睡眠状态,通过调用OSTaskCreate()为这个任务创建任务控制块。uCOS-II也有一个void mian()函数,在这个函数调用使用OSTaskCreate()为自己编写的任务函数创建任务块,这个mian()函数只是只是程序的入口,进入之后的什么事都是由系统操作了。
任务系统:
当某个时刻CPU无任务,不能让他闲着啊,uCOS-II就给CPU安排了个叫空闲任务OSTaskIdle(void* pdata)的家伙,用来干嘛,就是用来计数+1。特别需要注意的是,uCOS规定,一个用户程序必须使用这个空闲任务,且这个任务是不能删除的。
uCOS-II还提供了另外一个系统任务:统计任务OSTaskStat();每秒计算一次CPU单位时间使用率,结果放在变量OSCPUsage,如果用户应用程序要使用统计任务,则要吧系统头文件OS_CFG.H中的系统配置常数OS_TASK_STAT_EN设置为1,这样就可以在程序中调用函数OSStatInit()对统计任务进行初始化。
任务的优先权及优先级别
根据嵌入式系统的特点,uCOS-II采用优先级抢占式规则,系统中每个任务按照其任务重要性分配一个唯一的优先级,优先级高的先运行。
uCOS-II最多可创建64个任务,优先级别也就有64级,从0到63,这里要注意两点:1、uCOS在系统配置文件OS_CFG.h中配置了一个常数OS_LOWEST_PRIO,表示你想设置的任务的最低优先级,最大为63。2、uCOS常常把OS_LOWEST_PRIO优先级别分配给系统空闲任务,如果应用程序使用了系统统计任务,系统又把OS_LOWEST_PRIO-1优先级别分配给统计任务。
好了今天就到这,明天不上班,看看能不能把第三章写完。