vxworks系统及函数详解.docx
- 文档编号:10776121
- 上传时间:2023-02-22
- 格式:DOCX
- 页数:38
- 大小:61.01KB
vxworks系统及函数详解.docx
《vxworks系统及函数详解.docx》由会员分享,可在线阅读,更多相关《vxworks系统及函数详解.docx(38页珍藏版)》请在冰豆网上搜索。
vxworks系统及函数详解
VxWork介绍及编程
VxWork介绍及编程
一.嵌入式操作系统VxWorks简介
VxWorks操作系统是美国WindRiver公司于1983年设计开发的一种嵌入式实时操作系统(RTOS),是嵌入式开发环境的关键组成部分。
良好的持续发展能力、高性能的内核以及友好的用户开发环境,在嵌入式实时操作系统领域占据一席之地。
它以其良好的可靠性和卓越的实时性被广泛地应用在通信、军事、航空、航天等高精尖技术及实时性要求极高的领域中,如卫星通讯、军事演习、弹道制导、飞机导航等。
在美国的F-16、FA-18战斗机、B-2隐形轰炸机和爱国者导弹上,甚至连1997年4月在火星表面登陆的火星探测器上也使用到了VxWorks。
实时操作系统和分时操作系统的区别
从操作系统能否满足实时性要求来区分,可把操作系统分成分时操作系统和实时操作系统。
分时操作系统按照相等的时间片调度进程轮流运行,分时操作系统由调度程序自动计算进程的优先级,而不是由用户控制进程的优先级。
这样的系统无法实时响应外部异步事件。
实时操作系统能够在限定的时间内执行完所规定的功能,并能在限定的时间内对外部的异步事件作出响应。
分时系统主要应用于科学计算和一般实时性要求不高的场合。
实时性系统主要应用于过程控制、数据采集、通信、多媒体信息处理等对时间敏感的场合。
VxWorks的特点
∙可靠性
操作系统的用户希望在一个工作稳定,可以信赖的环境中工作,所以操作系统的可靠性是用户首先要考虑的问题。
而稳定、可靠一直是VxWorks的一个突出优点。
自从对中国的销售解禁以来,VxWorks以其良好的可靠性在中国赢得了越来越多的用户。
∙实时性
实时性是指能够在限定时间内执行完规定的功能并对外部的异步事件作出响应的能力。
实时性的强弱是以完成规定功能和作出响应时间的长短来衡量的。
VxWorks的实时性做得非常好,其系统本身的开销很小,进程调度、进程间通信、中断处理等系统公用程序精练而有效,它们造成的延迟很短。
VxWorks提供的多任务机制中对任务的控制采用了优先级抢占(PreemptivePriorityScheduling)和轮转调度(Round-RobinScheduling)机制,也充分保证了可靠的实时性,使同样的硬件配置能满足更强的实时性要求,为应用的开发留下更大的余地。
∙可裁减性
用户在使用操作系统时,并不是操作系统中的每一个部件都要用到。
例如图形显示、文件系统以及一些设备驱动在某些嵌入系统中往往并不使用。
VxWorks由一个体积很小的内核及一些可以根据需要进行定制的系统模块组成。
VxWorks内核最小为8kB,即便加上其它必要模块,所占用的空间也很小,且不失其实时、多任务的系统特征。
由于它的高度灵活性,用户可以很容易地对这一操作系统进行定制或作适当开发,来满足自己的实际应用需要。
对一个实时内核的要求
一个实时操作系统内核需满足许多特定的实时环境所提出的基本要求,这些包括:
多任务:
由于真实世界的事件的异步性,能够运行许多并发进程或任务是很重要的。
多任务提供了一个较好的对真实世界的匹配,因为它允许对应于许多外部事件的多线程执行。
系统内核分配CPU给这些任务来获得并发性。
抢占调度:
真实世界的事件具有继承的优先级,在分配CPU的时候要注意到这些优先级。
基于优先级的抢占调度,任务都被指定了优先级,在能够执行的任务(没有被挂起或正在等待资源)中,优先级最高的任务被分配CPU资源。
换句话说,当一个高优先级的任务变为可执行态,它会立即抢占当前正在运行的较低优先级的任务。
任务间的通讯与同步:
在一个实时系统中,可能有许多任务作为一个应用的一部分执行。
系统必须提供这些任务间的快速且功能强大的通信机制。
内核也要提供为了有效地共享不可抢占的资源或临界区所需的同步机制。
任务与中断之间的通信:
尽管真实世界的事件通常作为中断方式到来,但为了提供有效的排队、优先化和减少中断延时,我们通常希望在任务级处理相应的工作。
所以需要杂任务级和中断级之间存在通信。
二.系统编程方法
了解系统编程对程序员来说尤为重要。
根据Drew个人的经验基本上操作系统编程都是类似的,认真读懂一种,就很容易的理解另一种。
下面是Drew翻的VxWorksprogrammerguide中的基本内容,有一些内容是Drew个人的理解。
理解这些内容对实时操作编程非常重要。
实时系统主要包括:
多任务调度(采用优先级抢占方式),任务间的同步和进程间通信机制。
一个多任务环境允许实时应用程序以一套独立任务的方式构筑,每个任务拥有独立的执行线程和它自己的一套系统资源。
进程间通信机制使得这些任务的行为同步、协调。
wind使用中断驱动和优先级的方式。
它缩短了上下文转换的时间开销和中断的时延。
在VxWorks中,任何例程都可以被启动为一个单独的任务,拥有它自己的上下文和堆栈。
还有一些其它的任务机制可以使任务挂起、继续、删除、延时或改变优先级。
另一个重要内容是:
硬件中断处理。
硬件产生中断,统治系统调用相应的中断历程(ISR),位是系统得到尽快的响应,ISR在它自己独立的上下文和堆栈中运行.它的优先级高于任何任务优先级.
[
size=-1]TaskStateTransitions
中断延迟(InterruptLatency)中断延迟是指从硬件中断发生到开始执行中断处理程序第一条指令之间的这段时间。
优先级驱动(Priority-Driven)优先级驱动是指多任务系统中,当前运行任务总是具有最高优先级的就绪任务。
∙多任务调度
两种方式:
优先抢占和轮转调度(PreemptivePriority,Round-RobinScheduling).
优先抢占(PreemptivePriority):
每一个任务都有一个优先级,系统核心保证优先级最高的任务运行于CPU.如果有任务优先级高于当前的任务优先级,系统立刻保存当前任务的上下文,切换到优先级高的上下文.
[size=-1]PriorityPreemption
抢占(Preemptive):
抢占是指当系统处于核心态运行时,允许任务的重新调度。
换句话说就是指正在执行的任务可以被打断,让另一个任务运行。
抢占提高了应用对异步事件的响应性能力。
操作系统内核可抢占,并不是说任务调度在任何时候都可以发生。
例如当一个任务正在通过一个系统调用访问共享数据时,重新调度和中断都被禁止.
任务上下文(TaskContext):
任务上下文是指任务运行的环境。
例如,针对x86的CPU,任务上下文可包括程序计数器、堆栈指针、通用寄存器的内容.
上下文切换(ContextSwitching):
多任务系统中,上下文切换是指CPU的控制权由运行任务转移到另外一个就绪任务时所发生的事件,当前运行任务转为就绪(或者挂起、删除)状态,另一个被选定的就绪任务成为当前任务。
上下文切换包括保存当前任务的运行环境,恢复将要运行任务的运行环境。
上下文的内容依赖于具体的CPU.
轮转调度(Round-RobinScheduling):
使所有相同优先级,状态为ready的任务公平分享CPU(分配一定的时间间隔,使个任务轮流享有CPU).
[size=-1]Round-RobinScheduling
系统由256个优先级,从0到255,0为最高,255为最低.任务在被创建时设定了优先级.也可用taskPrioritySet()来改变任务优先级.
任务的主要状态:
READY,PEND,DELAY,SUSPEND...
ready-------->pended-----------semTake( )/msgQReceive( )-其他任务
ready-------->delayed-----------taskDelay( )
ready-------->suspended---------taskSuspend( )
pended------->ready-------------semaGive( )/msgQSend( )-其他任务
pended------->suspended---------taskSuspend( )
delayed------>ready-------------expireddelay
delayed------>suspended---------taskSuspend( )
suspended---->ready-------------taskResume( )/taskActivate( )
suspended---->pended------------taskResume( )
suspended---->delayed-----------taskResume( )
轮转调度(Round-Robin):
轮转调度可以扩充到优先抢占方式中,当多个任务优先级相同的情况下,轮转调度算法使任务按平等的时间片运行于CPU,共享CPU.避免一个任务长时间占用CPU,而导致其他任务不能运行.可以用kernelTimeSlice( )来定义时间长度.
taskLock
注意:
一个任务可以调用taskDelete()删除另一个任务,但是如果一个当前正在运行的任务被删除后,该任务的内存没有释放,而其他任务不知道,依然在等待,结果导致系统stop.用taskSafe()和taskUnsafe()来保证正在运行的任务不被删除.
用法如下:
taskSafe();
semTake(semId,WAIT_FOREVER);
/*Blockuntilsemaphoreavailable*/
.. .. criticalregion.
semGive(semId); semGive(semId);
/*Releasesemaphore*/
taskUnsafe();
∙任务间的同步和进程间协调
信号量作为任务间同步和互斥的机制。
在wind核中有几种类型的信号量,它们分别针对不同的应用需求:
二进制信号量、计数信号量、互斥信号量和POSIX信号量。
所有的这些信号量是快速和高效的,它们除了被应用在开发设计过程中外,还被广泛地应用在VxWorks高层应用系统中。
对于进程间通信,wind核也提供了诸如消息队列、管道、套接字和信号等机制。
任务间的同步和进程间协调的几种方式:
∙
o内存共享(SharedMemory),对简单的数据共享而言.
o信号量(Semaphore),基本的互斥和同步.
o消息队列(Messagequeues)和管道(Pipe),单个CPU中,任务间的信息传递.
o套结字(Socket)和远程调用(Remoteprocedurecalls),相对于网络任务间的通信.
o信号(Signals),出错处理(Exceptionhandling).
内存共享(SharedMemory)
任务间通信最通常的方式是通过共享的数据结构进行通信,因为所有VxWorks的任务存在于一个单一的线性地址空间,任务间共享数据。
全局变量、线性队列、环形队列、链表、指针都可被运行在不同上下文的代码所指向。
[size=-1]SharedDataStructures
互斥(MutualExclusion)
互斥是用来控制多任务对共享数据进行串行访问的同步机制。
在多任务应用中,当两个或多个任务同时访问共享数据时,可能会造成数据破坏。
互斥使它们串行地访问数据,从而达到保护数据的目的.
解决互斥的几种方法:
1.关闭中断的方法(intLock):
能解决任务和中断ISR之间产生的互斥.
funcA(){intlock=intLock();..criticalregionthatcannotbeinterrupted.intUnlock(lock);}但在实时系统中采取这个办法会影响系统对外部中断及时响应和处理的能力.
2.关闭系统优先级(taskLock):
关闭系统优先级,这样在当前任务执行时,除了中断外,不会有其他优先级高的任务来抢占CPU,影响当前程序运行.
funcA()
{taskLock();
..criticalregionthatcannotbeinterrupted.
taskUnlock();}
这种方法阻止了高优先级的任务抢先运行,在实时系统中也是不适合的,除非关闭优先级的时间特别短.
∙信号量(Semaphore):
信号量是解决互斥和同步协调进程最好的方法VxWorks信号量提供最快速的任务间通信机制,它主要用于解决任务间的互斥和同步。
针对不同类型的问题,有以下三种信号量:
?
二进制信号量(binary)使用最快捷、最广泛,主要用于同步或互斥;
?
互斥信号量(mutualexclusion)特殊的二进制信号量,主要用于优先级继承、安全删除和回溯;
?
计数器信号量(counting)和二进制信号量类似,保持信号量被释放(gaven)的次数,主要用于保护一个资源的多个例程(multipleinstancesofaresource)
信号量控制,函数介绍:
semBCreate()分配并初始化一个二进制信号量
semMCreate()分配并初始化一个互斥信号量
semCCreate()分配并初始化一个计数信号量
semDelete()终止一个自由的信号量
emTake()占有一个信号量
semGive()释放一个信号量
semFlush()解锁所有等待信号量的任务
semBCreate(),semMCreate(),andsemCCreate()返回一个信号量ID作为其它后续任务使用该信号量的的句柄。
当一个信号量被创建,它的队列(queue)类型就被确定。
等待信号量的任务队列以优先级的高低排列(SEM_Q_PRIORITY),或者一先到先得的方式排列(SEM_Q_FIFO).
当一个Semaphore创建时,指定了任务队列的种类
∙semBCreat(SEM_Q_PRIORITY,SEM_FULL),SEM_Q_PRIORITY指明处于等待状态的任务在等待队列中以优先级的顺序排列
∙semBCreat(SEM_Q_FIFO,SEM_FULL),SEM_Q_FIFO指明处于等待状态的任务在等待队列中以先进先出的顺序排列
∙二进制信号量(binary)
∙[size=-1]TakingaSemaphore
[size=-1]GivingaSemaphore
互斥进程(MutualExclusion)互斥信号量有效的内锁对共享资源的进入,与屏蔽中断(disablinginterrupts)和优先级锁定(preemptivelocks)相比,二进制信号量将互斥的范围限制在仅与其有关的资源上。
从技术上说,创建一个信号量来保护(guarding)资源。
信号量初始化位可用的(FULL)。
当一个Semaphore创建时,指定了这个semaphore是用在解决互斥还是用来同步任务
semBCreat(SEM_Q_FIFO,SEM_FULL),SEM_FULL指明用于任务间互斥.
SEM_IDsemMutex;
semMutex=semBCreate(SEM_Q_PRIORITY,SEM_FULL);
当一个任务要进入资源,首先要得到一个信号量(takethatsemaphore),只要有任务在使用这个信号量,其它的要进入资源的任务要停止执行(blockedfromexecution),当这个任务完成了对资源的使用,它会释放信号量,允许另一个任务来使用资源。
semTake(semMutex,WAIT_FOREVER);
..criticalregion,onlyaccessiblebyasingletaskatatime.
semGive(semMutex);
同步协调进程(Synchronization)
∙semBCreat(SEM_Q_FIFO,SEM_EMPTY),SEM_EMPTY指明用于任务间同步.
/*includes*/#include"vxWorks.h"#include"semLib.h"SEM_IDsyncSem;/*IDofsyncsemaphore*/init(intsomeIntNum){/*connectinterruptserviceroutine*/intConnect(INUM_TO_IVEC(someIntNum),eventInterruptSvcRout,0);/*createsemaphore*/syncSem=semBCreate(SEM_Q_FIFO,SEM_EMPTY);/*spawntaskusedforsynchronization.*/taskSpawn("sample",100,0,20000,task1,0,0,0,0,0,0,0,0,0,0);}task1(void){...semTake(syncSem,WAIT_FOREVER);/*waitforeventtooccur*/printf("task1gotthesemaphore/n");.../*processevent*/}eventInterruptSvcRout(void){...semGive(syncSem);/*lettask1processevent*/...}
semTake(semID,timeout)--------有Semaphore空闲,就Take,如果没有,由timeout定,超时则向下执行
∙
互斥信号量
∙互斥信号量是一个特殊的二进制信号量,设计用于优先级继承,安全删除和回归。
互斥信号量的使用基本和二进制信号量是类似的。
但有以下不同:
仅仅被用做互斥。
∙只能被使用它的任务释放.(Itcanbegivenonlybythetaskthattookit.)
∙ISR不能释放它。
∙不能使用函数semFlush()。
优先级反转(PriorityInversion)
优先级反转是指一个任务等待比它优先级低的任务释放资源而被阻塞,如果这时有中等优先级的就绪任务,阻塞会进一步恶化。
优先级继承技术可用来解决优先级反转问题。
Priorityinversionariseswhenahigher-prioritytaskisforcedtowaitanindefiniteperiodoftimeforalower-prioritytasktocomplete.
优先级继承(PriorityInheritance)
优先级继承可用来解决优先级反转问题。
当优先级反转发生时,优先级较低的任务被暂时地提高它的优先级,使得该任务能尽快执行,释放出优先级较高的任务所需要的资源。
[size=-1]PriorityInheritance
Themutual-exclusionsemaphorehastheoptionSEM_INVERSION_SAFE,whichenablesapriority-inheritancealgorithm.Thepriority-inheritanceprotocolassuresthatataskthatownsaresourceexecutesatthepriorityofthehighest-prioritytaskblockedonthatresource.Oncethetaskpriorityhasbeenelevated,itremainsatthehigherleveluntilallmutual-exclusionsemaphoresthatthetaskownsarereleased;thenthetaskreturnstoitsnormal,orstandard,priority.Hence,the"inheriting"taskisprotectedfrompreemptionbyanyintermediate-prioritytasks.Thisoptionmustbeusedinconjunctionwithapriorityqueue(SEM_Q_PRIORITY).
∙
计数信号量(CountingSemaphores)
计数信号量是任务同步和互斥的另一种实现方式.计数信号量除了保留信号量被释放的次数以外和二进制信号量是一样的。
每次信号量被释放(gaven)一次,计数增加;每次信号量被占用(taken)一次,计数减少;当计数减少为0时,要求得到信号量的任务被阻塞(blocked)。
二进制信号量是如果一个信号量被释放,有一个任务阻塞等待,则这个任务就被unblock.而计数信号量如果一个信号量被释放,没有任务阻塞等待,则计数增加。
这说明一个被释放两次的计数信号量可以被占用(taken)两次,没有阻塞。
Countingsemaphoresareusefulforguardingmultiplecopiesofresources.Forexample,theuseoffivetapedrivesmightbecoordinatedusingacountingsemaphorewithaninitialcountof5,oraringbufferwith256entriesmightbeimplementedusingacountingsemaphorewithaninitialcountof256.TheinitialcountisspecifiedasanargumenttothesemCCreate()routine.
[size=-1]CountingSemaphoreExample
[size=-1]SemaphoreCall
[size=-1]CountafterCall
[size=-1]ResultingBehavior
semCCreate()
3
Semaphoreinitializedwithinitialcountof3.
semTake()
2
Semaphoretaken.
semTake()
1
Semaphoretaken.
semTake()
0
Semaphoretaken.
semTak
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- vxworks 系统 函数 详解