VxWorks系统异常分析方法
学习vxworks中遇到的问题
学习vxworks中遇到的问题1预期目标用两台pc机建立起由网络进行通讯的vxworks开发环境,开发工具是tornado 2.2 for pentium,vxworks版本为5.5。
2硬件描述宿主机是一台装有windows xp和tornado 2.2的带有网络接口的笔记本电脑,ip设置为192.168.1.101,目标机是研华的610L型号工控机,后发现在vxworks系统下驱动工控机自带网卡有困难,于是购置了一块tp-link的pci网卡,装在工控机上,网卡芯片是realtek 8139d。
3建立开发环境的方案目标工控机上已经装有windows xp,文件系统是fat32,经试验得知工控机支持usb-zip启动,考虑到不对windows系统产生影响,决定使用u盘启动作为系统启动的方式。
用u盘启动bootrom后通过网络下载存放在笔记本电脑上的vxworks系统镜像,宿主机和目标机通过网络通讯,从而建立起x86构架下的vxworks开发环境。
4工作现状u盘启动盘通过ultraISO和tornado 2.2自带的一些工具制作成功,并能在工控机上把bootrom 启动起来到命令行,但是在加载vxworks镜像的时候不能成功。
5遇到的问题在bsp中添加rtl8139网卡驱动,添加驱动的过程如下(a)下载rtl8139驱动vxworks-8139(140),是适用于tornado 2.0的。
(b)将目录下的h和src两个文件夹复制到tornado 2.2下target 文件夹里,把sysRtl81x9End.c 复制到bsp文件夹下。
(c)运行命令行,在C:\Tornado2.2\target\src\drv\end\unsupported目录下运行make CPU=PENTIUM 成功,但有警告(环境变量已设置好),在C:\T ornado2.2\target\lib\objPENTIUMgnuvx目录下生成了rtl81x91.o。
VxWorks下PCI总线故障诊断方法
: D: > ^
CBET' ̄ / I- . 4
P R A M
一
和T D R Y分 别 表示 主 设 备 准 备好 和从 设 备 准 备 好 。 在 传 输 过程
){
中 , 有 ID 只 R Y和 T D 同 时 有 效 , 输 才 能 继 续 ; 则 插 入 等 R Y 传 否
关键 词 : CI P 总线 , x rs, 置 空 闻 V Wok 配
Ab ta t s rc
Th ap iat n f e pl i o Vx c o Wor s k OS n i Em b edd Sy t m i b n u ed ed se s eig s wi y Bu del. twhe h PCI n te Bu b e k wn。 e s r a do t Vx h - W ors k 0S an o sat up i n m a mod te fi en y o f l e e t wi man al c n t tr n or l e, e ci c f aut t c i h d on t h u Meho r t d emai r akThs ns vey we . i pa - p mail ito c a er ny nr du es m eh of alr dign i s he tod fi e u a oss c me o PCI f Bu u der W ors s n Vx k OS。arc ar p t ul de c ie t i as i s rb s he de an f w a nd W o k o h iiaia i o P bu on i r t n r c s n f lr agn ss d l ch r u erVx r s f rt e nt l t o t i z on f CI s c f gu ai p o es a d ai e di o i. o u Ke wo k : Bu 。 W o k ,oni rt pa e y r sPCI sVx r sc f a i s c gu on
VxWorks任务编程中常见异常分析
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,依此类推。
代码的编译过程中并不对要使用的函数和变量进行检查。
例如调用一个并不存在的函数编译并不报错,编译器认为此函数可能在操作系统内核中或者已经下载的目标文件中,但在目标文件下载时会找不到要调用的函数。
如果符号表中的符号出现了重名,譬如两次下载的目标文件中有函数重名,则要作散列处理,之后对该函数的调用是最后加入符号表的函数,而之前已经装载的模块则不会受到影响。
基于VxWorks跨平台异常处理模块的研究与实现
. 2 “ 堆栈分析” 3 ) 程序检 测这个异常对象 , 或者允许它的存在, 或者 由其 主 2 异常 处理过程 中的关键 是“ 堆栈 分析 ” , 即使 用堆栈 回溯 的
Ab s t r a c t: Ac c o r d i n g t o t h e V x W o r k s R T O S’ S p o o r p o r t a bi 1 i t y b e t w e e n t h e T e r r a c e s , t h i s p a p e r p r e s e n t e d a n e w
e x c e p t i o n h a n d l i n g h a d b e e n s t r e n g t h . A t l a s t , t h e i m p l e m e n t a t i o n o f e x c e p t i o n h a n d l i n g h a d b e e n i 1 l u s t r a t e d
支 持。 本 文 主 要 针 对 目前 V x W o r k s 异 常 机 制 可 移 植 性 差 的 问题 , 提 出 一 种 及 时 准 确 并 且 与 具 体 处理 器 类 型 无 关 的捕 捉 异 常 的 方
法。
动上报 。
4 )检测代码决定如何处理异 常。 5 )异常处理完毕, 恢复程序并继续执行 。
1 V x W o r k s下异常分析与处理
在V x W o r k s下如果使用默认 的异常 处理机 制, 处理结束后 : 产 生异常 的任务 将被悬挂 , 且该消息将被传 送到控制 台。 可 以看 出, 如果不对异常进行处理, 使用默认 的异常处理方法, 对于一个 系 统来 说往往是致命 的。 所 以我们必须对系统默认 的异常处理方 法进行修 改和完善 。 可 以将异常处理流程分为 以下 5 个 阶段 : 1 ) 一个软件错误发生 。 2 ) 错误 的原 因和性质被一个异常对象携带。
VxWorks多任务编程中的异常研究
任务,如果原任务一直 占用 C U, P 新任务就不会开始运行。另外,由于中断能够打断任
务的运行 ,中断处理 函数 中执行 的代 码就要尽可 能少地 占用 C U,并且 中断 中不能有 获 P 取信号量 的操 作 。 旦 处于 等待之 中,所有 的任 务均得不 到运行 ,用户可能会 有 C U 不 一 P 响应的错觉 。如前所述 ,每一 个任 务都 有 自己的堆栈 ,任 务创建 时进 行 初始化 。每 个堆 栈 的大小 是固定 , 是任 务运行过程 中并不 对堆栈 的使用进行 限制 。由于 V Wok 不对 但 x rs 内存访 问作 限制 ,栈顶 超越 了原定 的值 后 出现越界 ,这样操作 系统 中该任务 堆栈 以外 的 内存 区域就可 能被改写 ,会造 成难 以预 料的结 果 ,甚至可 能造 成任务 的上 下文 区域被 改
溢 出,非法结 构 ,总 线 出错 ,地 址 出错 等等。一般来说 ,这些异常 是 由于程 序 的逻辑错 误造成 的 ,下面介 绍常见 的异常 的情 况 。
首先, 在应用中可能会出现多个任务调用同一段代码的情况, 由于任务占用 C U是 P 串行的,不会出现代码资源使用冲突。但是 ,不同优先级的任务同时调用同一段代码 , 则可能出现低优先级任务执行某一函数时被执行该函数的高优先级任务打断的情况,如 果函数 中要改写 全局 变量而没有 使用互斥 ,就有可 能导 致错误 的存 取 。例如 在 中断 中调
l 6
维普资讯
科 技 论 文
载 时会找不到要 调 用的函数 。如果应 用程序 中使 用 了与操作 系统 内核 同名 的符号 ,则对 操作 系统某些 AP 函数的调 用将 会失败 。 I
再有 , V Wok 中,当一个任务被删除, 在 x rs 其它任务不会得到通知,而且由于任务 间的独立性,每一个任务可以无限制地删除其它任务。删除一个在临界 区执行的任务可 能 引起 意想不到 的后果 ,造成保 护资源 的信号量 不可 用 ,可 能导致资 源处于 破坏状态 , 也就导 致 了其他 要访 问该 资源 的所有任务无 法得到满 足 。不 同优先 级的任务 是通过抢 占 获得 C U 使用权 的 ,如 果不选 时间片轮转 ,相 同优先 级的任务 之 间也 是抢 占 C U的 。 P P
基于ARM7核处理器的VxWorks启动及异常处理
基于ARM7核处理器的VxWorks启动及异常处理朱静【摘要】介绍ARM7核处理器的基本组成,然后重点描述VxWorks的启动过程,最后,针对启动过程可能出现的异常,提出相应的应对策略.【期刊名称】《智能计算机与应用》【年(卷),期】2010(000)005【总页数】2页(P41-42)【关键词】VxWorks;ARM7核处理器;启动;异常处理【作者】朱静【作者单位】江苏省仪征工业学校,江苏,仪征,211400【正文语种】中文【中图分类】TP3911 ARM7核处理器的介绍ARM7TDMI是ARM7核处理器的一个子分支,是ARM家族通用的一款32位微处理器,主要为用户提供了高性能、低价格解决方案。
ARM7TDMI具有三级流水线的32位RISC处理器,处理器结构为冯·诺依曼Load/Store。
CPU具有两种指令集,即ARM和Thumb指令集。
ARM指令集是32位,可以利用CPU最大性能;而Thumb指令集则是16位指令集。
2 VxWorks启动过程2.1 CPU 上电启动CPU上电后,ARM7会从地址0x0取指令,一般设计会将FLASH的基地址映射为地址0,将启动代码写入FLASH的起始地址。
如果FLASH是NOR FLASH,那么CPU不需要内部代码支持,可以直接从FLASH总线取指令,如果FLASH是NAND FLASH,那么CPU需要内部代码支持。
上电后,利用内部RAM,CPU启动内部固化代码,初始化外部NAND FLASH,再从NAND FLASH取指令。
2.2 文件映像介绍在用VxWorks系统进行开发时,会生成两个文件,一个是BootRom文件,此文件类似Windows中的BIOS,是引导文件,完成内存初始化,内核初始化,基本硬件的初始化并最终引导VxWorks系统启动。
另外一个是VxWorks文件,此文件中包括VxWorks系统内核及上层应用程序。
2.2.1 BootRomBootROM image执行最少的系统初始化,用于启动装载VxWorks image。
漏洞分析VxWorks系统典型漏洞分析与影响范围统计
漏洞分析VxWorks系统典型漏洞分析与影响范围统计一、VxWorks系统概述VxWorks是美国风河(Wind River)公司于1983年设计开发的一种嵌入式实时操作系统(RTOS),是嵌入式开发环境的关键组成部分。
良好的持续发展能力、高性能的内核以及友好的用户开发环境,在嵌入式实时操作系统领域占据一席之地。
VxWorks支持几乎所有现代市场上的嵌入式CPU,包括x86系列、MIPS、PowerPC、Freescale ColdFire、Intel i960、SPARC、SH-4、ARM、StrongARM以及xScale CPU。
它以其良好的可靠性和卓越的实时性被广泛地应用在通信、军事、航空、航天等高精尖技术及实时性要求极高的领域中,如卫星通讯、军事演习、弹道制导、飞机导航等。
正因为VxWorks操作系统的开放性、模块化和可扩展性的系统结构特征以及能在多线程、多任务的系统环境中达到高实时要求的PLC 控制要求,在保证实时性的同时,实现多点位、复杂功能的PLC系统控制目标,因此被广泛用于物联网嵌入式设备及工业控制领域。
西门子、施耐德、罗克韦尔的多款PLC设备软件搭载在VxWorks系统上运行。
二、VxWorks漏洞统计根据威努特IVD工控漏洞库()的统计,当前VxWorks操作系统存在16个漏洞,其中有CVE编号的漏洞数量为13个。
虽然VxWorks操作系统的CVE漏洞数量控制的很好,但是由于其应用的广泛性,上述漏洞的影响范围依旧很大。
图1、威努特IVD工控漏洞库中VxWorks漏洞的统计三、VxWorks系统在中国的联网分布根据威努特ICS-Radar(https://)的统计,截止2017年12月13号,在中国的互联网上共发现8600个运行VxWorks系统的设备,其中开放wdbrpc这种高危服务的有3561个,占41.4%。
ICS-Radar对wdbrpc v1和wdbrpc v2协议均支持探测,通过探测发现中国的VxWorks系统主要集中在VxWorks 5.5.x和VxWorks 5.4.x版本上,VxWorks 6.x版本系统占比较小,详细统计见图2。
VxWorks系统异常分析方法
VxWorks系统异常分析方法1、任务异常的一般表现:i)指令异常:系统打印program异常或instruction access异常。
ii) 访问非法地址异常,串口打印data access异常。
iii)中断处理中产生的异常。
data accessException current instruction address:0x00187d4cMachine Status Register:0x00009030Data Access Register: 0x8003435cCondition Register:0x48000080Data storage interrupt Register:0x0000000bTask:0xc844f0 "XXX"2、可能的原因:i)堆栈写越界,主要是数组写越界,导致前面声明的变量(因为堆栈是从下往上增长的)或者函数的参数或者函数返回的地址被改写为无效值。
ii) 堆栈溢出,堆栈声明过小,而函数又声明了大数组,超出堆栈的容量。
iii) 内存改写,这是最通常出现的原因。
包括,指针没有初始化,导致访问随机地址;访问空指针;内存操作范围越界,例如在使用memcpy/memset等函数使用的长度超过所分配,导致改写了其他的指针。
因此在定位异常问题过程中,可以通过内存管理先查看一下先前是否有内存写越界的记录,但是内存写越界只有在释放该内存区时才能检查到,如果该内存没有被释放,则即使写越界也是不知道的。
iv)系统调用不当,在中断回调中,使用printf,semTake之类可能引起阻塞的操作;printf等使用不当导致内存改写,这些函数在中断回调函数中是严格禁止的。
v) 增量编译引起的问题,Tornado和workbench增量编译有时会出现问题,导致古怪的异常,重新全量编译后,可能个会解决问题。
vi)多任务抢占引起的问题,当多个任务共同访问一个或者多个变量时,如果互斥不当,可能会产生同步或互斥的问题,比较典型的是:任务A和B都使用一个变量指针P;而A和B的优先级不同(即存在任务抢占),则他们在释放或者修改这个变量指针的时候,可能会出现随机的异常访问问题。
基于ARM7核处理器的VxWorks启动及异常处理
2 V Wok 启 动 过程 x rs
2 1 C U上 电启 动 . P
U bo 未链接 内核代码 , — ot 设计更 自由, 没有 任务管理机 制 , 序类似 于线性管 理 , 以配置 中断 , 收用户数据 或 程 可 接 者输 出显示 。U bo 是开源代 码,对于代码 的理解 较有帮 — ot 助 , 码编写量较大 。 代
Zhu J n ig
Ab t a t T e p p r it d c st e b s o o e t o rc so M7 hs te i fc s s o h tr u rc s o x s r c : h a e n o u e h a i c mp n ns f P o es rAR .T i h s o u e n t e s t p po e s fV - r c s a—
c s o o tn f Vx r . e s f b o i g o Wo ks
Ke r s V Wok ;P oe sr A M7 o t g x e t n H n l g y wo d : x r s rc so R ;B oi ;E c p o a di n i n
21 耳 1 0 0 0月
电 脑 学 习
第5 期
基 于 A M7核处理器 的 V Wok 启 动及异 常处理 R x rs
朱 静
摘 要 :介绍A M 桉处理器的基本组成. R7 然后重点描述V Wo s x r 的启动过程. k 最后。 针对启动过程可 器 的介 绍
A M7 D I A M7核 处 理 器 的一 个 子 分 支 , A M R TM 是 R 是 R
需 要解 压 到 R M 中才 能 执 行 , 压 过 程 也 需 要 时 间 。 A 解
VxWorks系统下软件异常运行的故障定位方法
Science and Technology &Innovation ┃科技与创新2023年第19期·89·文章编号:2095-6835(2023)19-0089-03VxWorks 系统下软件异常运行的故障定位方法赵昶宇(天津津航计算技术研究所,天津300308)摘要:在VxWorks 软件系统下,受限于目前的测试手段和技术,在应用程序测试阶段容易忽略一些隐蔽的程序缺陷或者错误,导致应用程序在运行过程中出现软件死机和系统复位的现象。
对于软件开发人员而言,软件运行过程中死机和系统复位的现象不一致,随机出现且很难复现,给程序缺陷和错误的定位造成了很大的困难。
总结了VxWorks 操作系统中软件死机和系统复位等异常的故障定位方法,能够帮助软件开发人员和测试人员在最短的时间内定位并解决故障,保证VxWorks 软件系统稳定运行。
关键词:VxWorks 系统;软件死机;系统复位;故障定位中图分类号:TP311文献标志码:ADOI :10.15913/ki.kjycx.2023.19.027在VxWorks 系统下开发实时软件的过程中,由于软件开发人员的经验或技术能力不足,导致开发出的软件在后期运行的过程中偶尔出现软件死机或者系统复位的现象。
这些VxWorks 系统下的异常现象往往是内存泄漏、堆栈溢出或非法指针操作等原因造成的系统崩溃。
由于出现这些故障的现象不一,而且往往很难故障复现,所以故障定位异常困难。
通常情况下采用在线调试(通过网络或是串口)的手段对VxWorks 系统下出现的软件故障进行跟踪调试。
但是一旦VxWorks 系统出现死机或者复位时,就无法进行在线调试。
现有的解决VxWorks 系统下死机或复位的方法有基于堆栈异常定位故障、任务死循环定位、堆栈回溯分析法、看门狗电路等。
这些方法大多只是针对某一种故障现象提出定位方法,或者只是能够检测软件出现故障,不能定位故障,对于VxWorks 系统下死机和复位故障定位提供的帮助有限。
基于VxWorks的异常问题分析及调试方法的研究
基于VxWorks的异常问题分析及调试方法的研究
房同忠;杨卉卉;张华年;王彦辉;张志强
【期刊名称】《工业控制计算机》
【年(卷),期】2012(25)6
【摘要】在基于嵌入式操作系统VxWorks的软件开发过程中,由于人员水平和经验的限制,开发的软件中如果使用了非法指令或堆栈溢出、程序死循环等原因,会造成系统或任务异常,甚至装置死机或重启.根据在实际开发过程中遇到的问题,总结了异常的原因并通过示例给出了分析定位异常问题的方法.
【总页数】2页(P23-24)
【作者】房同忠;杨卉卉;张华年;王彦辉;张志强
【作者单位】北京四方继保自动化股份有限公司,北京100085;北京四方继保自动化股份有限公司,北京100085;北京四方继保自动化股份有限公司,北京100085;北京四方继保自动化股份有限公司,北京100085;北京四方继保自动化股份有限公司,北京100085
【正文语种】中文
【相关文献】
1.基于vxWorks的嵌入式软件远程调试 [J], 鲁爱国;万曦
2.基于日立系统的东汽机组PLU设计原理分析及调试方法 [J], 刘成柱
3.基于Telnet协议的VxWorks调试监测软件 [J], 练学辉;杜清;付林;朱润;王善民
4.基于脱硝SCR喷氨优化调整试验过程中异常问题分析及处理 [J], 黄本宏
5.一种基于VxWorks的串口调试系统的设计与实现 [J], 吴迪;代中华
因版权原因,仅展示原文概要,查看原文内容请购买。
实时操作系统Vxworks下的异常处理
实时操作系统Vxworks下的异常处理
李玉深;周祖洋;万杨
【期刊名称】《应用科技》
【年(卷),期】2005(032)005
【摘要】系统地分析了异常的产生、触发、截获、处理各个过程.着先讨论了在嵌入式操作系统Vxworks下的异常机制和默认的异常处理方式,然后详细地分析了4种常见异常处理方式,阐述了它们各自的优缺点并且给出实例.对于在国内应用非常广泛的Vxworks嵌入式实时操作系统的开发异常处理具有很重要的参考价值.【总页数】3页(P30-32)
【作者】李玉深;周祖洋;万杨
【作者单位】哈尔滨工程大学,自动化学院,黑龙江,哈尔滨,150001;哈尔滨工程大学,自动化学院,黑龙江,哈尔滨,150001;哈尔滨工程大学,自动化学院,黑龙江,哈尔滨,150001
【正文语种】中文
【中图分类】TP306.3
【相关文献】
1.嵌入式VxWorks实时操作系统下串口通信的应用 [J], 王江泉;李德峰
2.嵌入式实时操作系统VxWorks下BSP分析及VxWorks裁减 [J], 褚哲;孟小锁
3.实时操作系统VxWorks下多串口通讯设计 [J], 王立新;马胜贤
4.一种基于嵌入式实时操作系统Vxworks下的数据压缩技术 [J], 王江泉;张小研
5.实时操作系统VxWorks下驱动程序的设计 [J], 周雪峰
因版权原因,仅展示原文概要,查看原文内容请购买。
VxWorks系统异常重启问题排查方法研究
VxWorks系统异常重启问题排查方法研究
季志均;许明旺;宋志坚
【期刊名称】《电脑编程技巧与维护》
【年(卷),期】2024()5
【摘要】在对可靠性有要求的任务中,嵌入式设备大多采用嵌入式实时系统,例如,VxWorks操作系统。
VxWorks虽然在软件运行可靠性上表现出色,但还是避免不了系统异常重启的问题。
结合信号系统运维过程中积累的大量案例,从应用层级追溯、任务异常追溯、中断异常追溯以及其他关注点等方面对排查方法进行总结,发现这些排查方法的运用对提高信号系统的运维水平有很大帮助。
【总页数】3页(P157-159)
【作者】季志均;许明旺;宋志坚
【作者单位】卡斯柯信号有限公司
【正文语种】中文
【中图分类】TP3
【相关文献】
1.实时操作系统Vxworks下的异常处理
2.VxWorks应用开发中的异常分析及处理方法
3.基于VxWorks的异常问题分析及调试方法的研究
4.VxWorks系统下软件异常运行的故障定位方法
5.海上平台闭排泵运行异常问题排查与解决研究
因版权原因,仅展示原文概要,查看原文内容请购买。
基于VxWorks的异常处理的研究和实现
基于VxWorks的异常处理的研究和实现
王泽民;芦东昕;谢鑫;徐立峰
【期刊名称】《计算机工程》
【年(卷),期】2005(031)013
【摘要】阐述了嵌入式软件系统中异常处理的必要性,然后基于嵌入式实时操作系统VxWorks,介绍了一种与具体处理器类型无关的异常处理方法,并且结合一种ARM处理器,详细阐述了该异常处理的现场保存、现场分析、异常恢复策略的实现.【总页数】3页(P90-92)
【作者】王泽民;芦东昕;谢鑫;徐立峰
【作者单位】中兴通信股份有限公司成都研究所,成都,610041;中兴通信股份有限公司成都研究所,成都,610041;中兴通信股份有限公司成都研究所,成都,610041;中兴通信股份有限公司成都研究所,成都,610041
【正文语种】中文
【中图分类】TP316.89
【相关文献】
1.基于VxWorks的网络多地址通信实现方法研究 [J], 李文涛;
2.基于VxWorks跨平台异常处理模块的研究与实现 [J], 郭继宁;于恩祥
3.基于VxWorks时钟特性的无人机飞行数据抗干扰方法研究及实现 [J], 李博;杨俊鹏;曹春艳;张晨
4.基于VxWorks的网络多地址通信实现方法研究 [J], 李文涛
5.基于SPARC的VxWorks异常处理研究 [J], 黄江泉;陈晓敏;赵勋峰
因版权原因,仅展示原文概要,查看原文内容请购买。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1、任务异常的一般表现:
i)指令异常:系统打印program异常或instruction access异常。
ii) 访问非法地址异常,串口打印data access异常。
iii)中断处理中产生的异常。
data access
Exception current instruction address:0x00187d4c
Machine Status Register:0x00009030
Data Access Register: 0x8003435c
Condition Register:0x48000080
Data storage interrupt Register:0x0000000b
Task:0xc844f0 "XXX"
2、可能的原因:
i)堆栈写越界,主要是数组写越界,导致前面声明的变量(因为堆栈是从下往上增长的)或者函数的参数或者函数返回的地址被改写为无效值。
ii) 堆栈溢出,堆栈声明过小,而函数又声明了大数组,超出堆栈的容量。
iii) 内存改写,这是最通常出现的原因。
包括,指针没有初始化,导致访问随机地址;访问空指针;内存操作范围越界,例如在使用memcpy/memset等函数使用的长度超过所分配,导致改写了其他的指针。
因此在定位异常问题过程中,可以通过内存管理先查看一下先前是否有内存写越界的记录,但是内存写越界只有在释放该内存区时才能检查到,如果该内存没有被释放,则即使写越界也是不知道的。
iv)系统调用不当,在中断回调中,使用printf,semTake之类可能引起阻塞的操作;printf等使用不当导致内存改写,这些函数在中断回调函数中是严格禁止的。
v) 增量编译引起的问题,Tornado和workbench增量编译有时会出现问题,导致古怪的异常,重新全量编译后,可能个会解决问题。
vi)多任务抢占引起的问题,当多个任务共同访问一个或者多个变量时,如果互斥不当,可能会产生同步或互斥的问题,比较典型的是:任务A和B都使用一个变量指针P;而A和B的优先级不同(即存在任务抢占),则他们在释放或者修改这个变量指针的时候,可能会出现随机的异常访问问题。
3、处理策略:
i) 如果有理由怀疑是增量编译引起的,则首先尝试全量编译一下工程。
ii) 分析异常出现时的调用栈信息,以data access异常为例:
如果在系统出现异常时接了串口,则可以直接看到类似以下列信息;如果出现异常时没有接串口,则定位问题时可首先接上串口或者Tornado,然后使用“ti”命令也可以看到如下的异常信息:
data access
Exception current instruction address:0x00187d4c
通过这个地址通常可以通过符号表知道异常出现时系统正在运行哪个函数。
使用 l 0x00187d4c和lkaddr 0x00187d4c
Machine Status Register:0x00009030
Data Access Register: 0x8003435c
Condition Register:0x48000080
Data storage interrupt Register:0x0000000b
Task:0xc844f0 "XXX"
通过这个参数,可以知道是哪个任务出现的异常。
4、具体定位提示:
i)可以使用“checkStack”命令看是否产生了堆栈溢出,如果是XXX任务的堆栈溢出,则在checkStack的打印中,XXX的堆栈状态会显示成“overflow”。
ii)可以使用tt命令查看任务调用栈,通过分析调用栈的每一层函数,尝试找原因,参照上面的可能原因部分。
iii)分析函数调用序列中所访问的全局变量(尤其是指针和数组),看是否存在任务抢占而导致全局指针被修改或者访问无效指针的问题。
5、重现问题:
如果通过上述步骤无法直接找到原因,那么恭喜你,你已经遇到恐怖的随机内存改写问题,这类问题通常难以重现,而且通过分析单个任务的运行轨迹很难找到原因,这类问题很可能的情况是:虽然任务A在运行函数FuncA时产生的异常,但真正的内存改写代码很可能是在任务X或函数FuncX 中,解决这类问题的关键是如何重现问题,一旦问题可以比较容易的重现,那么可以说问题已经解决了一半。
重现问题的办法:
i) 回忆先前的操作步骤,一步一步地重做一遍,看问题是否可以重现。
ii)如果是任务A产生的异常,则人工制造一些条件,使任务A不断的运行,以重现问题,通过脚本或者打桩,不断地发一些消息触发任务A的运行,这是最常用的方法,如果A是周期运行,则缩短周期,加快运行。
iii)逆向分析,通过分析代码,可能怀疑一些代码有问题,这时候,可以针对性的创造各种人为条件来重现问题,例如怀疑某个定时器可能存在重复进入和重复删除,则可以人为修改代码流程,使之进入定时器重复进入/重复删除流程,或者用脚本不断地创建和删除定时器,以加快问题出现的频率。
iv)手动调整任务优先级,分析任务抢占相关的问题,在基本确定任务异常可能和任务抢占相关的情况下,可以尝试以各种组合,将几个相关的任务优先级调整成相同的优先级(这样,这几个任务就不会再产生任务抢占了)。
在此基础上尝试重现问题;如果在优先级相同的情况下异常不再出现,则说明这几个任务之间所共享的变量存在互斥问题;否则说明该问题很可能和互斥无关,或者根据需要把某些优先级调高,某些调低,以重现任务抢占的问题。
6、解决问题:
i)如果找到问题所在,则直接修改问题。
ii)如果通过多日的重现和定位,都无法找到真正的原因,那么没有办法的办法就是:直接修改代码,把怀疑有问题的地方全部改掉,然后再测试看问题是否解决。
我曾经遇到一个任务异常的问题,如果跑1个测试脚本,则平均跑7-8小时可以出现一次,跑7个测试脚本,则平均跑半小时就会出现一次,定位了一个多月找不到真正原因,花了很多时间用来想办法重现异常,写脚本。
后来没有办法只好把怀疑的地方全部改掉,之后跑7个脚本共48小时没有出现异常,最后解决问题,之后反过来推导root cause,最后找到原因。