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)在线全文阅读。
相关推荐: