Vxworks内核(wind)的基本功能可以分为如下几类:
(1) 任务;
(2) 任务间通信
(3) 中断服务程序
(4) 定时器服务(watchdog timers)
(5) POSIX时钟和定时器
(6) POSIX memory-Locking 接口
1. 任务
任务是代码运行的一个射象,从系统的角度看,任务是竞争系统资源的最小运行单元。
2. 任务结构
实际引用中任务更好的对客观世界的事件做出反应。Vxworks是多任务环境,每个任务都有自己的上下文(context),记录了任务运行时的cpu环境和系统资源状况,context切换时,比保护在任务控制块中(TCP),一备下次调用是恢复运行环境。
Context包括:任务号,CPU寄存器和浮点寄存器,可变栈几函数调用,标准的输入和输出,延迟时间,时间的大小,内核控制结构,信号处理函数(signal handlers),调用和性能监视。
3,任务状态和任务迁移
实时系统最基本的状况有以下四种:
1) 就绪态(Ready):任务只等待系统分配CUP资源。
2) 挂起态(Pend):任务需等待某些不可利用的资源而被阻塞。
3) 休眠态(suspend):如果系统不需要某一个任务工作,则这个任务处于休眠状态。
4) 延迟态(Delay):任务被延迟时所处的状态。
当系统函数对某一个任务进行操作时,任务从一种状态跃迁到另一种状态。处于任一状态的任务都可被删除。VxWorks的任务跃迁如图1所示。
ready à pend semtake() /msgQReceive()
ready à delay taskDelay()
ready à suspend taskSupend()
pend à ready semGive()/msgQsend()
pend à suspend taskSuspend()
delay à ready expired delay()
delay à suspend taskSuspend()
suspend à ready taskResume()/ taskActiveate()
suspend à pend taskResume()
suspend à delayed taskResume()
kernelTimeSlice() control round-robin scheduling
taskPrioritySet() change the priority of a task
taskLock() disable task rescheduling
taskUnlock enable task rescheduling
优先级抢占方式
抢允许、禁止; 如果任务设置了抢占允许位,当此任务处于运行态时,如果高一级优先级任务因某各系统调用阻塞态或挂起态迁移为就绪,则此高优先级任务会立即抢占当前任务的运行,如果设置了禁止,则当前任务不可被处于就绪的高优先级任务抢占,继续运行阻塞,刮起或者改变抢占设置为止。Wind有256优先级,(0-255)0的优先级最高,255最低。在程序运行中,可通过taskPriorityset设置改变优先级。
轮询方式:
时间轮转的方式;
通过KernelTimeSlice()函数为任务分配时间片;
优先级锁
通过taskLock() 和TaskUnlock()函数设置抢占方式;
任务控制:
任务控制包括:任务创建、控制、信息。
tsakSpawn() create and activate a new task;
taskInit() InitiaLize a new task
taskActivate Activate an initialized task
taskSpawn()函数可以做底层分配和初始化和任务激活,。初始化和激活函数分别是taskInit()和taskActivate();
如果你不给你的应用程序中任务起名,vxworks会给每个没有名字的任务器名字,名字统一格式为tN,N是十进制数,每次加1;
taskName() get the task name associated with a task Id
taskNameToId() look up the task ID associate with a task name.
taskIdSelf() get the calling task ID
taskidVerify() Verify the existence of a specified task
taskSpawn(
char *name //名称
int priority //任务的优先级
int options //任务可选项
int stacksize //任务堆栈大小
FUNCPTR entrypt //任务入口函数
Int arg1 //任务入口函数所带参数
Int arg2 … int arg 10
)
Options 任务可选项:
VX_FP_TASK 0x8 运行带浮点的斜处理器,
VX_NO_STACK_FILL 0x00 不使用0xee填充堆栈
VX_PRIVATE_ENV 0x80 用私有环境进行任务
VX_UNBREAKABLE 0x2 任务内的断点失败
VX_SUPERVIDOR 0 用户任务常量用值
taskOptionsGet() examine task options
taskOptionsSet() set task options
任务信息(task information)
通过下列函数可以查到任务信息,但是所查询的信息是查询时刻的信息,因为任务状态是不断变化的,所以查询的信息可能不是当前该任务的信息,除非该任务进入睡眠状态。
taskIdListGet() fill an array with the Ids of all cative tasks
taskInfoGet() get information about a task
taskPriorityGet() examine the priority of a task
taskPegsGet () examine a task’s registers
taskRegsSet() set a task’s registers
taskIsSuspended check if a task is suspended
taskIsready() check if task is read ti tun
taskTcb() get a pointer to task’s comtrol block
任务的删除及安全删除
任务可以被删除, 这些函数用于删除任务和保护任务以免误删。
Exit()
taskDelete()
taskSafe()
taskUnsafe()
在任务被终止时该任务运行期间分配的内存将不会被释放的
任务一般式调用exit()终止自己,但也可以显示的调试exit()来杀死自己,一个任务可以调用taskdelete()来杀死另一个任务。
一个任务被删除的时候,其他任务不会被通知,函数tasksafe()和taskUnsafe()被用来保护任务,避免误删。TaskSafe()用来保护任务不被其他任务删除,这种保护通常是任务运行在临界区或者使用共享资源的时候被使用。
例如: 一个任务可能使用信号量来访问访问一段数据结构,当正在使用该数据结构时,该任务被删除,因为该任务还没有访问完该结构,所以此时数据结构可能处于一种被破坏状态,此时,用于信号量不能在被该任务释放,所以共享资源也不能在被利用了。
使用tasksafe()保护任务任何其他想删除该任务的任务被阻塞,当任务访问共享资源结束后,用taskUnsfe()函数使用自己处于可被删除态,taskSafe()和taskUnsafe() 可以被多次使用,一个计数器来记录其使用次数,当计数器为0的时候,任务可以被删除,一个任务不能让其它任务tasksafe()和taskUnsafe()。
例子:使用tasksafe()和taskUnsafe()来保护共享代码区域;
Tasksafe();
Semtake(semId,WAIT_ROREVER);
.
Critical region
semGive(semId);
taskUnsafe();
因为只用任务在访问共享资源的时候才需要被保护,所以保护只在申请共享资源前和使用共享资源后这段时间有效,似乎在保护信号量,其实是在保护任务不被删除。
任务控制:
函数在任务运行期间直接对任务进行控制的函数;
----------------------------------------------------------------------------------
taskSuspend() suspend a task
taskResume() resume a task
taskPestart() restart a task
taskDelay() delay a task ; delay units are ticks,
nanosleep() delay a task ;delay units are nanoseconds
----------------------------------------------------------------------------------
Vxworks 调试工具要求函数可以挂起和重新运行任务,在冻结一个任务状态后便于检查,在发生某种灾难性错误之后们可以需要从新生成该任务用taskRestart()。
为了延迟半秒钟,调用此函数:taskDelay(sysClkRateGet()/2);
sysCljRateGet()函数返回每秒钟的ticks,也可以使用nanosleep()来代替taskDelay()
taskDelay()将任务放到同级的就绪队列尾。
TaskDelay(NO_WAITL);延迟0个时钟,以便其他同优先级任务可以执行。
注意:nanosleep()没有延迟0时钟。
任务扩展(task extensions)
为了允许任务在创建,切换或删除的时候调用一些附加的函数,wind提供了 task create,switch和delete hooks,
----------------------------------------------------------------------------------
taskHookInit( ) - initialize task hook facilities
taskCreateHookAdd( ) - add a routine to be called at every task create
taskCreateHookDelete( ) - delete a previously added task create routine
taskSwitchHookAdd( ) - add a routine to be called at every task switch
taskSwitchHookDelete( ) - delete a previously added task switch routine
taskDeleteHookAdd( ) - add a routine to be called at every task delete
taskDeleteHookDelete( ) - delete a previously added task delete routine ----------------------------------------------------------------------------------
函数 taskInit 原型:
STATUS taskInit
(
WIND_TCB * pTcb, /* address of new task's TCB */
char * name, /* name of new task (stored at pStackBase) */
int priority, /* priority of new task */
int options, /* task option word */
char * pStackBase, /* base of new task's stack */
int stackSize, /* size (bytes) of stack needed */
FUNCPTR entryPt, /* entry point of new task */
int arg1, /* first of ten task args to pass to func */
int arg2,
int arg3,
int arg4,
int arg5,
int arg6,
int arg7,
int arg8,
int arg9,
int arg10
)
taskActivate( ) 函数
STATUS taskActivate
(
int tid /* task ID of task to activate */
)
taskDelete()函数原型
STATUS taskDelete
(
int tid /* task ID of task to delete */
)
TaskDeleteForce()函数
STATUS taskDeleteForce
(
int tid /* task ID of task to delete */
)
taskSuspend()函数
STATUS taskSuspend
(
int tid /* task ID of task to suspend */
)
TaskResume()恢复任务
STATUS taskResume
(
int tid /* task ID of task to resume */
)
taskRestart()重启一个任务
STATUS taskRestart
(
int tid /* task ID of task to restart */
)
TaskPrioritySet()设置任务优先级
STATUS taskPrioritySet
(
int tid, /* task ID */
int newPriority /* new priority */
)
TaskPriorityGet()获得任务优先级
STATUS taskPriorityGet
(
int tid, /* task ID */
int * pPriority /* return priority here */
)
taskLock( ) /taskUnlock()
STATUS tasklock (void)
STATUS taskUnlock (void)
taskSafe()保护被调用任务
STATUS taskSafe (void)
TaskUnsafe()
STATUS taskUnsafe (void)
STATUS taskDelay 延迟一个任务
(
int ticks /* number of ticks to delay task */
)
int taskIdSelf (void)