VxWorks任务编程中常见异常分析

发布者:幸福微风最新更新时间:2011-11-24 来源: 电子产品世界关键字:VxWorks 手机看文章 扫描二维码
随时随地手机看文章

    在任务运行过程中,会出现一些异常的情况,导致任务不能正常运行或者对操作系统造成影响。一般来说,这些异常是由程序的逻辑错误造成的,防止这些异常情况的出现和出现后进行补救就有格外重要的意义。

 1 代码重入与共享
 
 在应用中,可能会出现多个任务调用同一段代码的情况,由于任务占用CPU是串行的,不会出现代码资源使用冲突。但是,不同优先级的任务同时调用同一段代码,则可能出现低优先级任务执行某一函数时被执行该函数的高优先级任务打断的情况,如果函数中要改写全局变量而没有使用互斥,就有可能导致错误的存取。例如在中断中调用内存分配或者释放函数,如果某个任务正在调用内存分配函数或者是内存释放函数,打断该任务时会造成异常,可能导致内存泄漏,甚至有可能会因在中断中异常而reboot。另外,如果多个任务共用的代码中有全局变量且使用目的不同,或者多个任务的代码中有全局变量同名的情况,则有可能造成变量使用中的错误。VxWorks提供了任务变量(taskVar)的方法来解决这个问题,任务可以将使用的全局变量作为任务变量独立使用,添加的任务变量保存在任务的上下文中,任务切换时保存当前内容。

2 符号表的使用

VxWorks中有模块(module)的概念。装载模块完成目标代码文件在内存中的链接,并可以将目标代码文件中的函数与全局变量加入符号表。符号表中的符号对C语言编写的函数以原来名字命名,对于C++语言的函数则是在后面加上形参的数据类型作为符号名。如f1( )的符号名为f1__Fv,最后的v表示void类型;f2(int)符号名为f2__Fi,f3(int,int)为f3__Fii,依此类推。代码的编译过程中并不对要使用的函数和变量进行检查。例如调用一个并不存在的函数编译并不报错,编译器认为此函数可能在操作系统内核中或者已经下载的目标文件中,但在目标文件下载时会找不到要调用的函数。如果符号表中的符号出现了重名,譬如两次下载的目标文件中有函数重名,则要作散列处理,之后对该函数的调用是最后加入符号表的函数,而之前已经装载的模块则不会受到影响。如果应用程序中使用了与操作系统内核同名的符号,则对操作系统某些API函数的调用将会失败。

3 特殊的任务保护

在VxWorks中,当一个任务被删除,其它任务不会得到通知,而且由于任务间的独立性,每一个任务可以无限制地删除其它任务。在应用中,我们可能会把需要保护任务误删除。VxWorks 提供的两个函数taskSafe( )和taskUnsafe( )将通知意外删除任务而引起的问题。当任务调用taskSafe( )时,从调用的那一刻起,该任务就被保护起来而不会被其它任务删除。如果任务1试图删除已经调用taskSafe( )的任务2,则任务1将被阻塞,直到任务2调用taskUnsafe( )。保护只能由任务自己实现,一个任务不能safe或unsafe另外一个任务。taskSafe( )和taskUnsafe( )支持嵌套模式。如果有嵌套发生,一个计数器将开始工作,每有一个taskSafe( )被调用,则计数器加1;调用1个taskUnsafe( ),则计数器减1。只有当计数器为0时,才能删除该任务。

有时为了执行效率等原因,任务的运行需要禁止基于优先级的抢占,这可以通过调用taskLock( )实现。如果任务1调用taskLock( )禁止了高优先级任务对它的抢占,当任务1被阻塞或被暂停,核心将调度下一个具有最高优先级的就绪任务运行。如果这时任务1又就绪且被调度运行,抢占又被禁止。但是,禁止基于优先级的抢占可以阻止任务切换,却并不会屏蔽中断。调用taskUnLock( )可以解除优先级抢占的禁止,通过调用taskLock( )和taskUnLock( )可以实现对临界资源的互斥访问。

4 任务调度中CPU的占用

如前所述,不同优先级的任务是通过抢占获得CPU使用权的,如果不选时间片轮转,相同优先级的任务之间也是抢占CPU的。任务就绪队列中正在运行的任务如果不主动放弃CPU,则其它同优先级的任务不会得到运行,这样就有可能看到几个同优先级的任务状态同为READY,但实际上只有一个任务在运行的现象。比如在一个任务中用taskSpawn()函数创建一个同优先级或低优先级的任务,如果原任务一直占用CPU,新任务就不会开始运行。调用函数taskDelay()可以使任务放弃CPU一定的时间,从而实现任务间时间上的同步;也可以放弃CPU零时间,将任务移至同优先级就绪队列的末尾,这样就可以实现多个同优先级的任务并发运行。另外,由于中断能够打断任务的运行,中断处理函数中执行的代码就要尽可能少地占用CPU,并且中断中不能有获取信号量的操作。一旦处于等待之中,所有的任务均得不到运行,用户可能会有CPU不响应的错觉。

5 堆栈越界

如前所述,每一个任务都有自己的堆栈,任务创建时进行初始化。每个堆栈的大小是固定,但是任务运行过程中并不对堆栈的使用进行限制。由于VxWorks不对内存访问作限制,栈顶超越了原定的值后出现越界,这样操作系统中该任务堆栈以外的内存区域就可能被改写,会造成难以预料的结果,甚至可能造成任务的上下文区域被改写而任务消失。造成越界的原因主要是在函数中定义了比较大的数组,以致进栈时越界。这样在编写程序时,就要求在堆栈许可的范围内定义数组。如果确实需要比较大的内存空间,可以使用操作系统的内存分配函数来获得内存。由于堆栈越界后有可能使任务的控制信息被破坏,使得对堆栈越界的检测比较困难,例如可以在栈底写入一串特殊字符,用另外一个任务或者中断服务程序经常来检查是否被改写来判断越界。

6 CPU异常

在VxWorks中,当任务的指令执行中出现了指令非法、地址寻址错误、总线错、除数为0等情况时,就会出现CPU异常。比较常见的情况是,指针地址非法或者数组下标越界就有可能存取有效地址空间以外的地址而造成CPU异常。VxWorks提供一个异常处理句柄(handler)和一个名为tExcTask的任务来处理异常。异常出现后任务成为挂起状态(suspend),并且不能转变为其它状态。在VxWorks中,有一个异常向量表来对应各种异常,外部中断也作为一种特殊的异常。VxWorks的做法是把多种异常的处理映射到同一个异常处理函数进行处理,并且VxWorks提供了向这个异常处理函数中钩挂用户的异常处理函数的接口excHookAdd(),也可以将某一个异常向量映射到指定的处理函数。
宋华伟,硕士研究生;彭建华,副教授:研究方向为嵌入式开发。
季新生:副教授,研究方向为移动通信系统。

关键字:VxWorks 引用地址:VxWorks任务编程中常见异常分析

上一篇:CoolRunner-II CPLD实现GPS系统
下一篇:SQLite在嵌入式系统Wince中的应用

推荐阅读最新更新时间:2024-03-30 21:51

VxWorks应用技巧两例
  VxWorks操作系统是一个应用比较多的实时多任务操作系统。它提供并支持多任务调度机制,用户可以将自己对事件的控制通过不同任务的协调而完成。各个任务之间通过全局变量、信号量、管道等方式进行信息交换。Wind ML是VxWorks上的一个二维图形用户界面,当多个任务都需要作画图工作时,可能出现当一个任务在正在作图时,被另一个作图任务打断,从而出现意想不到得情况。本文将介绍在VxWorks操作系统中,编写应用程序时的两个技巧。一个是内存变量保护;另一个是间的画图保护。 1 全局变量的保护   各个任务之间通过全局变量交换信息时,如果其中某一任务在引用同一个全局变量期间,该变量在另一任务中被重新赋值,那么就可能发生一些意想不到的
[应用]
VxWorks下基于看门狗的通用定时器设计
引言   VxWorks是目前应用最多的嵌入式实时操作系统之一,广泛应用于工业控制、医疗器械、通信、航空航天以及武器装备等领域。VxWorks是32位实时嵌入式操作系统,自20世纪80年代由风河公司推出以来,其良好的实时性、对多任务的支持、体积精简、可剪裁等优点得到众多公司、开发者及用户的喜爱。   在实时性要求高的应用系统中,定时器是经常被用到的重要器件。而对于VxWorks操作系统本身来说,并未提供一个通用、高效的定时器组件。文章所提出的共享看门狗定时机制就是针对这种情况实现的一种通用型定时器组件。   1 VxWorks定时的方法   1.1 使用taskDely函数   函数原型为:STATUS taskDela
[工业控制]
<font color='red'>VxWorks</font>下基于看门狗的通用定时器设计
嵌入式实时操作系统VxWorks入门
        VxWorks操作系统是美国WindRiver公司于1983年设计开发的一种嵌入式实时操作系统(RTOS),它以其良好的可靠性和卓越的实时性被广泛地应用在通信、军事、航空、航天等高精尖技术及实时性要求极高的领域中,如卫星通讯、军事演习、弹道制导、飞机导航等。在美国的 F-16、FA-18 战斗机、B-2隐形轰炸机和爱国者导弹上,甚至连1997年4月在火星表面登陆的火星探测器上也使用到了VxWorks。VxWorks原先对中国区禁止销售,自解禁以来,在我们的军事、通信、工业控制等领域得到了非常广泛的应用。         VxWorks的实时性体现在能于限定的时间内执行完所规定的功能,并能在限定的时间内对外部的异步事
[嵌入式]
实时操作系统VxWorks
VxWorks组成部分 VxWorks 操作系统包括了进程管理、存储管理、设备管理、文件系统管理、网络协议及系统应用等几个部分。VxWorks只占用了很小的存储空间,并可高度裁减,保证了系统能以较高的效率运行。 VxWorks由以下几个主要部分组成: 1.高性能的实时操作系统核心 wind VxWorks 的核心,被称作 wind,包括多任务调度(采用优先级抢占方式),任务间的同步和进程间通信机制以及中断处理,看门狗和内存管理机制。一个多任务环 境允许实时应用程序以一套独立任务的方式构筑,每个任务拥有独立的执行线程和 它自己的一套系统资源。进程间通信机制使得这些任务的行为同步、协调。 wind使用中断驱动和优先级的方式。它缩短
[嵌入式]
VxWorks下实现NAT/NAPT的方法
摘要:介绍NAT、NAPT的基本概念和工作原理;结合VxWorks的网络协议栈,描述一种利用VxWorks操作系统提供的钩子函数来开发实现NAT和NAPT的方法。 关键词:NAT NAPT 钩子函数 网络协议栈 截获 转换 校验和 引言 近年来,随着Internet的迅猛发展,连入Internet的主机数量成倍增长。由于最初设计Internet的时候并没有考虑到需要支持这么大的规模,因而Internet使用的Ipv4协议中IP地址的长度选择了32位,它可以使IP包的格式很好地对齐;但是,目前IP地址的短缺已经成为Internet面临的最大问题之一。 为了解决IP地址短缺的问题,人们提出了许多解决方案,nternet能够支持
[嵌入式]
基于STM32的嵌入式双目图像采集系统设计
1 引言 随着图像处理技术及嵌入式系统的发展,利用嵌入式系统进行图像处理,已使如视频监控、视频电话和视频会议等应用成为可能。嵌入式系统上进行图像采集则是实现这些应用的前提[1~2]。 双目立体视觉通常由两个摄像头从两个不同的角度,同时获取外界物体的两幅图像,或由单独一个摄像头在不同时间、不同位置获取外界物体的两幅图像,并基于视差的原理来获取外界物体的三维几何信息,复现外界物体的形状和位置。 目前已有很多方案实现在嵌入式平台上的图像采集。本文基于嵌入式的图像采集系统选择了意法半导体(ST)公司生产的STM32F103ZET6芯片为主控芯片,FIFO结构的AL422B芯片实现图像数据缓存,SD卡实现图像存储以及四线制电阻触摸屏实
[单片机]
基于STM32的嵌入式双目图像采集系统设计
基于VxWorks的多DSP系统的多任务程序设计
摘要:多DSP信号处理板广泛地运用于工业、军事、通信和医疗等许多方面。本文介绍一种基于VxWorks实时操作系统的ADSP21160的多DSP板设计,以及该板在数字式声纳的实时信号处理系统中的应用,并介绍在VxWorks实时操作系统下的软件算法仿真和实现。 关键词:多DSP阵列 声纳系统 VxWorks 近年来,计算机产品的应用领域越来越广,数字信号处理器的发展表现得尤为明显。DSP芯片制造商和DSP板开发商利用自身的优势不断开发出多DSP结构的产品来满足这种需求。通常的DSP设备是与嵌入式系统相结合,来实时地完成某一特定任务。随着信号采集速度和处理速度的要求越来越高,许多领域都需要进行多处理器运算,其中包括医学、图像处理、军事、工
[嵌入式]
VxWorks下实现NAT/NAPT的方法
摘要:介绍NAT、NAPT的基本概念和工作原理;结合VxWorks的网络协议栈,描述一种利用VxWorks操作系统提供的钩子函数来开发实现NAT和NAPT的方法。 关键词:NAT NAPT 钩子函数 网络协议栈 截获 转换 校验和 引言 近年来,随着Internet的迅猛发展,连入Internet的主机数量成倍增长。由于最初设计Internet的时候并没有考虑到需要支持这么大的规模,因而Internet使用的Ipv4协议中IP地址的长度选择了32位,它可以使IP包的格式很好地对齐;但是,目前IP地址的短缺已经成为Internet面临的最大问题之一。 为了解决IP地址短缺的问题,人们提出了许多解决方案,nternet能够支持到新一代I
[嵌入式]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
最新工业控制文章
换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved