[转贴]基于ARM7内核的嵌入式应用程序调试技术

                            基于ARM7内核的嵌入式应用程序调试技术
                                           (解放军信息工程大学)
                                        王京林     苏洁      詹横空
摘要:本文论述了基于ARM7内核的嵌入式应用程序调试技术,针对其中的难点:如何调试固化在ROM中的代码,如何使用软件模拟器模拟外部设备进行了详细分析。
关键字:ARM,调试器,软件模拟器
The debugging of embedded application based on ARM7 core
                         Wangjinglin      SujieZhanhengkong
                   (Information Engineering University)
Abstrct:This article discussed the debugging of embedded appliction based on ARM7 core。simulating peripheral  with the software simulator and source-level debugging of ROM images were analyzed in detail.
Keywords:ARM7,Debugger, Software simulator
引言:
嵌入式处理器是一个复杂的高技术系统,要在短时间内掌握并开发出所有功能是很不容易的,而市场竞争则要求产品能够快速上市,这一矛盾要求嵌入式处理器能够有容易掌握和使用的开发工具平台。提高用户和程序员的时间-投入回报率。
在PDA,STB,DVD等消费类电子产品以及GPS,航空,勘探,测量等军方产品中都得到了广泛应用的ARM处理器具备完善的开发工具平台,包括ARM公司和第三方提供的软件开发工具包、软件模拟器、目标板监控器、基于JTAG接口的在线实时仿真器以及针对不同微控制器(以ARM为内核)的评估板和开发板,给用户提供了不同的选择。
嵌入式应用程序的调试贯穿整个系统的开发过程,它提供纠正软硬件错误改进系统性能的依据,有效使用调试工具能够提高效率,缩短开发周期,增强产品的市场竞争力。
本文为基于ARM7的嵌入式系统开发过程中的调试难点提供了解决方案。

1.ARM公司调试工具介绍
ARM调试工具包括Angel,软件模拟器ARMulator,在线实时仿真器Multi_ICE 或EmbeddedICE。
(1)Angel系统包括在主机上运行的调试器和在目标机上运行的Monitor, 通过串口通信,具有基本调试、通信、任务管理、异常行为处理等功能,支持C库。缺点是需要占用目标机系统资源,如串口,ROM,RAM等,优点是成本低。
(2)ARMulator独立于处理器硬件,是一种有效的源程序检验和测试工具。但值得注意的是,模拟器毕竟是以一种处理器模拟另一种处理器的运行,在指令执行时间、中断响应、定时器等方面很可能与实际处理器有相当的差别。另外它无法和ICE(在线实时仿真器)一样,仿真嵌入式系统在应用系统中的实际执行情况。
(3)Multi_ICE 或EmbeddedICE通过JTAG端口与目标系统联接,价格昂贵,但使用方法简单,调试快捷方便,无需占用系统资源。它可以设置实时地址和数据独立的断点、单步执行、对ARM内核完全存取和控制、对ASIC系统完全存取、完全存储器存取(读/写)、完全I/O系统存取(读/写)。EmbeddedICE 和Multi-ICE 还可以使嵌入式微处理器存取主机系统的外设,如显示器,键盘输入,和磁盘驱动存储器。

                      串口或并口               JTAG端口


2.调试过程
调试应该解决三个问题: 应用程序在许多极小的用户事件中是否表现出预期行为?应用程序执行是否可靠?应用程序是否满足了设计要求?所以调试分三个阶段:快速定型阶段,验证阶段和有效性确认阶段。
(1)快速定型使程序员熟悉应用程序行为,确定在许多极小的用户事件中程序工作是否符合预想。
(2)验证阶段仿真器应检测到的如下问题:算法错误(如指针溢出,除0)、死源代码、队列溢出、死锁、活锁。
注:当一些事件围绕一个封闭的对象循环触发了一个无限消息流,如果没有其他事件中止这个循环的消息流,消息流将会变得不确定,这种状态叫做活锁。活锁虽然浪费系统资源,但可能不会妨碍系统继续工作,所以当发生活锁时,有可能造成设计正确运转的假象。
(3)有效性确认阶段是检验应用程序表现出的行为是否总是符合预想(有效性),是否从不产生违反规则的行为(安全性),这对于实时系统尤其重要。  

3.调试难点分析
3.1使用软件模拟器模拟外部设备
ARMulator—ARM公司提供的软件模拟器,是一个仿真各种ARM内核结构和指令集的程序。它与ARM调试器联接,提供了在PC主机系统和支持的工作站上开发ARM软件的环境,该环境是硬件独立的。下面以Armulator为例说明使用软件模拟器模拟外部设备的方法。ARMulator包括4个组成部分:
(1)ARM处理器内核模型:处理ARM内核与调试器之间的所有通信,不允许用户修改。
(2)存储器接口:在ARM模型与存储器模型或存储器管理单元模型之间传递数据。
(3)协处理器接口:处理ARM内核与协处理器之间的通信。
(4)操作系统接口:提供程序运行环境。
   ARMulator核心能够表现处理器的内核和高速缓存,但是在C源代码中描述的存储器系统可以由用户设定为任意目标系统模型。ARMulator核心与存储器模型之间的接口体现了ARM内核的引脚接口,包括为该存储器模型在nFIQ和nIRQ引脚上产生中断的能力。
用户通过修改或重写缺省的模型,几乎可以模拟所有基于ARM处理器的系统,用来调试硬件相关代码。当模拟外设时,用户需要ARMulator 能够仿真外部事件的发生,为此ARMulator提供了两个例程辅助事件调度:ARM_Time用来返回从系统复位到当前的时间片数目;ARMul_ScheduleEvevt允许在一定时间后调用某个程序。
下面通过一个仿真并行端口的实例来说明具体方法,要求该并行口产生一个中断,然后从一个文本文件中读出一个字符放入存储器中。实现步骤如下:
(1)建立新的存储器模型。首先拷贝一份ARMulator的存储器模型,作相应修改,创建parallel.c文件,添加两个变量:中断产生标志和指向要访问的文本文件的指针,添加一个新程序parallel_set_irq用来触发中断并设置中断产生标志为1。
(2)修改models.h和makefile。在models.h中添加MEMORY(Parallel)作为新的存储器模型的根入口。编译parallel.c产生目标文件添加到makefile中的目标文件列表中。
(3)添加新模型到ARMulator,并在PC机上使用微软的Visual C++重建“ARMULATE.DLL”,产生新的ARMulator。
(4)修改armul.cnf,选择该存储器模型。
当应用程序访问一个特定存储器地址(如0x123450)时,ARMul_ScheduleEvent函数被激活。ARMul_ScheduleEvent函数在20000个时间片后调用parallel_set_irq,从而产生一个中断服务请求,系统进入中断服务程序(由应用程序设置中断向量安装ISR),中断服务程序从另一个预定义的位置(如 0x123460 )读出一个字符,并清除并行端口的中断源,返回应用程序。
这种方法与用户使用的ARM调试器没有关系,因为它是软件模拟器的一部分,不属于调试器。这是一项非常有用的技术,可以扩展到用C语言为整个系统建立模型。例如,它可能模拟一个PDA系统,包括键盘,定时器,并行接口,液晶显示屏等等。

3.2在源代码级调试ROM中的目标文件
由于当前嵌入式应用程序复杂性的增加,代码容量越来越大,国内嵌入式系统中代码达到1M字节的并不少见。在开发嵌入式应用系统时,通常是将程序代码装载到RAM中运行调试,这将占用大量内存空间,提高系统成本。
   EmbeddedICE或Multi-ICE,与ARM调试器通过JTAG端口联接到ARM内核的EmbeddedICE逻辑电路上,使用户能够调试固化在ROM中的代码。为了使用源代码级符号调试信息调试ROM代码(设置断点,单步运行等),用户需要生成两个文件:
(1)代码的二进制文件,用于固化在EPROM里或者下载到用户系统上的FLASH里。该二进制文件不包含任何调试信息。
(2)相同代码产生的带有附加调试信息的文件,通过选择窗口调试器菜单的“File-〉Load symbol only”或者符号调试器的“readsyms”指令装载到调试器中。
使用仿真器调试固化在ROM里的程序时,要注意两个问题:
(1)首先要将调试器内部设置的$vector_catch 与$semihosting_enabled设为零,禁止向量捕获和半主机软件中断。因为仿真器能够控制这些会俘获异常行为的区域(0x00-0x1c,中断向量表地址)。俘获异常行为是通过用一个无用的二进制位值0xDEEEDEEE覆盖中断向量,调试器存储中断向量的原始值,显示给用户。只要该二进制值被提取并到达管道的执行阶段,调试器就会调用自身的SWI(软件中断)服务程序处理异常行为,然后通知用户,这样用户将无法调试自己的中断服务程序。
(2) 对于ARM7xDI内核,用户最多只能设置两个断点,这是因为EmbeddedICE宏单元
 只有两个实时观测单元,这两个单元可以设置为断点或观察点。例如:两个ROM    
 中的硬件断点,或一个ROM中的硬件断点与多个RAM中的软件断点,而软件断
 点只能设在RAM中。
结语:
软件模拟器和目标Monitor提供了一种经济的调试手段,对于很多设计来说已经足够。但是也有很多场合,需要利用仿真器来找到程序错误。无论在哪一种场合,仿真器都能够减少调试时间、简化系统集成、增加可靠性、优化测试步骤,从而使其物有所值。更常见的情况是工程师在项目的不同阶段同时使用软件模拟器和仿真器,特别是在大的开发项目中。

作者单位:王京林(解放军信息工程大学基础部电子线路教研室,郑州,450002)
 苏洁(解放军信息工程大学信息技术学院通信工程系,郑州,450002)
         詹横空(武汉工业大学网络中心,武汉,430073)
参考文献:
[1]Vincent Encontre .How to use modeling to implement verifiable,scalable,and efficient real-time application programs.Real-time Engineering,November 1997    
[2] 金 惠 华. 蓬 勃 发 展 的嵌 入 式 计 算 机 结 构.计算机世界,2000(1)
[3]ARM Limited.ARM Software Development Toolkit Reference Guide. 1998

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值