首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

VxWorks特点及基本概念详解(3)

VxWorks特点及基本概念详解(3)

2.2 多任务调度

两种方式: 优先抢占和轮转调度(Preemptive Priority,Round-Robin Scheduling).

优先抢占(Preemptive Priority): 每一个任务都有一个优先级,系统核心保证优先级最高的任务运行于CPU.如果有任务优先级高于当前的任务优先级,系统立刻保存当前任务的上下文,切换到优先级高的上下文.

Priority Preemption




抢占(Preemptive): 抢占是指当系统处于核心态运行时, 允许任务的重新调度。换句话说就是指正在执行的任务可以被打断,让另一个任务运行。抢占提高了应用对异步事件的响应性能力。操作系统内核可抢占,并不是说任务调度在任何时候都可以发生。例如当一个任务正在通过一个系统调用访问共享数据时,重新调度和中断都被禁止.

任务上下文(Task Context): 任务上下文是指任务运行的环境。例如,针对X86的CPU,任务上下文可包括程序计数器、堆栈指针、通用寄存器的内容.

上下文切换(Context Switching): 多任务系统中,上下文切换是指CPU的控制权由运行任务转移到另外一个就绪任务时所发生的事件,当前运行任务转为就绪(或者挂起、删除)状态,另一个被选定的就绪任务成为当前任务。上下文切换包括保存当前任务的运行环境,恢复将要运行任务的运行环境。上下文的内容依赖于具体的CPU.

轮转调度(Round-Robin Scheduling):使所有相同优先级,状态为Ready的任务公平分享CPU(分配一定的时间间隔,使个任务轮流享有CPU).

Round-Robin Scheduling



系统由256个优先级,从0到255,0为最高,255为最低. 任务在被创建时设定了优先级.也可用TaskPrioritySet ( ) 来改变任务优先级.

任务的主要状态: READY,PEND,DELAY,SUSPEND...

Ready-------->Pended -----------SemTake( )/MsgQReceive( )-其他任务

Ready-------->Delayed-----------TaskDelay( )

Ready-------->Suspended---------TaskSuspend( )

Pended------->Ready-------------SemaGive( )/MsgQSend( )-其他任务

Pended------->Suspended---------TaskSuspend( )

Delayed------>Ready-------------Expired Delay

Delayed------>Suspended---------TaskSuspend( )

Suspended---->Ready-------------TaskResume( )/TaskActivate( )

Suspended---->Pended------------TaskResume( )

Suspended---->Delayed-----------TaskResume( )




轮转调度 (Round-Robin): 轮转调度可以扩充到优先抢占方式中,当多个任务优先级相同的情况下,轮转调度算法使任务按平等的时间片运行于CPU,共享CPU.避免一个任务长时间占用CPU,而导致其他任务不能运行.可以用 KernelTimeSlice( ) 来定义时间长度.

TaskLock ( )和 TaskUnlock ( ) 用来取消优先抢占方式 和恢复优先抢占方式.

注意: 一个任务可以调用TaskDelete ( ) 删除另一个任务,但是如果一个当前正在运行的任务被删除后,该任务的内存没有释放,而其他任务不知道,依然在等待,结果导致系统Stop.用 TaskSafe ( ) 和 TaskUnsafe ( ) 来保证正在运行的任务不被删除.

用法如下:

TaskSafe ();

SemTake (SemId, WAIT_FOREVER);

/* Block Until Semaphore Available */

. . . . Critical Region .

SemGive (SemId); SemGive (SemId);  

/* Release Semaphore */

TaskUnsafe ();
返回列表