77范文网 - 专业文章范例文档资料分享平台

VX编程手册(5)

来源:网络收集 时间:2019-04-15 下载这篇文档 手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:或QQ: 处理(尽可能给您提供完整文档),感谢您的支持与谅解。点击这里给我发消息

VxWorks编程手册

在VxWorks中,两个消息队列子程序库,一个是msgQLib,提供WIND消息队列,为VxWorks设计的;另一个是mqPxLib,与POSIX标准兼容的,用于实时性的扩展。下面主要说明WIND消息队列。 WIND消息队列由下表的函数创建和删除,它提供了先入先出机制的消息排队方法,只有一个例外:当有两个优先级别时,标志有高优先级别的消息被加入到队列的前面。 msgQCreate( ) msgQDelete( ) msgQSend( ) Allocate and initialize a message queue. Terminate and free a message queue. Send a message to a message queue. msgQReceive( ) Receive a message from a message queue. 函数msgQCreate( )用来创建消息,它的参数指明最大的排队消息数和每个消息的最大长度。

任务或ISR用函数msgQSend( )发送消息,如果没有等待队列中的消息,那么消息被加入到消息缓存中;如果有任务正在等待队列中的消息,那么此消息被立即传到第一个等待任务。 任务接收消息用函数msgQReceive( )。如果队列中有消息,那么第一个消息立即从队列中取出并返回到调用者;如果没有可用消息,那么调用任务阻塞,并被加入到消息等待任务队列。任务等待队列可能是基于任务优先级或先入先出(FIFO)机制,取决于任务创建时的选项参数。

超时: 函数msgQSend( )和 msgQReceive( )都有超时参数,当发送消息时,如果消息队列没有空间可用,超时参数指明等待缓存空间可用的ticks数;当接受消息时,如果队列没有消息,超时参数指明等待消息可用的ticks数。NO_WAIT (0)表示不等待;WAIT_FOREVER (-1)表示永远等待。 紧急消息: 函数msgQSend( )可以指明消息的优先级,(MSG_PRI_NORMAL)或(MSG_PRI_URGENT)。正常消息被加到队列尾,紧急消息被加到队列头。

POSIX与Wind消息队列的比较: 特点 消息优先级别 等待任务队列 接受超时 任务通知 Wind消息队列 1 FIFO或基于优先级 可选 无 POSIX消息队列 32 基于优先级 无 可选(只针对一个任务) 第 21 页 共 35 页

VxWorks编程手册

Close/Unlink Semantics 无 有 显示消息队列属性: 在VxWorks中,show()函数可以显示消息队列的属性信息。 服务器和客户端的消息队列: 实时系统通常是由客户/服务器任务组成,服务器任务接收客户端的请求,并提供一些服务,通常是返回应答,请求和应答通常采用任务间消息的形式,在VxWorks中,消息队列或管道是实现它的常用方法。

每个服务器创建一个消息队列用来接受客户端的请求,每个客户端也创建一个队列用来接收应答。

管道(pipes): 管道通过I/O系统为消息队列工具提供另一种接口。管道是虚拟的I/O设备,由驱动pipeDrv管理。函数pipeDevCreate( )创建一个管道设备,它与下面的消息队列相对应。调用者指明管道名称、最大消息数、消息的最大长度:

status = pipeDevCreate (\/pipe/name\max_msgs, max_length); 管道可以看作是命名的I/O设备,任务可以调用标准的I/O函数对管道进行打开、读、写操作。当从一个空的管道读数据时,任务发生阻塞,直到有数据可用;当像一个已经满的管道写时,任务也发生阻塞,直到有内存空间可用。与消息队列一样,ISR也可以向管道写,但不能读。 管道提供了一个队列没有的功能——它能够进行SELECT,即允许任务等待任何可用I/O设备上的数据,包括管道、SOCKET和串口设备。

网络上的任务间通讯: sockets: 在VxWorks中,基本的网络上的任务间通讯是使用sockets。VxWorks支持TCP/UDP,其源码与BSD4.4 UNIX兼容。 RPC: RPC使用sockets在为底层通讯机制,它允许一台机器上的程序调用此台机器的另一个进程或远程机器上的进程的一个程序。RPC为客户/服务器模式中的请求和应答的传递提供了标准协议。

信号(Signals): VxWorks支持软件信号通知,异步的信号可以改变任务的控制流,任何任务或ISR都可以为特殊任务生成信号通知。被通知的任务立即悬挂当前执行的线程,执行指定的处理程序(一被安排运行的)。信号更适合于错误或异常情况的处理,通常信号处理被看作ISR,它不调用任何其他程序,因为这可能会引起阻塞。由于信号通知是异步的,当有一个特殊的信号通知时,很难判断那些资源不可用,出于安全考虑,只调用ISR能够调用的函数。只有当你确认你的信号处理程序不会发生死锁时,才可以违背这个原则。 WIND内核支持两种类型的信号通知接口:UNIX BSD类型的和POSIX类型的。 下表是基本的信号通知程序, POSIX signal( ) kill( ) UNIX BSD signal( ) kill( ) Description Specify the handler associated with a signal. Send a signal to a task. 第 22 页 共 35 页

VxWorks编程手册

raise( ) sigaction( ) sigsuspend( ) sigpending( ) sigemptyset( ) sigfillset( ) sigaddset( ) sigdelset( ) sigismember( ) sigprocmask( ) sigprocmask( ) N/A sigvec( ) pause( ) N/A sigsetmask( ) Send a signal to yourself. Examine or set the signal handler for a signal. Suspend a task until a signal is delivered. Retrieve a set of pending signals blocked from delivery. Manipulate a signal mask. sigsetmask( ) sigblock( ) Set the mask of blocked signals. Add to a set of blocked signals. 为了能够使用信号通知,信号库初始化程序sigInit( )必须被调用,通常在usrInit( )函数中,启动中断之前。通常,信号通知类似于硬件的中断,每个信号处理程序对应于一种特殊的信号,即使用函数sigvec( )或 sigaction( ),某些信号与硬件的异常相关联,如总线错误、非法指令、浮点异常等,都会产生信号通知。 在VxWorks中可以选择INCLUDE_SIGNALS组件来包含信号功能。在你的应用程序能够使用POSIX信号通知之前,你必须分别对他们进行初始化,即调用函数sigqueueInit( ),同sigInit( )函数,通常在函数sysInit( )运行之后在函数usrInit( )中调用。 3、中断

硬件中断处理在实时系统中是非常重要的,因为系统接收外部事件完全通过中断实现的。为了对中断做出最快地反映,中断服务程序ISR运行在任务内容之外的特殊内容内,因此,中断处理不涉及任务切换。 在intLib和 intArchLib库内提供了如下中断函数: Call intConnect( ) intContext( ) intCount( ) intLevelSet( ) intLock( ) intUnlock( ) intVecBaseSet( ) intVecSet( ) intVecGet( ) Description Connect a C routine to an interrupt vector. Return TRUE if called from interrupt level. Get the current interrupt nesting depth. Set the processor interrupt mask level. Disable interrupts. Re-enable interrupts. Set the vector base address. Set an exception vector. Get an exception vector. intVecBaseGet( ) Get the vector base address.

将程序连接到中断: VxWorks提供了函数intConnect(),它允许C函数连接到任何中断,其参数是要连接中断的字节偏移量,将被连接的C函数地址,及传递给函数的参数。当用这种方式建立的矢量中断发生时,在中断层调用被连接的C函数。当中断处理完成时,被连接的函数也完成操作。用这种方式连接到中的程序叫做ISR。

第 23 页 共 35 页

VxWorks编程手册

实际上,中断不能直接引导到C函数。intConnect( )函数建立一部分代码,保存必要的寄存器内容,用传递的参数建立堆栈实体(可以是一个特殊的中断堆栈,也可以是当前的任务堆栈),然后调用被连接的函数。完成返回时,他保存寄存器和堆栈,退出中断。

中断堆栈: 一般情况,所有的ISR都使用同一个堆栈,在系统启动时,根据配置参数分配和初始化此堆栈,堆栈要足够大,使其能够处理最坏情况下的堆栈嵌套。在开发过程中可以使用checkStack( )函数观察如何关闭任务以及ISR如何耗尽可用的堆栈空间。

ISR的特殊限制: ISR有些限制,因为ISR不能运行在REGULAR任务中,他没有任务控制域,并且所有的ISR都共享一个堆栈。 能够被ISR调用的函数: LIBRARY bLib errnoLib 函数 All routines errnoGet( ), errnoSet() 等等,建P123。 因此,ISR的基本限制是:ISR不能调用可能引起阻塞的函数。例如,ISR不能试图获取信号量,因为如果信号量刚好不可用,内核将把调用任务切换到悬挂状态。然而,ISR可以释放信号量。 因为内存操作函数malloc( )和 free( )需要获取信号量,因此ISR不能调用他们,同时,ISR也不能地调用任何创建和删除函数,因为这些函数可能要调用malloc( )和 free( )。 ISR也不能执行I/O驱动操作,因为大部分设备驱动器都可能需要任务上下文,这些任务可能阻塞以等待设备可用。一个例外是VxWorks pipe驱动器,它允许被ISR写。 VxWorks提供了日志功能,它将文本消息打印到console口,这是从ISR打印消息的常用方式。ISR也不能调用浮点处理器的函数,因此ISR不能处理浮点指令,为了使ISR能够处理浮点指令,必须用fppArchLib库中的函数保存浮点寄存器的内容。ISR可以使用链表和环形缓存。

中断层的异常: 当任务引起硬件中断时,如非法指令或总线错误,那么任务被悬挂,系统其他的部分继续运行。在VxWorks中,会将异常的描述信息保存在内存的特殊位置,然后重新启动系统。VxWorks的启动程序(ROM)检测内存中异常描述信息的存在,如果信息被删除了,就将异常信息显示到console口。ROM中的e命令可以重新显示异常信息。

第 24 页 共 35 页

VxWorks编程手册

当在中断层高频率的使用内核调用时,会经常发生异常。通常表现为清除中断信号或类似的驱动问题。 在某些情况下,低级中断可能需要系统失败响应等事件,因此,需要RESERVE最高级别的中断,以保证对这些事件的零延迟。为了实现至一点,VxWorks提供了函数

intLockLevelSet( ),他设置中断级别到指定级别。如果你没有指定,缺省为最高级别。

中断到任务的通讯: VxWorks中的许多函数不能访问中断层的代码,包括I/O到任何设备(除了PIPE),但下面的技术能够实现ISR到任务的通讯:

1、 共享内存和环形缓存:ISR能够和任务层代码共享变量、缓存和环形缓存; 2、 信号量:ISR能够释放任务获取的或等待的信号量(除了互操作信号量);

3、 消息队列:ISR能够将消息发送到任务的消息队列中,如果队列已满,则消息被丢

弃;

4、 PIPES:ISR能够将消息写到pipes中,然后任务可以从中读取。任务和ISR能够向同

一个PIPE写。然而,如果PIPE已满,消息将被丢弃,因为ISR不能阻塞。除了写操作,ISR不能调用其他I./O函数对PIPE进行操作;

5、 信号通知:ISR能够通知任务,实现信号处理的异步调度

4、I/O系统 4.1介绍

VxWorks的I/O系统为各种设备提供一个简单、统一的与设备无关的接口,包括: 1、 面向字节的设备,如终端 2、 可自由访问的设备,如硬盘 3、 虚拟设备,如pipes或sockets

4、 显示器和控制设备,如数字I/O设备 5、 可以访问远端设备的网络设备

VxWorks为基本的I/O和基于缓存的I/O提供了标准C库。下图显示了VxWorks中I/O系统各单元的关系:

第 25 页 共 35 页

百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库VX编程手册(5)在线全文阅读。

VX编程手册(5).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印 下载失败或者文档不完整,请联系客服人员解决!
本文链接:https://www.77cn.com.cn/wenku/zonghe/599177.html(转载请注明文章来源)
Copyright © 2008-2022 免费范文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ: 邮箱:tiandhx2@hotmail.com
苏ICP备16052595号-18
× 注册会员免费下载(下载后可以自由复制和排版)
注册会员下载
全站内容免费自由复制
注册会员下载
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: