VxWorks介绍及编程

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

VxWork介绍及编程
一.嵌入式操作系统VxWorks简介
VxWorks操作系统是美国WindRiver公司于1983年设计开发的一种嵌入式实时操作系统(RTOS),是嵌入式开发环境的关键组成部分。

良好的持续发展能力、高性能的内核以及友好的用户开发环境,在嵌入式实时操作系统领域占据一席之地。

它以其良好的可靠性和卓越的实时性被广泛地应用在通信、军事、航空、航天等高精尖技术及实时性要求极高的领域中,如卫星通讯、军事演习、弹道制导、飞机导航等。

在美国的 F-16、FA-18 战斗机、B-2 隐形轰炸机和爱国者导弹上,甚至连1997年4月在火星表面登陆的火星探测器上也使用到了VxWorks。

WindRiver公司网址
实时操作系统和分时操作系统的区别
从操作系统能否满足实时性要求来区分,可把操作系统分成分时操作系统和实时操作系统。

分时操作系统按照相等的时间片调度进程轮流运行,分时操作系统由调度程序自动计算进程的优先级,而不是由用户控制进程的优先级。

这样的系
统无法实时响应外部异步事件。

实时操作系统能够在限定的时间内执行完所规定的功能,并能在限定的时间内对外部的异步事件作出响应。

分时系统主要应用于科学计算和
一般实时性要求不高的场合。

实时性系统主要应用于过程控制、数据采集、
通信、多媒体信息处理等对时间敏感的场合。

VxWorks的特点
•可靠性
操作系统的用户希望在一个工作稳定,可以信赖的环境中工作,所以操作系统的可靠性是用户首先要考虑的问题。

而稳定、可靠一直是VxWorks
的一个突出优点。

自从对中国的销售解禁以来,VxWorks以其良好的可靠性
在中国赢得了越来越多的用户。

•实时性
实时性是指能够在限定时间内执行完规定的功能并对外部的异步事件作出响应的能力。

实时性的强弱是以完成规定功能和作出响应时间的长短
来衡量的。

VxWorks 的实时性做得非常好,其系统本身的开销很小,进程调度、进程间通信、中断处理等系统公用程序精练而有效,它们造成的延迟很短。

VxWorks 提供的多任务机制中对任务的控制采用了优先级抢占(Preemptive
Priority Scheduling)和轮转调度(Round-Robin Scheduling)机制,也
充分保证了可靠的实时性,使同样的硬件配置能满足更强的实时性要求,为
应用的开发留下更大的余地。

•可裁减性
用户在使用操作系统时,并不是操作系统中的每一个部件都要用到。

例如图形显示、文件系统以及一些设备驱动在某些嵌入系统中往往并不使
用。

VxWorks 由一个体积很小的内核及一些可以根据需要进行定制的系统模块组成。

VxWorks 内核最小为 8kB,即便加上其它必要模块,所占用的空间也很小,且不失其实时、多任务的系统特征。

由于它的高度灵活性,用户可以很容易地对这一操作系统进行定制或作适当开发,来满足自己的实际应用需要。

对一个实时内核的要求
一个实时操作系统内核需满足许多特定的实时环境所提出的基本要求,这些包括:
多任务:由于真实世界的事件的异步性,能够运行许多并发进程或任务是很重要的。

多任务提供了一个较好的对真实世界的匹配,因为它允许对应于许多外部事件的多线程执行。

系统内核分配CPU给这些任务来获得并发性。

抢占调度:真实世界的事件具有继承的优先级,在分配CPU的时候要注意到这些优先级。

基于优先级的抢占调度,任务都被指定了优先级,在能够执行的任务(没有被挂起或正在等待资源)中,优先级最高的任务被分配CPU资源。

换句话说,当一个高优先级的任务变为可执行态,它会立即抢占当前正在运行的较低优先级的任务。

任务间的通讯与同步:在一个实时系统中,可能有许多任务作为一个应用的一部分执行。

系统必须提供这些任务间的快速且功能强大的通信机制。

内核也要提供为了有效地共享不可抢占的资源或临界区所需的同步机制。

任务与中断之间的通信:尽管真实世界的事件通常作为中断方式到来,但为了提供有效的排队、优先化和减少中断延时,我们通常希望在任务级处理相应的工作。

所以需要杂任务级和中断级之间存在通信。

二.基本概念
关于BSP
BSP: Provides VxWorks with primary interface to
hardware environment.
作用:
•在通电后,初始化硬
件.
•支持VxWorks和硬件驱
动通信.
•使
hardware-dependen
t 和
hardware-independ
ent在VxWorks系统
中很好的结合.
•BSP用"make"来编译连接生成(Created),而不是用Tornado的工具.
•BSP和应用程序都可以在"make"或"tornade"上开发(developed)
•BSP被设置包括以下驱动:
中断控制interrupt controller,计时器
timer(sys/aux),串口UART(serial),显示
屏LCD,键盘Keyboard(opt),触摸屏
touch-screen(opt).
前面三个是BSP的主要部分.
•BSP默认的download VxWorks RAM image方式是从ethernet.
•串口电缆需要用来和开发板(COM1)通信,通过协议WDB.
VxWorks Image的种类:
•Loadable images.
•ROM-based
images---compressed/uncompresse
d.
•ROM-Resident images.
•VxWorks boot images---A VxWorks image designed to load another VxWorks images containing application code (often refer to as
"boot code")
•"Burned" into ROM or loaded into Flash.
•Maybe execute in ROM/Flash (ROM-resident).
•Maybe execute out of RAM.
•VxWorks images---A VxWorks image containing "end-user"
code,Sub-types:
•Loadable VxWorks image--VxWorks images loaded
by VxWorks boot image.
•VxWorks ROM image--VxWorks image "burned" into
ROM or loaded into Flash.May execute in Flash.
VxWorks images consist of:
•Textsegment---executable instruction.
•Data segment---Initilized global and static
varibles.
•BSS.
启动顺序的一些概念
•The sequence of events which occur as power-up are a function of type VxWorks image with will run.
•处理器"跳"到再ROM或Flash中Boot-strap 程序的起点. 这个程序
主要有以下作用:
•关闭中断(来自处理器)
•初始化目标内存(target memory)
•装载要运行的VxWorks image segments
•Jumps to code to place target in quiet state •启动顺序 Boot Sequence--Loadable VxWorks image
•Bootstrap code executes and loads text and data
segments of boot code(from ROM or Flash) into
RAM.具体执行如下:
•Boot code
compressed-Decompression during
copy
•Boot code uncompressed-copy
•Boot code is ROM-resident-copy
data segment only
•Boot program executes and loads VxWorks image
into RAM.Jumps to VxWorks load point.
•System initialization code statically linked
into loaded VxWorks image executes and
completes initialization.
•Startup Sequence--VxWorks 初始化
做以下工作:
•Place hardware environment in a quiet state.
•Initalize and start the wind kernel
•Spawn a tast to complete system initialization
•System initialization task will initialize support for end-user specified facilities,and start the end-user's application
三.系统启动顺序
•ROM中运行的VxWorks Image
VxWorks在ROM中运行,即写入ROM中的VxWorks Image是非压缩的,不需要
解压,系统直接跳到ROM的首地址,运行VxWorks
文件romInit.s中的romInit()---->文件bootInit.c中的
romStart()---->文件bootConfig.c中的
usrInit()----->sysHwInit()----->usrKernelInit()----->KernelInit(u
srRoot,...)
•RAM中运行的VxWorks Image
VxWorks在RAM中运行,即写入ROM中的VxWorks Image是压缩的,需要先解
压到RAM中,下面sysInit()主要是初始化RAM用的,系统直接跳到RAM的首
地址,运行VxWorks
usrInit()前面不压缩,即romInit(),romStart()不能压缩.
文件romInit.s中的romInit()---->文件bootInit.c中的
romStart()---->sysaLib.s中的sysInit()---->文件usrConfig.c中的
usrInit()----->sysHwInit()----->usrKernelInit()----->KernelInit(u
srRoot,...)
其中usrRoot()是VxWorks启动的第一个任务,由它来初始化 driver,network等
描述:romInit.s first execute in flash,minal initiliz,then jump to romStart.
romStart()开始装载和解压image到RAM,sysaLib.s是在RAM中执行的第一个函数.
•各个函数的主要作用
romInit()-----power up,disable interrupt,put boot type on the
stack,clears caches.
romStart()-----load Image Segments into RAM.
usrInit()-----Interrupt lock out,save imformation about boot
type,handle all the Initialization before the kernel is actually
started,then starts the kernel execution to create an initial task
usrRoot().This task completes the start up.
sysHwInit()-----Interrup locked,Initializes
hardware,registers,activation kernel
KernelInit(usrRoot,...)-----
•Initializes and starts the kernel.
•Defines system memory partition.
•Activates a task tUsrRoot to complete initalization.
•Unlocks inierrupts.
•Uses usrInit()stack.
usrRoot()
•初始化内存分区表(memory partition library)
•初始化系统系统时钟(system clock)
•初始化输入输出系统(I/O system)----可选
•Create devices----可选
•设置网络(Configure network)--------可选
•激活WDB目标通信(Activate WDB agent)---------可选
•调用程序(Activate application)
VxWorks Image在RAM中解压的位置
RAM Low Address,RAM High Address和有关定义在BSP,config.h,makefile文件中定义. VxWorks 在ROM中的情况
注:浅蓝色为整个VxWorks Image.
四.系统编程方法
实时系统主要包括:多任务调度(采用优先级抢占方式),任务间的同步和进程间通信机制.
一个多任务环境允许实时应用程序以一套独立任务的方式构筑,每个任务拥
有独立的执行线程和它自己的一套系统资源。

进程间通信机制使得这些任务
的行为同步、协调。

wind使用中断驱动和优先级的方式。

它缩短了上下文
转换的时间开销和中断的时延。

在 VxWorks 中,任何例程都可以被启动为
一个单独的任务,拥有它自己的上下文和堆栈。

还有一些其它的任务机制可
以使任务挂起、继续、删除、延时或改变优先级。

另一个重要内容是:硬件中断处理。

硬件产生中断,统治系统调用相应的中断历程(ISR),位是系统得到尽快的响应,ISR在它自己独立的上下文和堆栈中运行.它的优先级高于任何任务优先级.
中断延迟(Interrupt Latency) 中断延迟是指从硬件中断发生到开始执行中断处理程序第一条指令之间的这段时间。

优先级驱动(Priority-Driven) 优先级驱动是指多任务系统中,当前运行任务总是具有最高优先级的就绪任务。

•多任务调度
两种方式: 优先抢占和轮转调度(Preemptive Priority,Round-Robin
Scheduling).
优先抢占(Preemptive Priority): 每一个任务都有一个优先级,系统核心保证优先
级最高的任务运行于CPU.如果有任务优先级高于当前的任务优先级,系统立刻保存
当前任务的上下文,切换到优先级高的上下文.
抢占(Preemptive): 抢占是指当系统处于核心态运行时, 允许任务的重新
调度。

换句话说就是指正在执行的任务可以被打断,让另一个任务运行。


占提高了应用对异步事件的响应性能力。

操作系统内核可抢占,并不是说任
务调度在任何时候都可以发生。

例如当一个任务正在通过一个系统调用访问
共享数据时,重新调度和中断都被禁止.
任务上下文(Task Context): 任务上下文是指任务运行的环境。

例如,针对
x86的CPU,任务上下文可包括程序计数器、堆栈指针、通用寄存器的内容.
上下文切换(Context Switching):多任务系统中,上下文切换是指CPU
的控制权由运行任务转移到另外一个就绪任务时所发生的事件,当前运行任
务转为就绪(或者挂起、删除)状态,另一个被选定的就绪任务成为当前任
务。

上下文切换包括保存当前任务的运行环境,恢复将要运行任务的运行环
境。

上下文的内容依赖于具体的CPU.
轮转调度(Round-Robin Scheduling):使所有相同优先级,状态为ready的任务公平
分享CPU(分配一定的时间间隔,使个任务轮流享有CPU).系统由256个优先级,从0
到255,0为最高,255为最低. 任务在被创建时设定了优先级.也可用
taskPrioritySet( )来改变任务优先级.
任务的主要状态: READY,PEND,DELAY,SUSPEND...
ready-------->pended
-----------semTake( )/msgQReceive( )-其他任务
ready-------->delayed-----------taskDelay( )
ready-------->suspended---------taskSuspend( )
pended------->ready-------------semaGive( )/msgQSe
nd( )-其他任务
pended------->suspended---------taskSuspend( )
delayed------>ready-------------expired delay
delayed------>suspended---------taskSuspend( )
suspended---->ready-------------taskResume( )/task
Activate( )
suspended---->pended------------taskResume( )
suspended---->delayed-----------taskResume( )
轮转调度 (Round-Robin): 轮转调度可以扩充到优先抢占
方式中,当多个任务优先级相同的情况下,轮转调度算法使
任务按平等的时间片运行于CPU,共享CPU.避免一个任务长
时间占用CPU,而导致其他任务不能运行.可以用
kernelTimeSlice( )来定义时间长度.
taskLock( )和taskUnlock( )用来取消优先抢占方式
和恢复优先抢占方式.
注意: 一个任务可以调用taskDelete( )删除另一个任务,
但是如果一个当前正在运行的任务被删除后,该任务的内存
没有释放,而其他任务不知道,依然在等待,结果导致系统
stop.用taskSafe( )和taskUnsafe( )来保证正在运
行的任务不被删除.
用法如下:
taskSafe ();
semTake (semId, WAIT_FOREVER); semTake (semId, WAIT_FOREVER)
/* Block until semaphore available */
. . . . critical region .
semGive (semId); semGive (semId);
/* Release semaphore */
taskUnsafe ();
•任务间的同步和进程间协调
信号量作为任务间同步和互斥的机制。

在 wind 核中有几种类型的信号量,
它们分别针对不同的应用需求:二进制信号量、计数信号量、互斥信号量和
POSIX 信号量。

所有的这些信号量是快速和高效的,它们除了被应用在开发
设计过程中外,还被广泛地应用在VxWorks 高层应用系统中。

对于进程间
通信,wind 核也提供了诸如消息队列、管道、套接字和信号等机制。

任务间的同步和进程间协调的几种方式:
1.内存共享(Shared Memory),对简单的数据共享而言.
2.信号量(Semaphore),基本的互斥和同步.
3.消息队列(Message queues)和管道(Pipe),单个CPU中,任务间的信息传递.
4.套结字(Socket)和远程调用(Remote procedure calls),相对于网络任务间
的通信.
5.信号(Signals),出错处理(Exception handling).
互斥(Mutual Exclusion)
互斥是用来控制多任务对共享数据进行串行访问的同步机制。

在多任务应用中,当两个或多个任务同时访问共享数据时,可能会造成数据破坏。

互斥使它们串行地访问数据,从而达到保护数据的目的.
解决互斥的几种方法:
1. 关闭中断的方法(intLock): 能解决任务和中断ISR之间产生的互斥.
funcA ()
{ int lock = intLock();
. . critical region that cannot be interrupted .
intUnlock (lock); }
但在实时系统中采取这个办法会影响系统对外部中断及时
响应和处理的能力.
2. 关闭系统优先级(taskLock): 关闭系统优先级,这样在当前任务执行时,除了中断外,不会有其他优先级高的任务来抢占CPU,影响当前程序运行.
funcA ()
{ taskLock ();
. . critical region that cannot be interrupted .
taskUnlock (); }
这种方法阻止了高优先级的任务抢先运行,在实时系统中也是不适合的,除非关闭优先级的时间特别短.
3. 信号量(Semaphore):信号量是解决互斥和同步协调进程最好的方法
•当一个Semaphore创建时,指定了任务队列的种类
A.semBCreat( SEM_Q_PRIORITY,
SEM_FULL), SEM_Q_PRIORITY 指明处于等待状
态的任务在等待队列中以优先级的顺序排列
B.semBCreat(SEM_Q_FIFO,SEM_FULL), SEM_Q_FIF
O指明处于等待状态的任务在等待队列中以先进先
出的顺序排列
•当一个Semaphore创建时,指定了这个semaphore是用在解决互斥还是用来同步任务
A.semBCreat( SEM_Q_FIFO, SEM_FULL) , SEM_FULL
指明用于任务间互斥.
SEM_ID semMutex;
semMutex = semBCreate (SEM_Q_PRIORITY,
SEM_FULL);
.........
semTake (semMutex, WAIT_FOREVER);
. . critical region, only accessible
by a single task at a time .
semGive (semMutex);
B.semBCreat(SEM_Q_FIFO,SEM_EMPTY), SEM_EMPTY
指明用于任务间同步.
/* includes */
#include "vxWorks.h"
#include "semLib.h"
SEM_ID syncSem;
/* ID of sync semaphore */
init ( int someIntNum )
{ /* connect interrupt service routine
*/
intConnect (INUM_TO_IVEC (someIntNum),
eventInterruptSvcRout, 0);
/* create semaphore */
syncSem = semBCreate (SEM_Q_FIFO,
SEM_EMPTY);
/* spawn task used for synchronization.
*/
taskSpawn ("sample", 100, 0, 20000,
task1, 0,0,0,0,0,0,0,0,0,0);
}
task1 (void)
{ ...
semTake (syncSem, WAIT_FOREVER);
/* wait for event to occur */
printf ("task 1 got the semaphore\n");
...
/* process event */
}
eventInterruptSvcRout (void)
{ ...
semGive (syncSem);
/* let task 1 process event */
文档来源为:从网络收集整理.word版本可编辑.欢迎下载支持.
...
}
优先级反转(Priority Inversion)
优先级反转是指一个任务等待比它优先级低的任务释放资源而被阻塞,如果
这时有中等优先级的就绪任务,阻塞会进一步恶化。

优先级继承技术可用来
解决优先级反转问题。

Priority inversion arises when a higher-priority task is forced to
wait an indefinite period of time for a lower-priority task to
complete.
优先级继承(Priority Inheritance)
优先级继承可用来解决优先级反转问题。

当优先级反转发生时,优先级较低
的任务被暂时地提高它的优先级,使得该任务能尽快执行,释放出优先级较
高的任务所需要的资源。

The mutual-exclusion semaphore has the option SEM_INVERSION_SAFE,
which enables a priority-inheritance algorithm. The
priority-inheritance protocol assures that a task that owns a
resource executes at the priority of the highest-priority task
blocked on that resource. Once the task priority has been elevated,
it remains at the higher level until all mutual-exclusion semaphores
that the task owns are released; then the task returns to its normal,
or standard, priority. Hence, the "inheriting" task is protected from
preemption by any intermediate-priority tasks. This option must be
used in conjunction with a priority queue (SEM_Q_PRIORITY).
11。

相关文档
最新文档