VxWorks基本OS介绍

这里我就偷点懒,直接复制粘贴文档了。可能会有一些图片无法显示 ,可以直接管我索要文档。

每一个被切换的程序实体就是“任务”。每一个任务都有其自己的上下文——所谓上下文就是指任务在每一次被核心调度时所需要的CPU环境、系统资源。在上下文的切换过程中,每一个任务的上下文被存在该任务的任务控制块中(TCB)。

 执行的线程,也就是任务程序计数器;

 CPU寄存器的内容和浮点寄存器中的内容;

 动态变量和程序调用所使用的堆栈;

 标准输入输出的I/O分配和错误;

 延时计时器;

 时间片计时器;

 核心控制结构;

 信号处理句柄;

 调试和性能监视值。

wind核心中使用了基于优先级抢占式的任务调度策略,但是用户也可以选择优先级轮转调度策略。

1.优先级抢占策略

通过使用优先级抢占策略,每一个任务都会拥有一个优先级,这样内核就会确信将CPU资源分给了优先级最高的就绪任务。这种方法之所以叫做抢占式的,是指任何运行的任务会被一个变成就绪状态而且优先级更高的任务打断,这时系统会保存当前任务的上下文并立即切换到高优先级的任务上下文,并且开始执行这个任务。在图14.2所示的任务优先级抢占图中给出了优先级抢占的例子,例子中任务t1被优先级较高的任务t2抢占,而更高优先级的任务t3则抢占了t2的执行,当t3执行完后,t2开始继续执行,接下来t1在t2完成之后从被打断处继续执行。

VxWorks的wind内核支持256级优先级,由高到低分别是0到255。任务创建的同时也就同时被赋予了相应的优先级,但是在任务执行的过程中,同样可以通过系统函数taskPrioritySet()设置某一个任务的优先级。

VxWorks系统中,所有应用程序任务的优先级应该在100~250之间;至于驱动程序创建的任务的优先级可以位于51~99之间,系统网络任务tNetTask的优先级默认值为50

2.时间片轮转的调度策略

如果没有时间片轮转任务调度策略,那么当同优先级的一个任务获得了CPU资源之后,它就会一直占用CPU资源直到完成执行,相同优先级的任务就会因为得不到CPU资源而不得不阻塞。解决这个问题就需要循环调度策略。

对于具有相同优先级的任务,时间片轮转调度策略会为每一个任务分配相同的CPU时间片。优先级相同的一组任务都会在相同的时间间隔内被执行,每一个时间片结束,内核就会通过调度算法执行就绪队列中的另一个任务,任何一个任务都不会比其他的任务获得更多的时间片。

当一个高优先级的任务出现时,正在执行的优先级的任务会被打断,它的运行时间计数器会被保存在任务控制块中,一旦高优先级的任务完成执行,被打断的任务将恢复执行,而运行时间计数器会从被打断的位置继续计数,直到分配给这个任务的时间片被消耗掉,或者该任务执行完。图14.3解释了刚才所描述的情况:t1,t2,t3是具有相同优先级的任务,而t2在执行的过程中被优先级更高的任务t4抢占,当t4执行完之后,t2继续使用完了系统分配的时间片。

3.抢占锁

VxWorks同样允许低优先级的任务禁止正在使用的CPU资源被高优先级的任务抢占。注意:taskLock()/taskUnlock()的操作比semGive()/semTake()操作速度要快。主要用于对临界资源的保护,避免系统发生异常。

通常我们都会使用taskSpawn(),这个函数可以方便的创建并且激活任务,taskId = taskSpawn("tRead", 150, 0, 2048, (FUNCPTR)TaskRead, 6, 1, 2, 3, 4, 5, 6, 7, 8, 9);

2.任务的名称和ID

当用户生成一个任务的时候,可以将任意长度的字符串作为任务的名称。而对于每一个新生成的任务,VxWorks都会返回一个ID号来标志这个任务,这个ID号是一个四字节的指针,指向了任务的结构。但是VxWorks提供了一个方便的表示办法,在一个任务中使用0代替任务自身的ID

为了避免任务之间名称的重复,VxWorks有一个名称格式的规定,所有目标机创建的任务名称都以字母t开头,而主机生成的任务都以字母u开头。

虽然任务名会在调试和任务控制中带来极大的方便,但是生成任务的时候也可以不指定任务名,这个时候VxWorks系统会为用户生成的任务自动命名。这个功能使循环生成多任务变得更为方便,用户可以通过循环体生成相同处理的很多任务。

taskIdSelf()获取当前任务的ID

一个任务可以通过使用exit()将自己结束。如果希望结束其他任务,可以通过调用taskDelete()实现。当一个任务结束的时候,任何其他的任务都不会得到通知。这时,就应该使用其它的方法来通知相关任务。同时,任务执行所申请的内存也不会在其终止时自动释放。

为了避免任务在未释放资源的时候就被意外的结束,VxWorks提供了一对函数来进行保护,这就是taskSafe()和taskUnsafe()。为了避免任务在未释放资源的时候就被意外的结束,VxWorks提供了一对函数来进行保护,这就是taskSafe()和taskUnsafe()

函数

描述

taskSuspend()

挂起任务

taskResume()

恢复任务

taskRestart()

重启任务

taskDelay()

任务延时(参数为时间片)

nanosleep()

任务延时(参数为纳秒)

 

函数

描述

taskCreateHookAdd()

增加任务创建时调用的函数

taskCreateHookDelete()

删除任务调用时要执行的函数

taskSwitchHookAdd()

增加任务切换时调用的函数

taskSwitchHookDelete()

删除任务切换时要执行的函数

taskDeleteHookAdd()

增加任务删除时调用的函数

taskDeleteHookDelete()

删除任务删除时要执行的函数

任何代码或者数据中的错误都有可能导致硬件的异常状态,那些非法的指令、错误的总线或者地址访问,被零除等等的错误都会产生异常。所有的异常都会被VxWorks的异常处理包所捕获。默认情况下,异常处理会将引起异常的任务挂起,并且保存异常出现时任务的状态,而VxWorks核心和其他的任务都会继续运行。与此同时,关于异常的描述将会传递给Tornado的开发工具,以便用户的调试。

有些被多任务所调用的函数会访问全局或者静态变量。这种情况就是,几个任务都有自身的缓冲区,而他们同时会将这些缓冲区中的值赋给一个相同的全局变量。

为了解决这种情况,VxWorks提供了任务变量的工具,允许将四个字节的变量加入到任务上下文中,于是这些变量就会跟随着任务的切换而切换。这样会给任务切换时间增加几个微秒的时间。

VxWorks中可以使用同一个函数实现体生成多个任务。每个新生成的任务都会带有自己的任务堆栈和上下文。同时每次生成新的任务,都可以为函数传入不同的参数。

1.根任务:tUsrRoot

VxWorks内核引导后第一个创建的任务就是根任务tUsrRoot。这个任务的入口点在安装目录下的target/config/all/usrConfig.c中,这个任务在创建后会初始化大多数的VxWorks工具。他会创建记录任务、异常处理任务、网络任务和一个叫做tRlogind的守护任务。通常的情况下根任务在做完这些初始化之后都会结束并且被系统删除。在根任务中用户可以任意添加必要的初始化代码。

2.日志任务:tLogTask

日志任务(也称记录任务)为VxWorks系统中的其他模块提供了记录系统信息的功能,通过这个任务可以记录系统信息而不需要执行I/O操作。下面的表14-13中列出了用户可以使用的系统记录函数。

logMsg()

输出带有格式的登记信息

3.异常处理任务:tExcTask

异常处理任务执行VxWorks异常处理,这些函数都是在中断中不能执行但又非常重要的。所以这个任务必须在系统中具有最高的优先级,不能被挂起、不能被删除、不能改变优先级。

4.网络任务:tNetTask

网络守护任务处理VxWorks系统中任务级的网络的请求。

5.目标机代理任务:tWdbTask

如果目标机代理设置为运行在任务方式下,系统会生成tWdbTask任务。这个任务负责主机与目标机的通信,所有调试信息都会通过目标机服务器传给这个任务。

6.可选的任务

1)目标机shell任务:tShell

2)远程用户登陆响应任务:tRlogind

3)Telnet用户登陆响应任务:tTelnetd

4)RPC服务任务:tPortmapd

 

对于任务来说,任务间的通信交流是必不可少的。任务间的通信允许相互独立的任务完成协作的工作。为了方便的完成任务的通信,VxWorks为用户提供了相当多而且灵活的通信机制,通过使用这些手段任务可以轻松的完成复杂的通信任务。基本的VxWorks提供了五种通信机制:

 简单的数据共享,共享内存;

 简单的互斥和同步机制,信号量;

 任务间传输消息所使用的消息队列和管道;

 为网络间任务的通信而提供的网络插口(Socket)和远程进程调用;

 用于处理异常的标志。

VxWorks的可选件VxMP中,系统还提供了多CPU之间共享内存、信号量、消息队列、数据库等机制,使多CPU之间协作变得简单方便。

这是最简单的共享内存方式,通过访问相同的数据结构体,任务之间可以轻易的共享数据以及控制信息。由于VxWorks的所有任务都使用单一地址空间,共享数据并不会增加系统的负担,从而使这种方式成为VxWorks中最为简单的数据共享方式。不同的任务都可以直接访问全局变量、队列、环形队列、链表、指针等,如图14.7所示。

访问共享数据

访问共享数据

访问共享数据

共享数据

 

 

任务1

任务2

任务3

任务

内存

 

 

 

 

 

 

 


1.中断锁以及中断延迟

在所有的互斥的方法中,中断锁的作用域最小,功能却最强。中断锁可以使中断处理程序不被打断,使用了中断锁之后任何中断处理或者任务都不会打断中断锁控制中的代码。int lock=intLock();    ./*禁止中断的程序部分*/    intUnlock(lock);

2.优先级锁及其延迟

一个任务使用了优先级锁之后,除了中断之外没有任何任务可以打断这个任务的执行。taskLock();    ./*禁止抢占的程序部分*/    taskUnlock();

1.二进制信号量
2.互斥信号量
3.计数信号量

semFlush()

使所有等待指定信号量的任务获得信号量

当一个信号量创建的时候,就已经为其指定了队列的模式。用户可以指定优先级模式或者先进先出模式。使用基于优先级的信号量,会使高优先级的任务优先获得信号量;使用先进先出模式的信号量,系统将对所有任务一视同仁。

5.互斥
6.同步
7.优先级反转

在互斥信号量中,有选项SEM_INVERSION_SAFE,通过这个选项可以开启优先级继承。

msgQCreat()函数用于创建并初始化一个消息队列,通过这个函数的参数,可以指定消息队列所容纳的消息数目和长度以及消息队列的类型。VxWorks为消息队列提供了两种优先级类别的消息,普通消息(MSG_PRI_NORMAL)和紧急消息(MSG_PRI_URGENT)。

从函数的定义上来看,msgQSend()和msgQReceive()都可以设置超时参数。对于发送消息,超时的含义是,在规定的时间里消息队列没有可用的空间接纳新的消息。而对于接收消息,超时的含义是,在规定的时间里消息队列没有新的消息到达。虽然机理不同,两者同样会引发超时错误。

管道是消息队列的替代品,与消息队列不同的是,管道使用了VxWorks系统的I/O系统。作为一个I/O设备,管道提供了一个消息队列所不能提供的支持,即是对select的支持(select将会在后面介绍到)。通过使用select函数,任务可以同时等待不同的I/O设备的数据。

1.套接字
2.远程进程调用

信号可以异步的改变任务的控制流程。在实际操作中,中断服务程序或者任务向指定的任务发送信号,接收到信号的任务立即挂起当前执行的线程,在下一次调度执行的时候执行指定的信号处理程序。

VxWorks为定时功能提供了看门狗定时器机制。这个机制允许在一定时间延迟之后执行一段特定的函数代码。在系统内部,看门狗定时器是作为系统时钟的一部分来维护的。也就是说相当于系统时钟在给定的时间后会给出中断,而看门狗定时器指定的程序则是挂在这个中断上的中断服务程序,由于挂在系统时钟上可以保证了精确的定时。

void wdogRoutine()

{

       semGive(semId_Task2);//释放执行任务所需的信号量

       semGive(semId_Task1);

       wdStart(wdogID, sysClkRateGet(),(FUNCPTR)wdogRoutine,0);

}

VxWorks提供了intConnect()函数实现这个功能,通过这个函数可以将用户函数与中断相关联。事实中的中断处理程序并不是简简单单的C函数,在函数intConnect()中不仅保存当前寄存器状态以及其中正在执行的代码,而且为被调用函数的参数建立了一个堆栈入口,最后调用连接在中断上的函数。中断处理完成后,从被调用的函数返回时,intConnect()函数恢复寄存器和堆栈,并退出中断。

所有中断程序都使用相同的中断堆栈。这个堆栈是由系统启动时根据指定的配置参数来定位和初始化的。为了能在最糟糕的情况下处理中断嵌套。必须分配足够大的中断堆栈空间。

在开发过程中,使用checkStack()函数可以观察如何关闭中断堆栈以及中断服务程序如何逐渐地占用堆栈空间。

虽然中断服务程序可以连接到普通的C函数,在编写这个被调用的C函数时,还是有很多限制。在这个被调用的函数中,不能执行过多的I/O操作、不可以获取信号量、不可以分配内存。像printf()、malloc()、semTake()函数都是不可以使用的,但是可以使用semGive()、logMsg()、msgQSend()以及bcopy()函数。

同时为了给中断服务程序提供输出功能,VxWorks中提供了logLib,这个库中的函数允许系统任务打印文本信息,它是中断服务程序中最常用的输出手段。在上一节例子中的logMsg()函数就是这个库中的。

对于中断服务程序来说,挂起是不可能的,因为中断服务程序是没有可挂起的上下文,系统也就没有安全可靠的资源来处理异常。基于这个理由,VxWorks使用了另一种方法替代任务的挂起,那就是在系统低端内存的特定区域存储引发错误的异常的描述,同时执行系统重启。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vxworks培训资料 Vxworks培训资料全文共89页,当前为第1页。 Vxworks简介 最成功的实时操作系统 1981,Windriver,嵌入式咨询公司 TCP/IP,NFS工具集 WIND内核 1995,tornado集成开发环境 收购SDS、DIAB、pSOS Vxworks培训资料全文共89页,当前为第2页。 Vxworks操作系统是一个嵌入式实时操作系统(RTOS)。 Vxworks与其它实时OS一样,基于以下两个重要机制: * 多任务环境及任务间通信 * 硬件中断处理 Vxworks多任务内核完成的功能是:实时调度,任务间通信及互斥。 其它功能则作为系统库围绕在内核周围,它们可根据需要进行剪裁。 Vxworks与非实时系统的不同之处在于: Vxworks的优先抢占机制基于调度, Vxworks对外部事件的反应和处理快, Vxworks容量小并且可配置(微内核结构) VxWorks (1) Vxworks培训资料全文共89页,当前为第3页。 Vxworks提供了一套丰富的任务间通信机制,包括: 内存共享(Shared memory):简单的数据共享方法 信号量(Semaphore):用于基本的互斥及同步 消息队列(Message queues)和管道(pipe): 用于同一CPU上任务间消息的传递 套接口(Socket)和远程程序调用(RPC): 用于网络上任务间的通信 信号(Signal):用于异常处理 此外,Vxworks提供了三种共享内存的对象(shared-memory objects) 来实现运行在不同CPU上的任务间的高速同步和通信。 共享信号量(shared semaphores):有二进制,记数型两种 共享消息队列(shared message queues) 共享内存分区(shared-memory partitions):有系统类型和用户类型 VxWorks (2) Vxworks培训资料全文共89页,当前为第4页。 Tornado (1) Tornado提供了Vxworks系统开发的集成开发环境,其中Tornado 源代码编辑器包括下列特性: 标准文本控制能力 C和C++ 语法元素用不同颜色 调制集成:编辑窗口跟踪代码的执行 编译集成:项目管理将编译警告和编译错误 直接和编辑窗口中的相应代码对应起来。 Vxworks培训资料全文共89页,当前为第5页。 Tornado (2) Tornado集成开发环境由以下几个部分组成: Vxworks培训资料全文共89页,当前为第6页。 目标CPU:Vxworks 在其上运行 的一个单板计算机 Tornado PC主机:有一根串行线与目标机相连(初始化时主机作为终端用) Vxworks核二进制文件驻留在其盘上,核的下载及运行Tornado 工具 通过以太网口进行 Ethernet AGENT SERVER Vxworks培训资料全文共89页,当前为第7页。 Vxworks/Tornado开发方式 目标CPU: Vxworks 在其上运行 的一个单板计算机; Tornado PC主机:有一根串行线与目标机相连(初始化时主机作为终 端用),Vxworks核二进制文件驻留在其盘上,核 的下载及运行Tornado 工具通过以太网口进行。 Ethernet AGENT SERVER Vxworks培训资料全文共89页,当前为第8页。 Tornado开发环境 Vxworks培训资料全文共89页,当前为第9页。 Tonado开发环境(续) Vxworks培训资料全文共89页,当前为第10页。 Tornado开发环境(续) Vxworks培训资料全文共89页,当前为第11页。 Vxworks操作系统将一切与硬件有关的功能模块都放在BSP库中。该BSP库是硬件与软件的接口,处理硬件的初始化、中断处理与产生、硬件时钟与定时管理、局部和总线内存空间的映射、内存大小定义,等等。能够自行启动目标机、初始化目标机、能够与host通信以下载Vxworks核、把控制权交给Vxworks核来调用用户应用程序等功能。 板支持包(BSP) Vxworks培训资料全文共89页,当前为第12页。 Vxworks培训资料全文共89页,当前为第13页。 Tornado&VxWorks框架 Vxworks培训资料全文共89页,当前为第14页。 Vxworks 应用广泛的嵌入式实时操作系统 Vxworks培训资料全文共89页,当前为第15页。 VxWorks的整体构架 Hardware Independent Software Applications TCP/IP I/O System VxWorks libraries Wind microKernel File System Hardware

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值