版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、在嵌入式软件开发过程中,一般来说,花在测试和花在编码的时间比为3:1(实际上可能更多)。这个比例随着你的编程和测试水平的提高而不断下降,但不论怎样, 领测国际 认为软件测试对一般人来讲很重要。很多年前,一位开发人员为了在对嵌入式有更深层次的理解,向oracle 询问了这样的一个问题:我怎么才能知道并懂得我的系统到底在干些什么呢?oracle 面对这个问题有些吃惊,因为在当时没有人这么问过,而同时代的嵌入式开发人员问的最多的大都围绕“我怎么才能使程序跑的更快”、“什么编译器最好”等肤浅的问题。所以,面对这个不同寻常却异乎成熟的问题,oracle 感到欣喜并认真回复了他:你的问题很有深度很成熟,因
2、为只有不断地去深入理解才有可能不断地提高水平。并且oracle 为了鼓励这位执着的程序员,把10 条关于嵌入式软件开发测试的秘诀告诉了他。下面我们一起来看看。这十条秘诀在业界广为流传,使很多人受益。本文围绕这十条秘诀展开论述。1.懂得使用工具通常嵌入式系统对可靠性的要求比较高。嵌入式系统安全性的失效可能会导致灾难性的后果,即使是非安全性系统,由于大批量生产也会导致严重的经济损失。这就要求对嵌入式系统,包括嵌入式软件进行严格的测试、确认和验证。随着越来越多的领域使用软件和微处理器控制各种嵌入式设备,对日益复杂的嵌入式软件进行快速有效的测试愈加显得重要。就像修车需要工具一样,好的程序员应该能够熟练
3、运用各种软件工具。不同的工具,有不同的使用范围,有不同的功能。使用这些工具,你可以看到你的系统在干些什么,它又占用什么资源,它到底和哪些外界的东西打交道。 让你郁闷好几天的问题可能通过某个工具就能轻松搞定,可惜你就是不知道。那么为什么那么多的人总是在折腾个半死之后才想到要用测试工具呢?原因很多,主要有两个。 一个是害怕,另一个是惰性。 害怕是因为加入测试工具或测试模块到代码需要技巧同时有可能引入新的错误,所以他们总喜欢寄希望于通过不断地修改重编译代码来消除bug ,结果却无济于事。 懒惰是因为他们习惯了使用printf之类的简单测试手段。下面来介绍一些嵌入式常用的测试工具。源码级调试器 sou
4、rce-leveldebugger这种调试器一般提供单步或多步调试、断点设置、内存检测、变量查看等功能,是嵌入式调试最根本有效的调试方法。比如vxworkstornadoii提供的 gdb 就属于这一种。简单实用的打印显示工具printfprintf或其它类似的打印显示工具估计是最灵活最简单的调试工具。打印代码执行过程中的各种变量可以让你知道代码执行的情况。但是,printf对正常的代码执行干扰比较大(一般 printf占用 cpu 比较长的时间),需要慎重使用,最好设置打印开关来控制打印。ice 或 jtag 调试器 in- circuitemulatorice是用来仿真 cpu 核心的设备
5、,它可以在不干扰运算器的正常运行情况下,实时的检测cpu 的内部工作情况。像桌面调试软件所提供的:复杂的条件断点、先进的实时跟踪、 性能分析和端口分析这些功能,它也都能提供。 ice一般都有一个比较特殊的cpu,称为外合(bond-out)cpu.这是一种被打开了封装的cpu,并且通过特殊的连接, 可以访问到 cpu的内部信号,而这些信号,在cpu 被封装时,是没法“看到”的。当和工作站上强大的调试软件联合使用时, ice 就能提供你所能找到的最全面的调试功能。但ice 同样有一些缺点:昂贵;不能全速工作;同样,并不是所有的cpu 都可以作为外合cpu 的,从另一个角度说,这些外合cpu 也不
6、大可能及时的被新出的cpu 所更换。jtag(jointtestactiongroup)虽然它最初开发出来是为了监测 ic 和电路连接,但是这种串行接口扩展了用途,包括对调试的支持。rom 监视器 rommonitorrom监控器是一小程序,驻留在嵌入系统rom 中,通过串行的或网络的连接和运行在工作站上的调试软件通信。这是一种便宜的方式,当然也是最低端的技术。它除了要求一个通信端口和少量的内存空间外,不需要其它任何专门的硬件。并提供了如下功能: 下载代码、运行控制、 断点、单步步进、 以及观察、 修改寄存器和内存。 因为 rom 监控器是操作软件的一部分,只有当你的应用程序运行时,它才会工作
7、。如果你想检查cpu 和应用程序的状态,你就必须停下应用程序,再次进入rom 监控器。data 监视器 datamonitor这种监视器在不停止cpu 运行的情况下不仅可以显示指定变量内容,还可以收集并以图形形式显示各个变量的变化过程。os 监视器 operatingsystemmonitor操作系统监视器可以显示诸如任务切换、信号量收发、中断等事件。一方面,这些监视器能够为你呈现事件之间的关系和时间联系;另一方面,还可以提供对信号量优先级反转、死锁和中断延时等问题的诊断。性能分析工具 profiler 可以用来测试 cpu 到底耗在那里。 profiler工具可以让你知道系统的瓶颈在那里、
8、cpu 的使用率以及需要优化的地方。内存测试工具 memoryteseter可以找到内存使用的问题所在,比如内存泄露、 内存碎片、 内存崩溃等问题。如果发现系统出现一些不可预知的或间歇性的问题,就应该使用内存测试工具测测看。运行跟踪器 executiontracer可以显示 cpu 执行了哪些函数、谁在调用、参数是什么、何时调用等情况。这种工具主要用于测试代码逻辑,可以在大量的事件中发现异常的那些。覆盖工具 coveragetester主要显示 cpu 具体执行了那些代码,并让你知道那些代码分支没有被执行到。这样有助于提高代码质量并消除无用代码。gui 测试工具 guitester 很多嵌入式
9、应用带有某种形式的图形用户界面进行交互,有些系统性能测试是根据用户输入响应时间进行的。gui 测试工具可以作为脚本工具有开发环境中运行测试用例,其功能包括对操作的记录和回放、抓取屏幕显示供以后分析和比较、设置和管理测试过程(rational公司的 robot和 mercury的 loadrunner工具是杰出的代表)。很多嵌入式设备没有gui,但常常可以对嵌入式设备进行插装来运行gui 测试脚本,虽然这种方式可能要求对被测代码进行更改,但是节省了功能测试和回归测试的时间。自制工具 home-madetester在嵌入式应用中,有时候为了特定的目的,需要自行编写一些工具来达到某种测试目的。 本人
10、曾经编写的视频流录显工具在测试视频会议数据流向和变化上帮了大忙,帮公司找到了几个隐藏很深的bug 。2.尽早发现内存问题内存问题危害很大,不容易排查,主要有三种类型:内存泄露、内存碎片和内存崩溃。对于内存问题态度必须要明确,那就是早发现早“治疗”。在软件设计中,内存泄露的“名气”最大,主要由于不断分配的内存无法及时地被释放,久而久之,系统的内存耗尽。即使细心的编程老手有时后也会遭遇内存泄露问题。有测试过内存泄露的朋友估计都有深刻地体验,那就是内存泄露问题一般隐藏很深,很难通过代码阅读来发现。有些内存泄露甚至可能出现在库当中。有可能这本身是库中的bug ,也有可能是因为程序员没有正确理解它们的接
11、口说明文档造成错用。在很多时候,大多数的内存泄露问题无法探测,但可能表现为随机的故障。程序员们往往会把这种现象怪罪于硬件问题。如果用户对系统稳定性不是很高,那么重启系统问题也不大;但,如果用户对系统稳定很高,那么这种故障就有可能使用户对产品失去信心,同时也意味着你的项目是个失败的项目。由于内存泄露危害巨大,现在已经有许多工具来解决这个问题。这些工具通过查找没有引用或重复使用的代码块、垃圾内存收集、库跟踪等技术来发现内存泄露的问题。每个工具都有利有弊,不过总的来说,用要比不用好。总之,负责的开发人员应该去测试内存泄露的问题,做到防患于未然。内存碎片比内存泄露隐藏还要深。随着内存的不断分配并释放,
12、大块内存不断分解为小块内存,从而形成碎片,久而久之,当需要申请大块内存是,有可能就会失败。如果系统内存够大,那么坚持的时间会长一些,但最终还是逃不出分配失败的厄运。在使用动态分配的系统中,内存碎片经常发生。目前,解决这个问题最效的方法就是使用工具通过显示系统中内存的使用情况来发现谁是导致内存碎片的罪魁祸首,然后改进相应的部分。由于动态内存管理的种种问题,在嵌入式应用中,很多公司干脆就禁用malloc/free的以绝后患。内存崩溃是内存使用最严重的结果,主要原因有数组访问越界、写已经释放的内存、指针计算错误、访问堆栈地址越界等等。这种内存崩溃造成系统故障是随机的,而且很难查找,目前提供用于排查的
13、工具也很少。总之,如果要使用内存管理单元的话,必须要小心, 并严格遵守它们的使用规则,比如谁分配谁释放。3.深入理解代码优化讲到系统稳定性,人们更多地会想到实时性和速度,因为代码效率对嵌入式系统来说太重要了。知道怎么优化代码是每个嵌入式软件开发人员必须具备的技能。就像女孩子减肥一样, 起码知道她哪个地方最需要减, 才能去购买减肥药或器材来减掉它。可见,代码优化的前提是找到真正需要优化的地方,然后对症下药,优化相应部分的代码。前面提到的profile (性能分析工具,一些功能齐全ide 都提供这种内置的工具)能够记录各种情况比如各个任务的cpu 占用率、各个任务的优先级是否分配妥当、某个数据被拷
14、贝了多少次、访问磁盘多少次、是否调用了网络收发的程序、测试代码是否已经关闭等等。但是,profile工具在分析实时系统性能方面还是有不够的地方。一方面,人们使用profile工具往往是在系统出现问题即cpu 耗尽之后,而profile工具本身对 cpu 占用较大,所以profile对这种情况很可能不起作用。根据heisenberg效应,任何测试手段或多或少都会改变系统运行,这个对profiler同样适用!总之,提高运行效率的前提是你必须要知道cpu 到底干了些什么干的怎么样。4.不要让自己大海捞针大海捞针只是对调试的一种生动比喻。经常听到组里有人对自己正在调试的代码说shit !可以理解,因为
15、代码不是他写的, 他有足够的理由去shitbug百出的代码, 只要他自己不要写出这种代码,否则有一天同组的其它人可能同样会shit 他写的代码。为何会有大海捞针呢?肯定是有人把针掉到海里咯;那针为何会掉在海里呢?肯定是有人不小心或草率呗。所以当你在抱怨针那么难找的时候,你是否想过是你自己草率地丢掉的。同样,当你调试个半死的时候,你是否想过你要好好反省一下当初为了寻求捷径可能没有严格地遵守好的编码设计规范、没有检测一些假设条件或算法的正确性、没有将一些可能存在问题的代码打上记号呢?关于如何写高质量请参考林锐的高质量c+/c编程指南或关于 c 的 0 x8 本“经书。如果你确实已经把针掉在海里是,
16、为了防止在找到之前刺到自己,你必须要做一些防范工作,比如戴上安全手套。同样,为了尽能地暴露和捕捉问题根源,我们可以设计比较全面的错误跟踪代码。怎么来做呢?尽可能对每个函数调用失败作出处理,尽可能检测每个参数输入输出的有效性,包括指针以及检测是否过多或过少地调用某个过程。错误跟踪能够让你知道你大概把针掉在哪个位置。5.重现并隔离问题如果你不是把针掉在大海了,而是掉在草堆里,那要好办些。因为至少我们可以把草堆分成很多块,一块一块的找。对于模块独立的大型项目,使用隔离方法往往是对付那些隐藏极深bug 的最后方法。如果问题的出现是间歇性的,我们有必要设法去重现它并记录使其重现的整个过程以备在下一次可以
17、利用这些条件去重现问题。如果你确信可以使用记录的那些条件去重现问题,那么我们就可以着手去隔离问题。 怎么隔离呢?我们可以用#ifdef把一些可能和问题无关的代码关闭,把系统最小化到仍能够重现问题的地步。如果还是无法定位问题所在,那么有必要打开“工具箱”了。可以试着用ice 或数据监视器去查看某个可疑变量的变化;可以使用跟踪工具获得函数调用的情况包括参数的传递;检查内存是否崩溃以及堆栈溢出的问题。6.以退为进猎人为了不使自己在森林里迷路,他常常会在树木上流下一些标记,以备自己将来有一天迷路时可以根据这些标记找到出路。对过去代码的修改进行跟踪记录对将来出现问题之后的调试很有帮助。假如有一天,你最近
18、一次修改的程序跑了很久之后忽然死掉了,那么你这时的第一反映就是我到底改动了些什么呢,因为上次修改之前是好的。那么如何检测这次相对于上次的修改呢?没错,代码控制系统scs或称版本控制系统vcs(concurrentversioncontrol,cvs 是 vcs 的演化版本)。将上个版本 checkin下来后和当前测试版本比较。比较的工具可以是scs/vcs/cvs 自带的 diff 工具或其它功能更强的比较工具,比如beyondcompare和 examdiff. 通过比较,记录所有改动的代码,分析所有可能导致问题的可疑代码。7.确定测试的完整性你怎么知道你的测试有多全面呢?覆盖测试(cove
19、ragetesting)可以回答这个问题。覆盖测试工具可以告诉你 cpu 到底执行了那些代码。好的覆盖工具通常可以告诉你大概20% 到 40% 代码没有问题,而其余的可能存在bug. 覆盖工具有不同的测试级别,用户可以根据自己的需要选择某个级别。即使你很确信你的单元测试已经很全面并且没有deadcode,覆盖工具还是可以为你指出一些潜在的问题,看下面的代码: if (i=0& (almostalwayszero=0|(last=i ) ) ) 如果 almostalwayszero为非,那么 last=i赋值语句就被跳过, 这可能不是你所期望的。这种问题通过覆盖工具的条件测试功能可以轻松的被发现。总之,覆盖测试对于提高代码质量很有帮助。8.提高代码质量意味着节省时间有研究表明软件开发的时间超过80% 被用在下面几个方面:调试自己的代码(单元测
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年典当行门楼装修及维护合同版B版
- 2024年厂商价格保密协议范本版B版
- 2024年土地使用权转让合同(住宅用地)
- 2024年ic产品销售协议条款范本版B版
- 2024场场地租赁保证金合同
- 2024商业空间装修协议条款示例一
- 2024年度事业单位聘用协议模板版B版
- 2024Q3中国移动互联网流量季度报告
- 2024年专业建筑装修协议模板
- 2024年度企业网络安全评估与整改合同
- JTG-QB-003-2003公路桥涵标准图钢筋混凝土盖板涵
- 叙事团体辅导方案
- 部队体能训练计划制定方案
- 园艺植物组织培养-形考作业3-国开-参考资料
- 2024年中国绿发投资集团限公司夏季招聘高校毕业生117名公开引进高层次人才和急需紧缺人才笔试参考题库(共500题)答案详解版
- 荷花淀公开课省公开课一等奖全国示范课微课金奖课件
- 商用储能电站项目可行性研究报告
- 2024年社区工作者考试必考1000题及完整答案
- 小区绿地设计说明
- 《新编秘书实务》教学大纲
- 山东省烟台市福山区(五四制)2023-2024学年九年级上学期期末考试数学试题
评论
0/150
提交评论