今天学习了一下VX系统的一些知识,把新认识的知识点记录下。
1、任务管理
任务结构、任务状态、任务调度。
1.1 任务状态:
实时系统的一个任务可有多种状态,其中最基本的状态有四种:
就绪态:任务只等待系统分配CPU资源;
悬置态:任务需等待某些不可利用的资源而被阻塞;
休眠态:如果系统不需要某一个任务工作,则这个任务处于休眠状态;
延迟态:任务被延迟时所处状态;
当系统函数对某一任务进行操作时,任务从一种状态迁移到另一状态。处于任一状态的任务都可被删除。
状态的切换如图:
涉及状态迁移的接口,如下:
状态迁移 调用
就绪态 ----> 悬置态 semTake()/msgQReceive()
就绪态 ----> 延迟态 taskDelay()
就绪态 ----> 休眠态 taskSuspend()
悬置态 ----> 就绪态 semGive()/msgQSend()
悬置态 ----> 休眠态 taskSuspend()
延迟态 ----> 就绪态 expired delay
延迟态 ----> 休眠态 taskSuspend()
休眠态 ----> 就绪态 taskResume()/taskActivate()
休眠态 ----> 悬置态 taskResume()
休眠态 ----> 延迟态 taskResume()
1.2 任务调度
多任务调度须采用一种调度算法来分配CPU给就绪态任务。Wind内核采用基于优先级的抢占式调度法作为它的缺省策略,同时它也提供了轮转调度法。
基于优先级的抢占式调度,它具有很多优点。这种调度方法为每个任务指定不同的优先级。没有处于悬置或休眠态的最高优先级任务将一直运行下去。当更高优先级的任务由就绪态进入运行时,系统内核立即保存当前任务的上下文,切换到更高优先级的任务。
轮转调度法分配给处于就绪态的每个同优先级的任务一个相同的执行时间片。时间片的长度可由系统调用KernelTimeSlice()通过输入参数值来指定。很明显,每个任务都有一运行时间计数器,任务运行时每一时间滴答加1。一个任务用完时间片之后,就进行任务切换,停止执行当前运行的任务,将它放入队列尾部,对运行时间计数器置零,并开始执行就绪队列中的下一个任务。当运行任务被更高优先级的任务抢占时,此任务的运行时间计数器被保存,直到该任务下次运行时。