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

VX编程手册(3)

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

VxWorks编程手册

case. Instead some other state information needs to be changed; for example, using a NULL pointer in the delete hook to be detected by the switch hook.

任务创建、状态转换和删除的钩子函数如下: 描述 Add a routine to be called at every task create. Delete a previously added task create routine. Add a routine to be called at every task switch. Delete a previously added task switch routine. Add a routine to be called at every task delete. Delete a previously added task delete routine. 函数 taskCreateHookAdd( ) taskCreateHookDelete( ) taskSwitchHookAdd( ) taskSwitchHookDelete( ) taskDeleteHookAdd( ) taskDeleteHookDelete( )

1.6任务错误状态:

VxWorks中的errno变量是针对任务的,而不是系统范围的。当一个函数遇到错误时,会将errno变量设为合适的值,注意:在VxWorks中,errno变量不是全局变量,它包含在error.h中,要用rxtern int errno定义。 全局变量errno从来不会被VxWorks函数清除,它一直表示最后被设置的错误状态,它只表示底层函数(被调用函数)的错误值,而不是调用函数的值。推荐使用这种机制以便于调试。用函数printErrno( )可以显示与errno对应的字符串常量。

1.7任务异常的处理

程序中错误的代码和数据可能引起硬件异常,如非法指令、总线或地址错误、被零除等。在VxWorks中缺省的异常处理方法是悬挂此任务,在异常点保存任务状态,内核和其他任务继续运行。通过signal工具,对于某些特定的硬件异常,任务可以有自己的处理方式,此时系统缺省的异常处理方法不起作用。常用的函数是setjmp( )和longjmp( )。软件的异常处理同样如此。

1.8共享代码和重载入

在VxWorks中,一段代码或程序被多个任务调用是很常见的,即共享代码。多个任务调用共享代码的一个冲突是修改全局或静态变量,因此需要重载入,VxWorks得动态连接工具使其尤其简单。

第 11 页 共 35 页

VxWorks编程手册

在VxWorks中,大部分程序是可重载的。但是,如果程序someName( )有一个对应的函数someName_r( ),那么,你应该认为someName( )是不可重载的,而someName_r( )是可重载的。VxWorks的I/O和驱动程序是可重载的,但需要仔细设计。对于I/O,推荐用文件指针缓存。 多数VxWorks程序是用下面的重载技术:

1、 动态堆栈变量

2、 被信号量监护的全局或静态变量 3、 任务变量

在编写应用程序代码时,如果可能被多个任务调用,推荐采用相同的技术。

动态堆栈变量: 许多程序都是纯代码的,除了动态堆栈变量之外没有其他自己的数据,它所需要的数据由调用者的参数传递。

图——堆栈变量和共享代码

全局变量和静态变量: 为了避免多个任务对全局或静态变量的同时访问,通常采用互斥机制,即由semMLib库提供的mutex semaphore工具。

任务变量: 有些被多个任务同时调用的程序,在使用某个全局变量或静态变量时,每个任务需要有不同的值。为了实现这一点,VxWorks提供了一个叫任务变量的技术,它允许增加4字节的变量到任务内容中,以使任务进行切换时变量值也被切换,通常,几个任务声明同样的变量(4字节的内存域)作为任务变量,这样每个任务都可以像对待自己私有变量一样对待内存域。VxWorks提供以下几个函数:taskVarAdd( ),taskVarDelete( ), taskVarSet( ), 和 taskVarGet( ),参见taskVarLib库。

多任务有同一个主程序: 在VxWorks中,可能会遇到如下情况:当生成任务时,几个任务有同一个主程序,每个新任务都有自己的堆栈和内容,也为主程序传递不同的参数,这是很有用的。例子:

第 12 页 共 35 页

VxWorks编程手册

机械手的多个节点都是用同一段代码,任务调用函数操纵节点,节点数标示手臂上哪个节点被操纵。

1.9VxWorks系统任务

VxWorks包括许多系统任务:

BOOT任务:

ROOT任务时内核执行的第一个任务,其入口函数是usrRoot(),它初始化大部分VxWorks设备它有生成日志任务、异常任务、网络任务和tRlogind daemon等。通常,root任务初始化完成之后将被删除。注意:小心修改usrRoot()函数,要注意初始化的顺序。

Logging任务:tLogTask 此任务被VxWorks模块记录系统消息,而不用在当前任务中执行I/O。可以配置INCLUDE_LOGGING选项来加入日至任务。 异常任务:tExcTask 此函数支持VxWorks的异常处理,只用函数而不用中断,也用来处理当前任务不能处理的异常,如任务的自删除。此任务必须有最高的优先级,并且悬挂、删除,也不能改变它的优先级,可以配置INCLUDE_EXC_HANDLING选项来加入异常处理任务。详见exclib库。 网络任务:tNetTask 此任务处理VxWorks网络所需要的任务层函数。 Target Agent任务: tWdbTask 如果目标代理被设置成在任务模式下运行,就需要创建此任务。它对来自Tornado target server的请求作处理和响应。可以配置INCLUDE_WDB选项来加入目标代理任务。 Target Shell任务:tShell 如果在VxWorks配置中加入了目标命令行任务,此任务就被创建,任何程序或任务都由命令行调用。可以配置INCLUDE_SHELL选项来加入命令行任务。 rlogin任务:tRlogind 如果在VxWorks配置中加入了目标命令行和rlogin任务,后台程序就允许远端用户登陆到VxWorks.系统,它接受远端的登陆请求,并生成tRlogInTask和tRlogOutTask.任务。只要用户一直在登陆状态,任务就一直存在。在此会话过程中,命令行的输入、输出都被定向到远端用户。可以配置INCLUDE_RLOGIN选项来加入rlogin任务。 telnet 任务: tTelnetd 类似rlogin。

RPC Server 任务: tPortmapd 略

1.10任务堆栈

在VxWorks中有一个任务堆栈,每个任务有一个异常堆栈,同时,系统还有一个中断堆栈。

VxWorks提供了堆栈溢出检测,为了检测堆栈溢出,系统增加了附加的page到堆栈结尾,它标记为用户模式的任务不可访问。如果试图对page写操作,就发生堆栈溢出异常,但这并不会一定发生。为了取消堆栈溢出保护,创建任务时选项VX_NO_STACK_OVERFLOW必须被设置。

第 13 页 共 35 页

VxWorks编程手册

任务堆栈: 所有任务函数都会用到任务堆栈,其堆栈大小由创建任务时的stackSize参数制定,其值参考如下:

1、 It will be rounded up to a page boundary.

2、An additional mapped, but inaccessible, page will be added if stack overflow detection is requested.

堆栈从保护域内存资源分配。

任务异常堆栈: 每个任务都有异常堆栈,堆栈大小取决于系统的配置参数TASK_EXC_STACK_SIZE.。从内核内存分配,并保存发生异常或系统调用时的重要信息。在系统调用中,系统的关键数据保存到任务异常堆栈后,就切换到任务堆栈。 异常堆栈没有溢出检测保护。 中断堆栈: VxWorks有一个单独的中断堆栈,与异常堆栈类似,只是它应用于整个系统。

2任务间通讯

VxWorks提供丰富的任务间通讯机制,包括:

1、 共享内存(Shared memory):简单的数据共享;

2、 信号量(Semaphores):基本的互斥信号量和同步信号

3、 消息队列和管道(Message queues and pipes):在一个CPU内的任务间消息传递; 4、 Sockets和远程过程调用(RPC):任务间通讯的网络透传; 5、 信号(Signals):异常处理;

可选产品VxMP和VxFusion提供了多个CPU的任务间通讯功能。

2.1共享内存结构

对于任务间通讯,最直接的方法是访问共享数据结构。

图——共享数据结构

2.2互斥变量

虽然共享地址空间简化了数据的交换,但是,为了防止对共享数据的抢占,连锁访问内存是十分重要的。方法包括取消中断、取消抢占,用信号量锁定资源等。

第 14 页 共 35 页

VxWorks编程手册

中断的锁定和等待时间:

最强有力的互斥方式是取消中断,这种锁保证独占访问CPU。 funcA () {

int lock = intLock(); .

. critical region that cannot be interrupted .

intUnlock (lock); } 但是,终端锁可能会带来一些问题,如它阻止系统立即对外部事件做出反应(ISR)。因此,锁定时间要尽量的短。

抢占锁和等待时间: 取消抢占可能会减少一些对互斥操作的一些限制,当一个任务正在执行时,不允许其他任务抢占,但ISR可以运行: funcA () {

taskLock (); .

. critical region that cannot be interrupted .

taskUnlock (); } 但是,这种方法也会导致过长的实时响应,例如,当任务没有执行完锁定域的程序,其他高优先级的任务是不允许执行的。因此,应用这种方法时,要使锁定时间尽量的短。

2.3Semaphores信号量

信号量为VxWorks提供了更快的任务间通讯机制。Semaphores are the primary means for addressing the requirements of both mutual exclusion and task synchronization:

? 对于互斥操作,信号量对共享资源实现互锁访问,相对于取消中断或抢占锁,它为

互斥操作提供了更高的粒度;

? 对于同步,信号量配合任务执行与外部事件交互。 这有三种信号量,以解决不同问题: binary:

最快捷、最通用的信号量,用以优化同步信号或互斥信号; mutual exclusion: 一个特殊的二进制信号量,优化互斥信号量内部问题:优先级继承、安全删除和递归; counting: 与二进制信号量相似,但是要记录信号量的使用次数,能够优化对一个资源的多个实例的保护。

VxWorks不仅提供了Wind信号量,同时也提供了POSIX信号量。

第 15 页 共 35 页

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

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