Vxworks 操作系统内核

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

 

优先级抢占方式

   抢允许、禁止; 如果任务设置了抢占允许位,当此任务处于运行态时,如果高一级优先级任务因某各系统调用阻塞态或挂起态迁移为就绪,则此高优先级任务会立即抢占当前任务的运行,如果设置了禁止,则当前任务不可被处于就绪的高优先级任务抢占,继续运行阻塞,刮起或者改变抢占设置为止。Wind256优先级,(0-2550的优先级最高,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会给每个没有名字的任务器名字,名字统一格式为tNN是十进制数,每次加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();

   SemtakesemIdWAIT_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()。

为了延迟半秒钟,调用此函数:taskDelaysysClkRateGet()/2;

sysCljRateGet()函数返回每秒钟的ticks,也可以使用nanosleep()来代替taskDelay()

taskDelay()将任务放到同级的就绪队列尾。

TaskDelayNO_WAITL;延迟0个时钟,以便其他同优先级任务可以执行。

注意:nanosleep()没有延迟0时钟。

任务扩展(task extensions

  为了允许任务在创建,切换或删除的时候调用一些附加的函数,wind提供了 task createswitchdelete 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)

你可能感兴趣的:(Vxworks 操作系统内核)