2024年3月31日发(作者:)

VxWorks

1. VxWorks 任务

任务:在执行时每个程序都被称之为任务。

共享方式访问大多数系统资源,

境。

(1) 任务状态:

就绪(READY):该状态时任务仅等待

睡眠(DELAY):出于睡眠的任务状态。

操作系统学习笔记

VxWorks操作系统中,任务可以直接地或者以

每个任务必须保持有足够的上下文环为了维护各自的线程,

CPU的状态,不等待其他任何资源。

阻塞(PEND):任务由于一些资源不可用而被阻塞时的状态。

挂起(SUSPEND):该状态时任务不执行,主要用于调试用。挂起仅仅约束任务的执行,并

不约束状态的转换,因此

态时任务可以唤醒。

DELAY+S:既处于睡眠又处于挂起的任务状态。

PEND+S:既处于阻塞又处于挂起的任务状态。

PEND+T:带有超时值处于阻塞的任务状态。

PEND+S+T:带有超时值处于阻塞,同时又处于挂起的任务状态。

state+I:任务处于state且带有一个继承优先级。

------------------------------------------------------------------------

| ready | ——> | pended | semTake () / msgQReceive () |

| ready | ——> | delayed | taskDelay () |

| ready | ——> | suspended | taskSuspend () |

| pended | ——> | ready | semGive () / msgQSend () |

| pended | ——> | suspended | taskSuspend () |

| delayed | ——> | ready | expired delay |

| delayed | ——> | suspended | taskSuspend () |

| suspended | ——> | ready | taskResume () / taskActivate () |

| suspended | ——> | pended | taskResume () |

| suspended | ——> | delayed | taskResume() |

------------------------------------------------------------------------

(2) Wind任务调度

在Wind内核中,默认算法是基于优先级的抢占式调度算法,也可以使用轮转调度算法。

任务调度控制函数:

--------------------------------------------------------------

| 调用| 描述|

|

|

|

|

| kernelTimeSlice() | 控制轮转调度

| taskPrioritySet() | 改变任务优先级

| taskLock() | 禁止任务调度

| taskUnlock() | 允许任务调度

--------------------------------------------------------------

基于优先级的抢占式任务调度:

当一个新任务优先级高于系统当前执行任务的优先级时,它将抢占CPU执行。因此,系统

pended-suspended状态时任务可以解锁,delayed-suspended状

内核将确保CPU分配给处于就绪状态的具有最高优先级的任务执行。

缺点:当多个相同优先级的任务需要共享一台处理器时,如果某个执行的任务永不阻塞,那

么它将一直独占处理器,其他相同优先级的任务就没有机会执行。

轮转式调度:

当所有相同优先级的任务处于就绪状态时,轮转算法倾向于平均使用

优先级的任务,通过时间片获得相同的

抢占上锁:

通过调用taskLock()和taskUnlock()函数,可以禁止使用

抢占上锁只能阻止任务的上下文切换,并不禁止中断。

taskLock()和intLock()比较

任务优先级:所有应用任务的优先级应该在

中断服务程序关联的任务)优先级能够位于

(3) 任务异常处理:

(4) 共享代码和重入

VxWorks操作系统中,大多数函数是可重入的。

应函数ldiv_r(),则ldiv() 是不可重入的。

重入技术:

. 动态堆栈变量

. 被信号保护的全局和静态变量

. 任务变量:taskVarAdd(), taskVarDelete()

(5) 操作系统任务VxWorks

/target/config/all/usrConfig.c下函

和taskVarGet()

但若存在一个对应于命名为someName_r()

的函数,someName() 因作为函数重入的版本将认为是不可重入的。例如,ldiv() 有一个对

100-250之间;但是驱动程序支持的任务(与

51-99。

Wind内核调度程序或启用Wind

内核调度程序。当禁止使用调度程序时,若该任务正在执行,不会发生基于优先级的抢占。

CPU处理时间。

CPU,对于所有相同

. tUserRoot:内核执行的首个任务,入口点是安装目录

务、网络任务和

且被删除。

. tLogTask:日志任务

. tExcTask:异常处理任务,必须拥有系统的最高优先级。

. tNetTask:网络任务,用于

数usrRoot(),可初始化VxWorks操作系统的大部分程序,发起诸如日志任务、异常处理任

tRlogind后台程序。正常情况下根任务在所有初始化结束后,终止任务并

VxWorks网络任务级程序处理。通常配置INCLUDE_NET_LIB

组件的VxWorks操作系统可以发起网络任务。

. tWdbTask:目标代理任务,用

理功能。

. 可选组建的任务

. tShell

. tRlogind

INCLUDE_WDB组件配置的VxWorks操作系统包括目标代