基于外部RAM的ARM异常程序调试技术

2012-09-07 10:49姚茂群叶汉能赵武锋颜佳宁
关键词:指令调试向量

姚茂群,叶汉能,赵武锋,颜佳宁

(1.杭州师范大学钱江学院,浙江杭州310012;2.杭州师范大学信息科学与工程学院,浙江杭州310036;3.浙江大学信息与电子工程学系,浙江杭州310027;4.浙江医学高等专科学校图书信息中心,浙江杭州310053)

基于外部RAM的ARM异常程序调试技术

姚茂群1,2,叶汉能2,赵武锋3,颜佳宁4

(1.杭州师范大学钱江学院,浙江杭州310012;2.杭州师范大学信息科学与工程学院,浙江杭州310036;3.浙江大学信息与电子工程学系,浙江杭州310027;4.浙江医学高等专科学校图书信息中心,浙江杭州310053)

在阐述ARM中异常处理的基本思想以及基于JTAG进行调试的基本原理的基础上,详细分析了目前各种基于外部RAM的ARM异常程序调试技术的原理和特点.通过对比各种调试技术的适用性和优缺点,结合目前嵌入式系统开发过程中常用的ARM芯片和集成开发工具,提出一种新的在外部RAM中调试含有异常处理代码的ARM程序的调试技术,并通过实验验证了其有效性.

异常处理;JTAG协议;外部RAM;ARM体系结构;调试技术;嵌入式系统

嵌入式系统的开发一般可分为需求分析、设计、生成代码和固化几个阶段[1].在生成代码的过程中,调试是确保程序最终能在系统中顺利运作的关键.由于RAM(Random Access Memory)具有可读写、速度快等特点,因此在RAM中调试程序是一种基本并有效的方法.ARM(Advanced RISC Machines)处理器作为嵌入式领域中运用最多的处理器之一,占据了32位RISC(Reduced Instruction Set Computer)微处理器75%以上的市场份额,它的应用深入到了各个领域[2].很多ARM集成开发工具在RAM中调试程序时,可以方便地设置无限的软断点,便于分析程序中存在的不足.ARM处理器一般内置很少RAM,系统中需要外挂SDRAM(Synchronous Dynamic Random Access Memory)才能满足应用需求.而外部SDRAM正常使用的前提是配置好ARM处理器的相应控制模块,这个工作在调试时一般通过JTAG(Joint Test Action Group)来实现,因此JTAG在调试过程中有着十分重要的作用.

异常响应是嵌入式系统必须具备的一种程序处理模式,对于系统实时性和稳定性至关重要[3].ARM处理器建立了一套完整的异常处理机制,在系统设计过程中可以根据每种异常的具体解决方法编写相应的异常处理代码,当异常产生时,即可执行对应的代码正确处理该异常,从而保证系统的正常运作.

针对含异常处理代码程序的调试,现有的一些方法通常需要涉及Flash烧写、MMU(Memory Management Unit)重映射或在源程序中额外增加建立异常向量表的内容[4-6],步骤较烦琐,原理较复杂并增加了被调试程序本身的代码量.本文根据ARM体系结构和异常处理程序的一般特点,充分利用JTAG在调试中的作用,提出一种新的在外部RAM中调试含异常处理代码的ARM程序的方法.该方法原理简单、无需改动被调试程序本身、操作方便,并在Samsung公司以ARM920T为内核的S3C2440A芯片及Hynix公司的HY57V561620C SDRAM芯片组成的环境下进行了验证.

1 ARM体系的异常处理

在ARM系统开发过程中,调试的程序通常会包含异常处理部分,合理的异常处理是健壮的系统必需的.ARM7、ARM9处理器包含8种异常:复位、未定义指令、软中断、预取中止、数据中止、保留、外部中断和快速中断[3].

当特定异常产生时,CPU自动到固定地址取指[7-8].因此常在对应位置存放异常向量表,通过读取异常向量表对应的指令,跳转到相应的异常处理函数.由于该地址通常不在外部RAM地址范围内[9],所以在外部RAM进行异常调试时需要一种机制来保证异常向量表的正确读取.以下3种基本方法可以达到正确读取异常向量表的目的:1)在符合要求的位置放置异常向量表,通常对应NOR Flash或内部SRAM;2)将异常向量表放在外部RAM中,通过重映射机制,将异常向量表的位置映射到符合要求的地址;3)将异常向量表保留在外部RAM中,在异常发生时的固定取指位置放置跳转表,通过相应的跳转指令跳转到外部RAM中异常向量表的对应位置.

2 JTAG调试的原理

JTAG调试作为最常用的一种调试方法[10-13],得到了各种ARM芯片的支持.作为测试访问端口和边界扫描结构标准,JTAG主要用于芯片内部测试.

2.1 测试访问端口(Test Access Port,TAP)

TAP是JTAG标准测试协议中的一个通用端口,通过它可以访问芯片的所有数据寄存器(DR)和指令寄存器(IR).它包括5个信号接口:时钟(TCK)、状态选择(TMS)、数据输入(TDI)、数据输出(TDO)和复位(TRST).数据的访问过程按照如下步骤进行:1)由指令寄存器指定数据寄存器;2)将指定的数据寄存器连接到TDI和TDO之间;3)在TCK的驱动下,从TDI输入数据,将选定数据寄存器中的数据从TDO中输出.访问过程通过TAP控制器的状态机来实现[10].

2.2 边界扫描结构(Boundary-Scan Architecture)

边界扫描结构主要由扫描单元串联形成的扫描链组成,每一个扫描单元分配给CPU核或芯片相应引脚.

ARM芯片内部设计多条长度不同的扫描链,因此可以访问的寄存器等范围也不同.通过这些扫描链,可以访问ARM内核的外围电路,包括数据总线,因此无论内部寄存器还是外部RAM,都可以通过JTAG进行访问[10].图1为ARM处理器的扫描链分布示意图.

基于JTAG调试可以以特定时序来实现对指令和数据的存取,从而实现调试、下载、Flash烧写等功能.

图1 ARM扫描链分布示意图Fig.1 Distribution map of ARM scan chain

3 外部RAM中进行异常调试的常用方法

KEIL和IAR是目前ARM开发中常用的两个集成开发工具[13],它们的基本开发流程一致.在RAM中进行程序调试前,需搭建好软硬件开发平台、编译链接源程序,其中链接文件需要根据外部RAM在系统中的位置以及采用的调试方法来设置.IAR的链接文件(v5版本的.icf文件)主要用来指导各段的链接操作,确定各段链接地址;接下来需要建立初始化脚本(.mac文件),它由IAR的内置函数或命令组成,控制JTAG做下载被调试程序前的准备工作.KEIL中初始化脚本为.ini文件.构建好调试环境后,就可以进行正常的调试工作了.图2为简单的调试流程.

在图2中,通过初始化脚本来构建调试环境,其主要内容包括:1)关闭看门狗、关中断、初始化RAM控制器、初始化时钟等,其中RAM控制器(ARM芯片中的Memory Controller)的初始化是为外部RAM的读写作准备;2)下载程序;3)修改程序指针PC,使其指向调试程序入口.

ARM处理器遇到异常时将自动修改PC值为特定的地址.以下以S3C2440A芯片为例,这个特定地址通常对应地址空间前8个字的寻址位置[9].而在外部RAM调试时,这8个字的位置上一般没有指令或指令不正确,这就需要一种机制来保证在这些地方放置正确的跳转指令.由于不同开发板上配置的存储芯片情况不同,异常调试策略也有相应的变化.以下是一些常见的调试办法.

1)将异常向量表烧写进Flash[4-5].硬件系统通常配置有Flash,因此可将异常向量表事先烧写进Flash.如果Flash为NOR Flash,并且系统设置成从NOR Flash启动,则系统寻址空间的起始部分对应NOR Flash的存储空间,由于程序可在NOR Flash中执行,所以异常发生时可执行其异常向量表的相应指令;如果Flash为NAND Flash,并且系统设置成从NAND Flash启动,那么ARM CPU在上电后自动将NAND Flash中的前4 K代码搬移到内置的SRAM中,并且将SRAM的存储空间映射到寻址空间的前4 K地址,异常发生时便执行SRAM中异常向量表的相应指令.

2)分散加载[4-5].系统上电后寻址空间的起始地址对应SRAM存储空间的情况下,可以通过链接脚本将主程序中的异常向量表链接到SRAM,而其它程序链接到RAM中,这样调试时即可通过分散加载的办法,使得异常向量表的位置满足要求.

3)通过源程序在起始位置建立异常向量表[4-5].按照存储空间起始位置对应存储器件的不同,如SRAM或者NOR Flash,通过在源程序中额外增加不同的写操作从而在寻址空间的起始位置建立好异常向量表,之后异常产生时就可以按照这个新建的异常向量表操作.

4)利用MMU将部分RAM映射到起始地址[4-5].由于MMU存在,异常向量表并不必须放在寻址空间起始地址,可通过重映射,将外部RAM的部分地址映射到寻址空间起始位置.异常到来时,CPU修改PC后实际对应的是RAM中异常向量表的地址,从而读取相应指令.建立重映射的工作可在源程序中实现,也可通过初始化脚本实现.

在实际的调试过程中需要结合开发板的配置以及对实际调试各方面的要求来选择特定的调试办法.

图2 调试操作流程Fig.2 Scheme of debugging process

4 外部RAM中进行异常调试的新方法

基于ARM系统的调试机理以及常用ARM集成开发工具中各配置文件的作用,本文在由NAND Flash引导的硬件系统中,提出一种新的在外部RAM中进行异常调试的方法.

在IAR的.mac文件以及KEIL的.ini文件中,可以利用一套特定的指令来实现对SRAM和SDRAM的读写[13],而这些读写操作正是基于JTAG进行的,并且在被调试程序运行前完成,在时间上能很好地保证对异常的调试.这些操作原理并不复杂,在KEIL和IAR的初始化脚本中很容易实现.相对于通常的调试方法,这种方法有效地利用了JTAG的机理,并不需要在NAND Flash烧写异常向量表,不必因为通过源程序在SRAM中建立异常向量表而增加程序的难度和大小,同时也不需要进行分散加载和使用MMU等.

本文验证过程所基于实验平台的相关配置为:处理器芯片为S3C2440A,其扩展储存的8个Bank中Bank6和Bank7外挂SDRAM,对应存储空间的起始地址为0x30000000;系统配有NAND Flash,并被设置成上电后从NAND Flash启动,因此上电后系统寻址空间前4 K将对应SRAM的存储空间.

以下为ARM异常程序调试新方法的具体步骤:

1)做好调试前准备.链接程序时参照外部RAM的地址进行设定,并不需要分散加载.

2)构建调试环境,建立初始化脚本.这部分是重点.除了与其他方法相同的初始化硬件部分外,需要添加通过JTAG在SRAM中建立跳转表的操作,然后下载程序,修改PC使其指向被调试程序的相应位置.

建立跳转表时,由于外部RAM的位置从0x30000000开始,而跳转指令“B”只能在32 M范围内跳转,“MOV”指令加载的立即数必须由8位数通过偶数次移位得到,因此都不能满足要求.所以采用“LDR”伪指令加载立即数给PC,从而跳转到外部RAM中异常向量表的位置.该过程中,“LDR”伪指令实际上是在固定的位置(4 K范围内)以文字池的方式存放需要加载的立即数,并从该文字池中取相应的立即数给寄存器.根据这个原理,编译器将“LDR”伪指令编译成两部分,一部分为存放在文字池中的立即数,另一部分则是到文字池相应位置读取立即数的指令.因为要通过JTAG加载异常向量表,需要使用“LDR”伪指令编译后对应的机器码,这可以从编译器编译后的结果中得到.

以KEIL为例,在初始化脚本(.ini文件)里面实现跳转表的代码如下:

以上初始化代码中,前8条中的“0xE59FF018”即为读取文字池中的立即数给PC的指令对应的机器码,后8条中“0x30000000”、“0x30000004”、“0x30000008”等为文字池中的立即数.例如“_WDWORD(0x00000000,0x E59FF018)”和“_WDWORD(0x00000020,0x30000000)”两条指令对应了“LDR PC,=0x30000000”指令.IAR由.mac文件实现以上功能,原理跟KEIL一致,用“__write Memory32”替代“_WDWORD”指令即可.

3)下载程序,进行正常的程序调试操作.表1列出了本文提出的ARM异常程序调试新方法与常用调试方法所需的操作.

表1 不同调试方法所需操作比较Tab.1 Comparison of operations required by different debugging methods

由表1可知,方法1需要对Flash进行烧写,而Flash烧写并不如RAM下载程序那么方便,具有费时和降低Flash寿命的缺点;方法2通过修改链接脚本达到分散加载的目的,但在完成调试之后需重新修改链接脚本;方法3需要在主程序中额外编写一段程序以用于在特定位置建立异常向量表,特别在需要将异常向量表放在NOR Flash中时,这段额外的程序比较大,实现也比较烦琐,并且在调试完成后需要将其删除;方法4需要修改MMU的相关设置,而如果需要调试的程序本身也要用到MMU的功能,那么就可能形成冲突而造成错误.另外,以上所有的方法都需要编写初始化脚本.而新方法只需要编写初始化脚本,通过初始化脚本建立跳转表,充分利用了JTAG的原理.该脚本的编写非常简单,因此新方法相对以上4种方法来说,步骤少、实现方便、可操作性强.

5 验 证

以下以外部中断0(EINT0)触发快速中断FIQ为例对该方法在异常情况下的效果进行验证,所用集成开发环境为KEIL和IAR.根据本实验开发板的电路设计,EINT0对应的引脚外接了按键,并且按键按下将使得对应的引脚为低电平.配置EINT0为低电平触发,并且中断模式设置为FIQ.通过链接脚本,将源程序链接到0x30000000处.整个过程按照图2所示顺序进行操作.

在主程序正常运行过程中,按下EINT0对应按键,系统进入FIQ模式,并且PC指针自动指向了地址0x1c处,反汇编显示该处指令为“LDR pc,[pc,#0x18]”,对应的机器码为“0xe59ff018”.由于流水线的关系,系统在执行上述指令时,PC值为0x24,加上0x18后对应地址0x3c,通过反汇编或集成开发工具的其他相应功能模块可看到该地址上的数据是0x3000001c,正是源程序异常向量表中FIQ对应指令在外部RAM的位置.单步执行,程序顺利跳转到0x3000001c处.继续执行,程序进入了相应异常处理函数.

其他异常模式经验证均简单有效.实验证明,本文提出的新方法在ARM异常程序调试中切实可行,且操作简单.

6 结束语

嵌入式系统开发过程中进行异常调试是非常必要的,由于RAM具有便于读写的特点,在RAM中进行异常调试是常用的手段.本文结合ARM异常处理的机制、JTAG调试的机理,详细分析和总结了在RAM中进行ARM异常调试的常用技术,提出了一种新的在外部RAM中进行ARM异常调试的方法,该方法具有原理简单、不需要改动调试程序本身、可操作性强等优势.在基于S3C2440A、由NAND Flash引导的开发板上分别使用KEIL和IAR集成开发工具进行了验证,结果表明该方法简便、有效.

[1]吴学智,戚玉华,林海涛,等.基于ARM的嵌入式系统设计与开发[M].北京:人民邮电出版社,2007:18-65.

[2]尹旭峰,苑士华,胡纪滨.ARM微处理器中断响应时间的实验研究[J].计算机工程,2011,37(4):252-254.

[3]李莉,路而红.ARM异常处理机制[J].燕山大学学报,2006,30(4):313-316.

[4]王波.ARM的三种中断调试方法的探讨[J].微计算机信息,2006,22(2):130-131.

[5]周智俊.ARM调试系统的研究与实现[D].成都:电子科技大学,2008.

[6]杨东.ARM嵌入式系统异常调试的研究和实现[D].上海:上海交通大学,2009.

[7]Advanced RISC Machines Ltd.ARM9TDMI technical reference manual[EB/OL].[2011-09-01].http://infocenter.arm.com/help/index.jsp.

[8]Advanced RISC Machines Ltd.ARM920T technical reference manual[EB/OL].[2011-09-01].http://infocenter.arm.com/help/index.jsp.

[9]Samsung Electronics Co Ltd.S3C2440A 32-Bit CMOS microcontroller user's manual[S/OL].[2011-09-01].http://www.samsungsemi.com.

[10]OPEN-JTAG开发小组.ARM JTAG调试原理[EB/OL].[2011-09-01].http://www.hjtag.com/download.html.

[11]陆晗,潘雪增,平玲娣.基于JTAG的ARM调试器实现[J].计算机应用与软件,2007,24(2):137-139.

[12]黄光红,洪一,耿锐,等.多处理器阵列的JTAG调试系统设计[J].计算机工程,2010,36(14):224-226.

[13]徐爱钧.IAR EWARM V5嵌入式系统应用编程与开发[M].北京:北京航空航天大学出版社,2009:310-383.

Debugging Technique for ARM Exception Programs Based on External RAM

YAO Mao-qun1,2,YE Han-neng2,ZHAO Wu-feng3,YAN Jia-ning4
(1.Qianjiang College,Hangzhou Normal University,Hangzhou 310012,China;2.College of Information Science and Engineering,Hangzhou Normal University,Hangzhou 310036,China;3.Deptment of Information Science and Electronic Engineering,Zhejiang University,Hangzhou 310027,China;4.Books Information Center,Zhejiang Medical College,Hangzhou 310053,China)

Based on the basic ideas of exception handling in ARM and the basic principles of debugging with JTAG,the principles and characteristics of different ARM program debugging techniques,which are based on exteranl RAM and for exception handling,were analysed in the paper.Comparing the applicability as well as merits and faults of various debugging techniques,with the commonly used ARM chips and integrated development tools in embedded system development,a new kind of debugging technique in the external RAM for ARM programs,which have exception handling codes,was proposed,and its effectiveness was verified by means of experiments.

exception handling;JTAG;external RAM;ARM;debugging technique;embedded system

TP391.4

A

1674-232X(2012)03-0275-05

10.3969/j.issn.1674-232X.2012.03.017

2011-11-22

姚茂群(1967-),女,教授,博士,主要从事数字集成电路设计、智能控制研究.E-Mail:yaomaoqun@163.com

猜你喜欢
指令调试向量
向量的分解
聚焦“向量与三角”创新题
ARINC661显控指令快速验证方法
基于航拍无人机的设计与调试
FOCAS功能在机床调试中的开发与应用
无线通信中频线路窄带临界调试法及其应用
杀毒软件中指令虚拟机的脆弱性分析
向量垂直在解析几何中的应用
调压柜的调试与试运行探讨
向量五种“变身” 玩转圆锥曲线