1、嵌入式软件的实时在线测试,哈尔滨工业大学深圳研究院北京旋极信息技术有限公司 深圳旋极历通科技有限公司肖 敦 鹤,嵌入式软件测试的必要性与测试难度 嵌入式系统、嵌入式系统特点、嵌入式软件特点 嵌入式软件测试与测试方法 嵌入式软件在线测试的方法 1: Coverage analysis 2: Performance analysis 3: Logic trigger and trace analysis 4: Memory analysis 5: RTOS analysis 嵌入式软件在线测试和分析工具 1: TRACE32 - ICE 2: TRACE32 - FIRE 3: TRACE32 -
2、 ICD,议 程,系统处理能力不可置疑,为什么效率如此低,问题在哪里? 数据采集系统的采样的数据与现场相差甚远,原因何在? 系统运行中,随机性复位或宕机,硬件、软件工程师百思不得其解? 系统软件莫名奇妙跑飞,何处使然 ? 我如何捉住寄生在系统中隐藏BUG ?无计可施!,我咋办哪?,?问题的提出 ? 真实世界中嵌入式系统常见故障,真实世界中嵌入式软件故障导致的结果,结果: 金融在线事务处理系统瘫痪 电话交换网络瘫痪 电话系统崩溃,丢失了五千万次呼叫 电脑控制机场行李运送系统出现故障,行李延迟交付或乱成一团。 更多的电路板,更多的软件,更加复杂!,软件质量低劣所付出的代价: 如果关键系统出现故障?
3、,商务飞机坠毁 反导弹防卫系统无法工作 核反应堆发生核泄露 运送卫星的火箭在空中爆炸 导弹追踪卫星报告了错误的方位 ,我们早已认识到软件测试重要性 但对于嵌入式软件测试新的困难又出现了!,软件的测试不如硬件板卡测试普遍 测试工作缺乏可度量的管理手段 软件的功能性测试不够完善,需要新的方法的补充。 嵌入式系统代码量日益增多,测试难度增加 系统越复杂,测试越复杂,风险越大 ,实时嵌入式系统与仿真环境不同,W. Wayt Gibbs Staff Writer, Scientific American 实时系统中的错误通常很难找到原因,因为,就象你的车上的发动机发出奇怪的声音一样它只在某种条件下才会出
4、现。 故障在仿真环境中无法再现。,结论:我们迫切需要采用合适的工具,从单元集成、系统、现场等各个阶段,对嵌入式系统的软件进行实时在线测试和分析,保证系统的性能和可靠性。,嵌入式系统、嵌入式系统组成、特点,嵌入式系统:以应用为中心、以计算机技术为基础、软件硬件可裁剪、适应应用系统对功能、可靠性、成本、体积、功耗严格要求、有一定时间约束的实时专用计算机系统 嵌入式系统组成:嵌入式微处理器、外围硬件设备、嵌入式操作系统、用户的应用程序等四个部分组成,用于实现对其他设备的控制、监视或管理等功能。实时系统可以部分地从及时完成计算、处理或判断的能力来辨别 嵌入式系统特点: 专用性:嵌入式系统通常是面向特定
5、应用或特定用户的系统,不 同嵌入式系统的硬件和软件很难通用。 高度集成:能够把通用CPU中许多由板卡完成的任务集成在芯片内部,从而有利于嵌入式系统设计趋于小型化。 软件设计:嵌入式系统软件的设计与硬件关系密切。软件往往受限于硬件,很难象非嵌入式系统那样自由发挥。 开发的特殊性:嵌入式系统无自举开发能力,不能对其中的程序功能进行修改的,必须有一套开发工具和环境才能进行开发,嵌入式系统软件的特征,(1) 软件要求固态化存储 :为了提高执行速度和系统可靠性,嵌入式系统中的软件一般都固化在存储器芯片或单片机本身中,而不是存贮于磁盘等载体中。 (2) 软件代码高质量、高可靠性: 尽管半导体技术的发展使处
6、理器速度不断提高、片上存储器容量不断增加,但在大多数应用中,存储空间仍然是宝贵的,还存在实时性的要求。为此要求程序编写和编译工具的质量要高以减少程序二进制代码长度、提高执行速度。 (3) 系统软件(OS)的高实时性是基本要求 :在多任务嵌入式系统中对重要性各不相同的任务进行统筹兼顾的合理调度是保证每个任务及时执行的关键,单纯通过提高处理器速度是无法完成和没有效率的,这种任务调度只能由优化编写的系统软件来完成,因此系统软件的高实时性是基本要求。 (4) 多任务操作系统是知识集成的平台和走向工业标准化道路的基础要求,嵌入式系统的应用软件是实现嵌入式系统功能的关键,对嵌入式处理器系统软件和应用软件的
7、要求也和通用计算机有所不同,嵌入式软件测试自身特点和测试困难,1:嵌入式系统实时性要求测试工 具准确测试软件性能 2:内存有限要求对被测软件不能附加太多代码冗余 3:软件与硬件紧密相关增加测试难度 4:嵌入式软件载入目标机执行需要特定的硬件测试工具配套 5:嵌入式系统代码量日益增多,测试难度增加6:嵌入式系统越复杂,测试越复杂,测试风险越大7:实验测试环境与真实运行环境存在差异关系到嵌入式软件最终使用8:测试工具与目标机连接方式影响测试的可靠性,支持开发的不同阶段需要不同的工具,Software Development Life Cycle (t),App Code,Pre-Hardware,
8、App Code,App Code,LAN,LAN,Early Hardware(单元),Hardware Probe,主机开发 易于移植 费用低,在目标板上开发 以太网连接 费用低,在目标板上开发和测试 实时性能测试 产品质量保证,Final Hardware,Desktop Software Only,Host + Target Based on PC,SW Maintenance,Target HW - External Probes,Cantata, Attol, Maccabe,Cantata, Attol,Trace32,CodeTEST,嵌入式在线测试的特点:实时,在线,精确,软
9、件打点方式(主机+目标机) 比较便宜 可在CACHE打开下工作对目标系统影响大(超过50%) 占用目标系统资源如CPU 时间 内存,通讯通道等 only覆盖率分析 缺乏很好的性能分析 缺乏内存分配分析 精确度偏低,对目标系统影响小(1-15%) 不占用目标系统资源 软件打点技术 强大的性能分析 强大的覆盖率分析 强大的内存分配分析 有限的Trace功能和Trace Buf 价格较昂贵 可在CACHE打开方式下工作 比较精确,不影响目标系统(0%) 不占用系统资源 不用打点 强大的性能分析 强大覆盖率分析 强大内存分配分析 强大的RTOS分析 强大的触发Trace分析 软件测试、调试、逻辑分析集
10、成化,方便、灵活 精确性随情况变化 通过仿真存储器工作 性能价格比高,纯软件测试工具,高集成硬件工具 软件测试+逻辑触发+跟踪分析,硬件辅助软件测试工具,嵌入式系统测试和分析三步曲,amc_ctrl_port = 0x74100009,准备源文件,嵌入式软件常规的编译流程,嵌入式软件插桩的编译流程,为性能分析做标记,Int AddMove(uint *touch, uint from, uint to, Piece becomes) unsigned long amc_entry_dummy = (amc_ctrl_port = (enum amctag_t) 1947205646);if (
11、boardto ,兰色 = 性能标记,标记后的代码范例,if (SzMStk = MSPtr) MStk = (Move (*) 0) amc_realloc(MStk, (SzMStk + 100U) * sizeof(move),(enum amctag_t) 672399367);if MStk = 0) fatal (揅ouldn抰 realloc MStk!?;SzMStk += 100; if (becomes ,绿色 = 覆盖率标记,红色 = 内存标记,标记就是对物理地址的写信号, 可以被硬件的被动探头检测到。,附录1:源代码,void draw_fork ( int n , t
12、L_or_R forkSide ) int offset = 0;if ( LEFT = forkSide )offset = -1;elseoffset = +1;semTake ( semScreen , (-1) );position ( screen_rown -1 , screen_coln + offset );printf ( “v“ );position ( screen_rown , screen_coln + offset );printf ( “|“ );position_flush ( 13 , 1 );semGive ( semScreen ); ,附录2:软件插桩,
13、void draw_fork ( int n , tL_or_R forkSide )ctTag(1443921938); int offset = 0;if ( LEFT = forkSide) ? (ctTag(1464893457), 1) : (ctTag(1464893456), 0) )offset = -1;elseoffset = +1; position_flush ( 13 , 1 );semGive ( semScreen ); ctTag(1444970515);,附录3:硬件插桩,void draw_fork ( int n , tL_or_R forkSide )a
14、mc_ctrl_port = 0x74100009; int offset = 0;if ( LEFT = forkSide )amc_ctrl_port = 0x44308000;offset = -1;elseamc_ctrl_port = 0x44408001;offset = +1;amc_ctrl_port = 0x44208002;semTake ( semScreen , (-1) ); semGive ( semScreen ); amc_ctrl_port = 0x22100009;,功能测试不能满足要求,什么测试阶段使用在线测试 ?,低级测试测试在主机上完成,高级测试在目标
15、机实现,用 在线测试在开发和测试中 节省时间和金钱,Unit Test,单元代码编程/调试,单元级测试,单元代码编程/调试,单元级测试,单元代码编程/调试,单元级测试,单元级开发/测试: 优化性能 100% 单元覆盖 删除内存错误,集成级测试: 优化性能 提高测试用例的覆盖 删除内存错误,系统测试: 确认是否满足性能需求 提高覆盖的性能 缩短整个测试时间,集成和测试,系统测试和验证,用户安装,要求 分析/设计,嵌入式软件实时在线测试作用.,验证测试结果,评估测试的软件,指导测试用例的编写,嵌入式软件在线测试的内容,在线测试,Coverage Analysis,MCDC(条件决策覆盖) Modi
16、fied Condition DecisionCoverage - MCDC Decision Coverage - DC Coverage(语句覆盖) Statement Coverage - SC,为何要使用MCDC? 不是纯软件模拟;而是终端系统的监视 不仅可以分析哪些代码执行过,而且可以分析什么条件执行和为什么执行 一些软件质量关系到人的生命! 提供比一般代码块覆盖更详细、更明确的监视 满足特定行业机构的需求,如: FAA 航空 FDA 医疗 DOD, 空间技术, ISO等,工业质量要求 根据应用软件的重要性分为不同的级别,B级 危险的影响 需要DC测试 差分GPS 飞机之间接近感应C
17、级 重要的影响 需要SC测试 无线数据链接 D级 次要性影响 需要 BBC测试 飞机内环境控制(空调温度等) E级 没有影响 函数进入/退出覆盖率测试 飞机内娱乐设施,几个规范和要求的例子: 航空软件 RTCA DO-178B 标准 EUROCAE ED-12B 标准 对不同级别覆盖率测试的详细的报告符合不同级别的条件: A级 灾难性的影响 需要MC/DC 测试 引擎控制 飞行计算 导航处理,通常的基本块覆盖率度量方法,基本块覆盖-测量测试中 代码是否已经执行 突出高亮显示执行过的代码 在主机电脑上进行源代码显示方法 使用 printf 语句 使用调试工具和设断点 使用硬件工具测量 硬件增强型
18、测量工具,覆盖率: 摘要显示,一个页面就可以显示整个程序的覆盖率摘要信息 一眼望去,就可以知道当前测试进度。 支持把多次测试的数据合并,在线测试覆盖率: 覆盖率趋势,知道覆盖率的增加情况 确定何时达到覆盖率的峰值点 交互式,可简化测试用例的生成 保证测量效率前提下缩短测量次数和时间,覆盖率 测试结果:,发现程序中的死代码 提高测试覆盖率 有 ?% 没有测量? 覆盖率可视化 实时动态显示 但是 一些软件非常关键基本块覆盖并不适用于所有的工业场合,如果只有大约30%的覆盖率,这样的测试还远远不够!,高亮显示执行过的代码,重点检查部分函数,审查未执行过的代码行的执行条件,DC-决策覆盖 包含决策覆盖
19、和语句覆盖,语句覆盖摘要:程序的每一条语句被执行了至少一次 决策覆盖摘要:程序中的每一个进入,退出点被执行了至少一次,程序中的每一个决策的所有结果都至少出现过一次。,语句覆盖/决策覆盖详述,( 1) Coverage line 5 = A_FUNCTION_ENTRY:5: unsigned greatest_common_divisorWas Entered 2 *Coverage line 12 = A_SEGMENT:12: if (a_working b_working)Not Executed 3 *Coverage line 14 = A_SEGEMENT:14: a_workin
20、g -= b_working;Not Executed,( 1) Coverage line 5 = A_FUNCTION_ENTRY:5: unsigned greatest_common_divisorWas Entered 2 *Decision line 10 = A_WHILE:10: while (a_working != b_working)T: Not ExecutedF: Was Executed 3 *Decision line 12 = AN_IF12: if (a_working b_working)T: Not ExecutedF: Not Executed,语句覆盖
21、,决策覆盖,什么是MCDC覆盖?如何进行? (MCDC覆盖不是执行了什么代码,而是在什么条件下 执行了代码,以及为什么执行它?),范例: if (cond 1) or (cond 2) and (cond 3)then A B Celse X Y Z,希望得到的报告:,cond 1 cond 2 cond 3 branchT F F FT F T TF F T F 等,MCDC覆盖条件决策覆盖,条件决策覆盖率摘要: 每一个进入,退出点被执行 过至少一次,每一个决策都取得过它所有的可能结果的值至少一次,每一个决策中的每一个条件都曾经独立的影响决策的结果至少一次,独立影响的含义是指在其他条件不变的
22、情况下改变某一个条件,MCDC 覆盖率详述,( 1) Coverage line 5 = A_FUNCTION_ENTRY:5: unsigned greatest_common_divisor (unsigned a, unsigned b)Was Entered 2 *Decision line 10 = A_WHILE:10.1: a_working != b_workingTruth Table:+ 0: F-f1: T-tIndependece Tests:True False- -* 10.1: 1: T-t + 0: F-f 3 *Decision line 12 = AN_IF
23、:12.1: a_working b_workingTruth Table:0: F-f1: T-t,覆盖率趋势,一个实际的例子 工程测试花了6个小时达到 30%覆盖率一系列同样的测试花费了48小时 增加了 37%覆盖率问题: 你的测试中是否有一些重复的测试? 如果没有覆盖率趋势显示,你测试中会有多少天还是多少小时在做无用功?,覆盖率: 优点,提高测试效率 通过覆盖率趋势,去除不必要的测试 通过覆盖率趋势,减少测试次数,测试更有效率 实时动态显示覆盖率,简化测试用例生成过程 在一个实时运行的目标系统中,确保可以显示详细的软件运行过程 指出嵌入式系统中没有得到足够测量的部分-让你清楚的知道要测量
24、什么地方 提高产品质量 发现没有测量过的部分 清楚的描述你的代码被检验到了什么程度 符合最严格的工业软件测试标准:有利于通过ISO,医疗器材和航空器材的认证。 提供的报告可以直接在对测试过程和测试条件描述的文档中使用,性能分析 特点,最优化的性能 优化关键函数的运算法则 高效地优化调用接口 纠正任务的优先权,可视化 即时,监控超过 C/C+ 函数和任务 统计分析 实时测试 多窗口显示函数和调用性能分析显示: 函数活动 调用显示,TRACE32/性能,任务性能,函数性能,调用关系,性能分析和优化事例,发现关键任务执行太慢,不满足要求,速度反常?把两个函数每个速度提高10% 发现占用时间多和调用频
25、繁的代码,把它们 in-line,性能提高了15%把一个任务速度提高8% 整个系统性能提高 20% 结果: 性能符合要求,击败竞争对手 得到大的定单,市场分额增加 不用进行昂贵的硬件升级和重新设计 收益估计?,trace32/性能分析,Function Analysis Min. and max. time , Average , Total Time Passes Include and exclude time Link Analysis Callers Min. and max. times Calls Function Nesting Shows function call hiera
26、rchy Time suspend in subroutines,Trace32/性能分析,Function Timechart View critical program paths Documentation Duration Execution time Response time Distance Time between samples Distribution Interface analysis Interrupt analysis System state analysis Statistical analysis,内存分析 特点,提前故障警告 动态内存分配分析 识别内存漏洞
27、查出无用的内存区域 知道真正的内存分配情况,可视化的内存错误提示 当出现错误时识别精确的逻辑关系 准确地识别每一个错误 精确定位内存错误,信心 在程序运行失败之前侦测问题的所在,内存分析,显示分配的内存块的大小 检测内存泄露 检测内存错误“嵌入式软件测试总是要花太多的时间, 并且没有进行足够的测试,这是由于软件开发者和测试者缺乏可以简化测试的工具,或工具很难使用。”David Shear - Sr. Analyst, Embedded Systems Research,内存分析显示,分配情况,内存错误,相应的源代码,显示内存分配情况,显示内存 相应的源代码,测试内存: 优点,了解程序内存分配的
28、真实情况 测量内存使用情况,发现对内存的不正常使用 在系统崩溃前发现内存泄露错误 发现内存分配错误 精确显示发生错误时的上下文情况 指出发生错误的原由 无须做痛苦的代码跟踪,就可以发现错误 在问题出现前发现征兆,What is called Trace ? What function is Trace ? How many components are included in Trace ? Trace buffer memory Logic Breakpoint Event Breakpoint Logic Trigger(Input and output trigger and Exter
29、nal Trigger) Context Tracking System(CTS),逻辑触发代码跟综分析,trace32外部触发输入,2 inputs each with 8 channels 2 trigger qualifiers for each trigger level and channel group Each channel group can be assigned 2 trigger events for each level, definable using boolean formulae,trace32事件-events,Free format definition
30、of external trigger events Free Format Definition of Data Events Data events can be specified with constants, masks, range or boolean formulae. Hex and Mnemonic Display of Trace Data,Trace32跟纵系统图形显示功能,Real time display Tracking to List Windows Graphical Data Display Show A/D Conversion Visualize Pro
31、gram Flow Complex Search and Compare Functions Save and Reload of Trace Data PC Display on Real-Time Emulation,trace32触发输出,3 freely programmable outputs Cycle signal RUN signal BNC connector for oscilloscope trigger,trace32触发单元,All output operators and input variables can be input in symbolic form.
32、The target program symbols can also be used. Free Format Definition of Data, Address and Trigger Events Time and Event Measurements with up to 3 Counters There are 3 40 bit counters available for event measurement or event triggering. All counters are re-triggerable and can be evaluated as a part of
33、 an expression in the trigger sequences. Each counter can be programmed as a timer for timing measurements or an event counter.,trace32 触发记数器,3 Universal Counters - 40 Bit Event count 1 to 1.1 E + 12 Cycles 1 to 1.1 E + 12 Time 100ns to 1.3 days Retriggerable Selective release Trigger event when cou
34、nter is zero Definition of time and event windows,trace32 触发监控、触发标志,All Counters can be read on the fly Trigger Monitor A display of the count values, the trigger values, the trigger levels and the trigger flags is available in the trigger monitor window. Trigger Flags Independent of the trigger lev
35、els, there are 3 freely programmable trigger flags. These flags can be read during triggering and can be used as input variables by the trigger sequencer.,trace32触发输入变量,READ, USERDATA, OPFETCH CPU status PROGBREAK program breakpoint LINE high-level line number and SPOT spot point READBREAK data read
36、 breakpoint WRITEBREAK data write breakpoint A,B,C address points TRIGG0,TRIGG1 bus trigger events TRIGGER trigger events (3 per level) NMI, RESET trigger events from the CPU FULL trace memory full READ, WRITTEN read or write flag and MAIN main process BREAK break event and TIMEOUT timeout signal SY
37、NCH synchronous trigger and ASYNCH asychronous trigger ECOUNT universal counter zero and DLATCH task monitor,trace32 触发输出功能,TRACE trace release TRACEON trace memory on and TRACEOFF trace memory off GOTO change trigger level FLAGON flag on and FLAGOFF flag off FLAGTOGGLE flag TOGGLE TRIGG0,TRIGG1 tri
38、ggering via ICEBUS MARKERA.MARKERC markers in the TRACE memory BREAK trigger emulator and STOP break Emulator SPOT spotpoint emulator EXCEPTION trigger exception generator RESTART reload counter and ENABLE enable counter release OUT0.OUT2 trigger outputs (test probe) DLATCH task monitor and LEVEL le
39、vel control,Logic and Event Breakpoint,Example for Logic and Event Breakpoint When Address=0xffff OR Address=0xffff0000 AND Read AND Trace memory Full Then Break If Counter Overflow XOR SYNCH Trigger While Address 0x10000 Write Then BREAK trigger emulator AND STOP break Emulator Event And Logic Leve
40、l,触发器设计范例,Trace32上下文跟综系统CTS,In order to find out which instructions, data or system states had caused malfunctioning of the target system it was necessary to spend a lot of time analysing the trace listing. The context tracking system - CTS for short - now allows to recreate the state of the target
41、system at a selected point based on the information sampled in the trace buffer. From this starting point the program steps previously recorded in real time in the trace memory can be debugged again. Tracking System (CTS) uses the information from the trace analyzer with the help of an instruction s
42、et simulator to generate system states related to the cursor position in the trace buffer. You can single step a program part, which was executed before in realtime. The system shows local and global variables in memory or registers in the same windows like the regular debugger. Stepping is possible
43、 in both directions. Reconstructing register values with instruction set simulators is supported for the 68K family, PowerPC, SH2 and ARM7. The C167 family uses the information provided by the bondout to get the register values.,Local or register variables in trace window,软件运行追踪可以 验证系统运行,高级方式,控制流方式,
44、源代码方式,验证系统运行或运行时间满足要求,RTOS 测试与分析,Highlights Statistic evaluation and graphic display of task run times Task related evaluation of function run times Statistic evaluation and graphic display of task states Manual executed system calls Task stack coverage PRACTICE functions for OS data RTOS related pu
45、ll-down menu Task selective debugging,trace32 RTOS 测试与分析1,Display of Kernel Resources Tasks Queues/Semaphores Memory usage Mailboxes Display on the fly,Detailed Resources Selection by name or ID Queue contents Memory blocks Task queues Task CPU Usage Time spend in a task Number of switches to a task
46、 Average running time Ratio of CPU time used by taskMaximum time a task is interrupted by other tasks,trace32 RTOS 测试与分析2,Task Activity Timechart Shows running tasks Tracking to other analyzer windows Function Nesting Display Graphical function nesting Display task switches Can be combined with any
47、other analyzer displays,trace32 RTOS 测试与分析3,Detailed Function Performance Analysis Time spend in function Minium/maximum time Average time Time spend in subroutines Time function was interrupted by an other task Number of calls Ratio of CPU time,trace32 RTOS 测试与分析4,Task State Analysis States: undefi
48、ned, ready, running, suspended, waiting Total time of state Maximum time Average time Number of occurences Ratio of CPU time Configurable display,trace32 RTOS 测试与分析5,Task State Timechart States: undefined, ready, running, waiting, suspended Uncovers priorisation problems Time spend in critical paths of the program System Call Trace System call with parameters Originating task Time for system call,