在RTOS下,系统把一个复杂的嵌入式应用工程按一定规则分解成一个个功能清晰的小工程,然后设定各个小工程的运行规则,交给RTOS管理,这就是基于RTOS编程的基本思想。这一个个的小工程被称之为任务(Task),RTOS管理这些任务,被称之为调度(Scheduling)。
要给RTOS中的任务下一个准确而完整的定义并不十分容易,可以从不同角度理解任务。从任务调度角度来理解,可以认为,RTOS中的任务是一个功能清晰的小程序,是RTOS调度的基本单元;从RTOS的软件设计角度来理解,就是在软件设计时,需要根据具体应用,划分出独立的、相互作用的程序集合,这样,每个程序集合就被称之为任务,每个任务都被赋予一定的优先级;从CPU的角度来理解,在单CPU下,某一时刻CPU只会处理(执行)一个任务,或说只有一个任务占用CPU。RTOS内核的关键功能就是以合理的方式(即调度),为系统中的每个任务分配时间,使之得以运行。
实际上,任务这个词语义范围很宽,根据特定的RTOS,任务可能被称之为线程(Thread)、进程(Process),甚至直接称为程序(Program),不必花过多精力,追究其精确语义,掌握任务设计方法、理解调度过程、提高编程鲁棒性、理解底层驱动原理、提高程序规范性、可移植性与可复用性、提高嵌入式系统的实际开发能力等才是学习RTOS的关键。要真正理解任务并进行基于RTOS的嵌入式软件开发,需要从任务的状态、结构、优先级、调度、同步等角度来认识,将在后续章节中详细阐述。
一般说来,任务具有终止态、阻塞态、就绪态和激活态四种状态,将在第5章任务管理部分阐述。
任务的上下文(Context)是指CPU寄存器(包括程序计数器PC)。当内核决定运行另外的任务时,它保存正在运行任务的当前上下文,这些内容保存在RAM中的任务当前状况保存区(Task’s Context Storage Area),也就是任务自己的堆栈之中。入栈工作完成以后,就把下一个将要运行任务的当前状况从其任务栈中重新装入CPU的寄存器,开始下一个任务的运行,这一过程叫作任务切换或上下文切换。
死锁指两个或两个以上的任务无限期地互相等待对方释放其所占资源。死锁产生的必要条件有四个,即资源的互斥访问、资源的不可抢占、资源的请求保持,以及任务的循环等待。死锁解决问题的方法是破坏产生死锁的任一必要条件,例如,规定所有资源仅在任务运行态时才分配,其他任意状态都不可分配,破坏其资源请求保持特性。
任务间的通信指的是任务间的信息交换,其作用是实现同步及数据传输。同步指的是根据任务间的合作关系,协调不同任务间的执行顺序。任务间通信的方式主要有事件、信号量、消息等。有关任务间通信及下述的优先级反转、优先级继承、资源、共享资源与互斥等概念将在第6章中详细阐述。
在一个多任务系统中,每个任务都有一个优先级(Priority)。
(1)优先级驱动(Priority-Driven):在一个多任务系统中,正在运行的任务总是优先级最高的任务。在任何给定的时间内,总是把处理器分配给优先级最高的任务。
(2)优先级反转(Priority-Inversion):当一个任务等待比它优先级低的任务释放资源而被阻塞时,这种现象被称为优先级反转,这是一个需要在编程时必须注意的问题。优先级继承技术可以解决优先级反转问题。目前市场上大多数商用操作系统都使用了优先级继承技术。
(3)优先级继承(Priority-Inheritance):优先级继承是用来解决优先级反转问题的技术。当优先级反转发生时,较低优先级任务的优先级暂时提高,以匹配较高优先级任务的优先级,这样就可以使较低优先级任务尽快地执行并且释放较高优先级任务所需要的资源。
资源(Resources):任何为任务所占用的实体均可称为资源。资源可以是输入/输出设备,如打印机、键盘及显示器;也可以是一个变量、结构或数组等。
共享资源(Shared Resources):可以被一个以上任务使用的资源叫作共享资源。为了防止数据被破坏,每个任务在与共享资源打交道时,必须独占资源,即互斥。
互斥(Mutual Exclusion):是用于控制多任务对共享数据进行顺序访问的同步机制。在多任务应用中,当两个或更多的任务同时访问同一数据区时,就会造成访问冲突,互斥能使它们依次访问共享数据而不引起冲突。