ARM开发和调试工具的使用 (IAR EWARM和H-JTAG/J-LINK)
上海工程技术大学 电子电气工程学院
目录
1 创建一个IAR工程………………………………………………… 3 2 编译和链接一个IAR工程………………………………………… 5 2.1 General Options设置…………………………………………… 5 2.2 C/C++ Compiler设置…………………………………………… 7 2.3 Linker设置……………………………………………………… 8 2.4 Output Converter设置………………………………………… 8 2.5 开始编译和链接并生成可下载的输出文件…………………… 10 3 使用C-SPY进行调试和分析……………………………………… 11 3.1 软件仿真调试(中断模拟)…………………………………… 11 3.2 使用H-JTAG仿真调试(RAM∕ROM)…………………………… 13 3.3 使用J-LINK仿真调试(RAM∕ROM)…………………………… 18 3.4 应用程序分析…………………………………………………… 19 4 将可执行二进制文件下载到片内FLASH………………………… 22 4.1 使用H-JTAG下载(H-Flasher) ……………………………… 22 4.2 使用J-LINK下载(J-Link ARM)……………………………… 23 4.3 使用CPU自带的ISP 功能下载………………………………… 24 4.4 使用CPU自带的IAP 功能下载………………………………… 24
1
5 附录一:IAR中的中断处理……………………………………… 25 5.1 向量IRQ中断(ARM7)………………………………………… 26 5.2 非向量IRQ中断(ARM7)……………………………………… 27 5.3 FIQ 中断(ARM7)……………………………………………… 27 6 附录二:IAR中C与汇编的混合编程…………………………… 28 6.1 C 语言本征函数………………………………………………… 28 6.2 汇编语言程序…………………………………………………… 28 6.3 内联汇编………………………………………………………… 29 7 附录三:H-JTAG和J-LINK的比较……………………………… 30 8 参考文献…………………………………………………………… 31
2
1 创建一个IAR工程
1.1 打开IAR开发环境
“开始”→“程序”→“IAR Systems”→“IAR Embedded Workbench for ARM 5.50 Evaluation”→“IAR Embedded Workbench”
1.2 新建一个工作区
这步可选,但最好新建一个专用的目录,用来存放自己工程文件, “File”→“New”→“Workspace”:.eww
1.3 新建一个IAR空工程
“Project”→“Create New Project”:.ewp
3
1.4 新建文件并保存
“File”→“New”→“File”
“File”→“Save”
1.5 为IAR工程添加已有文件 “Project”→“Add Files”
4
2 编译和链接一个IAR工程
在工作区窗口选中工程文件夹test-Debug,然后“Project”→“Options…”,弹出对话框:
2.1 General Option
选中该对话框左侧Category列表框中“General Option”,并对右侧对应的选项卡中的内容作以下设置: 选项卡 Target 设置 Core:ARM7TDMI-S/Cortex-M3 Device:NXP LPC21xx/ST STM32F10xxB Output Output File:Executable Output Directories:… Library Library low-level interface implementation: Configuration Semihosted
5
1 、目标板上MCU是LPC2103(ARM7TDMI):
2 、目标板上MCU是STM32(Cortex-M3):
6
2.2 C/C++ Compiler
1 、目标板上MCU是LPC2103(ARM7TDMI):
选中该对话框左侧Category列表框中“C/C++ Compiler”,并对右侧对应的选项卡中的内容作以下设置: 选项卡 Code Optimization Output 设置 Processor Mode:ARM 32-bit ARM指令集 16-bit Thumb指令集 Level:None(Best Debug Support)∕Low Generate Debug Information 2 、目标板上MCU是STM32(Cortex-M3):
选中该对话框左侧Category列表框中“C/C++ Compiler”,并对右侧对应的选项卡中的内容作以下设置:
选项卡 Code 设置 Processor Mode:/ Thumb-2指令集 Preprocessor Additional Include Directories: --$PROJ_DIR$\\..\\ --$PROJ_DIR$\\..\\..\\..\\Libraries\\CMSIS\\CM3\\CoreSupport --$PROJ_DIR$\\..\\..\\..\\Libraries\\CMSIS\\CM3\\DeviceSupport\\ST\\STM32F10x --$PROJ_DIR$\\..\\..\\..\\Libraries\\STM32F10x_StdPeriph_Driver\\inc Defined Symbol: --USE_STDPERIPH_DRIVER --STM32F10X_MD_VL --USE_STM32100B_EVAL Optimization Level:None(Best Debug Support)∕Low Output Generate Debug Information
7
2.3 Output Converter设置
选中该对话框左侧Category列表框中“Output Converter”,并对右侧对应的选项卡中的内容作以下设置: 选项卡 设置 Output Generate Additional Output(Override Default) Output Format:Intel Extended
2.4 Linker设置
1 、IAR EWARM 4且目标板上MCU是LPC2103(ARM7TDMI):
在工作区窗口选中工程文件夹test-Debug,然后“Project”→“Options…”,弹出对话框,并选中该对话框左侧Category列表框中“Linker”,对右侧对应的选项卡中的内容作以下设置: 选项卡 设置 Config Linker Configuration File:(Override Default) $PROJ_DIR$\\LPC2103_ROM.xcl List
Generate Linker Map File 8
2 、IAR EWARM 5且目标板上MCU是STM32(Cortex-M3):
在工作区窗口选中工程文件夹test-Debug,然后“Project”→“Options…”,弹出对话框,并选中该对话框左侧Category列表框中“Linker”,对右侧对应的选项卡中的内容作以下设置: 选项卡 设置 Config Linker Configuration File:(Override Default) $PROJ_DIR$\\stm32f10x_flash.icf List Generate Linker Map File
点击“Linker Configuration File”下“Edit…”按键,打开“Linker Configuration File Editor”对话框,选择不同的选项卡,可分别查看和设置中断向量表(Vector Table)、存储器地址分配(RAM和ROM)以及堆和栈的大小(Heap Size和Stack Size),具体设置如下图所示。
9
1 )中断向量表(Vector Table):
2 )存储器地址分配(RAM和ROM):
3 )堆和栈的大小(Heap Size和Stack Size):
2.5 开始编译和连接,并生成可下载的输出文件 “Project”→“Make”
10
3 使用C-SPY进行调试和分析
3.1 软件仿真调试 3.1.1 软件仿真调试设置
在工作区窗口选中工程文件夹test-Debug,然后“Project”→“Options…”,弹出对话框,并选中该对话框左侧Category列表框中“Debugger”,对右侧对应的选项卡中的内容作以下设置:
3.1.2 进入调试模式
设置完毕,点击菜单“Project”→“Download and Debug”,进入调试模式。 3.1.3 中断仿真
使用C-SPY模拟器可以在没有实际硬件的条件下进行中断仿真,以检测应用程序的逻辑性是否正确。
11
使用中断仿真系统(以定时器中断为例)一般按以下步骤进行: 1)编写中断仿真源程序(包括定时器初始化函数,定时器中断服务函数和定时器中断服务安装函数等),详见IAR HELP。
2)选择目标CPU并编译
在“Project”→“Options…”对话框中,选中该对话框左侧的Category列表框中“General Option”,并在右侧“Target”选项卡的“Device”选项中选择目标CPU。然后,编译工程。
3)选择软件仿真方式并进入调试模式
在“Project”→“Options…”对话框中,选中该对话框左侧的Category列表框中“Debugger”,并在其右侧“Setup”选项卡中的“Driver”选项选择Simulator。然后,单击
4)设置中断
单击下拉菜单“Simulator”→“Interrupt Setup”选项,弹出中断仿真配置对话框,并作如下配置:
按钮进入调试模式。
12
——First Activation:首次触发中断所需循环计数器周期数 ——Repeat Interval:中断重复间隔所需循环计数器周期数 ——Variance:发生时间的变化率,以重复间隔的百分比表示 ——Hold Time:中断等待被处理的保持时间,以周期为单位 ——Probability:中断发生的概率
5)打开中断日志窗口和强制中断窗口观察中断
单击下拉菜单“Simulator”→“Interrupt Log”选项,可打开中断日志窗口查看中断产生情况。
单击下拉菜单“Simulator”→“Forced Interrupt”选项,可打开强制中断窗口,选中一个中断如IRQ,单击该窗口的“Trigger”按钮,可以立即强制执行该中断,这种方法对想检查中断逻辑和中断程序非常有用。
中断仿真系统默认为打开状态,如果不需要使用中断仿真系统,可以将其关闭以提高仿真速度。
3.2 H-JTAG仿真调试 3.2.1 H-JTAG仿真调试设置
在工作区窗口选中项目文件夹test-Debug,然后“Project”→“Options…”,弹出对话框,并选中该对话框左侧Category列表框中“Debugger”,对右侧对应的选项卡中的内容作以下设置:
13
14
使用硬件仿真器(如H-JTAG或J-LINK)调试程序,根据将程序运行的空间不同,可分为在RAM中调试和在ROM中调试两种: ★ 在RAM中调试:
在RAM中调试,是指被调试程序在片内RAM中运行
在工作区窗口选中项目文件夹test-Debug,然后“Project”→“Options…”,弹出对话框,并选中该对话框左侧Category列表框中“Linker”,对右侧对应的选项卡中的内容作以下设置: 选项卡 设置 Config Linker Configuration File:(Override Default) $$PROJ_DIR$\\LPC2131_RAM.icf ★ 在ROM中调试: 在ROM中调试,是指被调试程序在片内ROM中运行
在工作区窗口选中项目文件夹test-Debug,然后“Project”→“Options…”,弹出对话框,并选中该对话框左侧Category列表框中“Linker”,对右侧对应的选项卡中的内容作以下设置: 选项卡 Config 设置 Linker Configuration File:(Override Default) $PROJ_DIR$\\LPC2131_FLASH.icf 在工作区窗口选中项目文件夹test-Debug,然后“Project”→“Options…”,弹出对话框,并选中该对话框左侧Category列表框中“Debugger”,对右侧对应的选项卡中的内容作以下设置: 选项卡 设置 Download verify download use flash loader 15
3.2.2 进入调试模式
设置完毕,打开调试代理“开始”→“程序”→“H-JTAG”→“H-JTAG”。
打开H-JTAG调试代理后,并点击菜单“Project”→“Download and Debug”,进入调试模式。 3.2.3 程序执行方式
进入调试模式后,可选择单步执行或全速执行方式来调试程序,它们的主要介绍如下:
●单步执行
Step Over【F10】或Step Into【F11】(进入函数详细跟踪) ●全速执行
全速执行直至一个断点或程序末尾【F5】 ★全速执行中的断点设置:
ARM7体系架构可设置两个硬件断点和无限个软件断点。当使用H-JTAG仿真器在RAM中调试应用程序时,要使用软件断点;当使用H-JTAG仿真器在ROM中调试应用程序时,要使用硬件断点;其中,一个硬件断点通常被保留用于单步运行,所以当使用H-JTAG仿真器在ROM中调试应用程序时,你只能设置一个(硬件)断点。
解决ROM调试硬件断点不足的办法之一是使用J-LINK仿真器。它在ROM中设置硬件断点就像在RAM中使用和设置软件断点一样。 3.2.4 调试观察窗口
在调试过程中,经常用到观察窗口,用来察看寄存器、存储器、变量和表达式等,这些窗口可以通过单击“View”下相应的下拉菜单得到。
●源程序窗口
16
●反汇编窗口 ●消息窗口
●寄存器窗口(“View”→“Register”)
●存储器窗口(“View”→“Memory”)
●调用堆栈窗口(“View”→“Call Stack”) 显示程序调试过程中函数调用的列表
17
●局部变量窗口(“View”→“Locals”) 显示当前运行函数的局部变量和函数参数值 ●全局变量窗口(“View”→“Live”) 显示当前运行函数的全局变量
●自动变量窗口(“View”→“Auto”) 自动显示与当前执行语句相关变量和表达式的值 ●观察窗口(“View”→“Watch”)
可输入变量和表达式并随程序执行而不断更新显示 ●输入输出终端窗口(“View”→“Terminal I/O”) 利用该窗口和stdin/stdout库函数,在没有实际硬件支持的条件下实现输入∕输出操作
3.3 J-LINK仿真调试(J-LINK)
在工作区窗口选中项目文件夹test-Debug,然后“Project”→“Options…”,弹出对话框,并选中该对话框左侧Category列表框中“Debugger”,对右侧对应的选项卡中的内容作以下设置:
18
★ 在RAM中调试:
与使用H-JTAG仿真器在RAM中调试的设置步骤相同。 ★ 在ROM中调试:
与使用H-JTAG仿真器在RAM中调试的设置步骤相同。
3.4 应用程序分析
C-SPY具有函数剖析和代码覆盖功能,用于对应用程序进行分析以确定其运行中的瓶颈问题。
19
3.4.1 函数剖析
C-SPY剖析器可以找出程序运行过程中对一个给定激发信号耗时最长的函数,从而能集中精力研究如何更好地对这些函数进行优化,如在编译时选择速度优化模式,讲函数移到能更高效寻址的存储器中运行等。
使用C-SPY剖析器前,必须对用户所在工程在“Project”→“Options…”对话框中按下图进行配置: 选项 C/C++ Compiler Linker Output Including debug information in output 选项卡 设置 Output Generate debug information Debugger Plugins Profiling 然后,进入调试模式并单击下拉菜单“View”→“Profiling”选项,打开剖析窗口,单击自动刷新剖析记录。
接着,启动程序全速执行,当程序运行到一个断点或程序结束时,窗口将显示对当前所有函数运行的剖析记录结果,如下图所示。
按钮开启剖析器同时单击
按钮开启
20
3.4.2 代码覆盖
C-SPY模拟器具有代码覆盖功能,来帮助用户确认是否所有程序代码都得到执行,这对于鉴别程序代码中是否存在不能被执行的部分特别有用。
使用C-SPY剖析器前,必须对用户所在工程在“Project”→“Options…”对话框中按下图进行配置: 选项 C/C++ Compiler Linker Output Including debug information in output 选项卡 设置 Output Generate debug information Debugger Plugins Code Coverage 然后,进入调试模式,并单击下拉菜单“View”→“Code Coverage”选项,打开代码覆盖窗口,其中显示是当前代码覆盖分析状态报告。单击
按钮开启代码覆盖器,同时单击
按钮开启自动
刷新代码覆盖记录。启动程序执行,代码覆盖分析报告如下图所示。
21
4 将可执行二进制文件下载到片内FLASH
4.1 使用H-JTAG下载(H-Flasher)
将H-JTAG分别连接到宿主机和目标机,并打开H-Flasher软件 4.1.1 芯片选型
Flash Selection:…
4.1.2 擦除芯片
Programming:Erase
22
4.1.3 选择下载文件及其类型并对芯片编程
Programming:Program
4.2 使用J-Link下载(J-LINK ARM)
将J-LINK分别连接到宿主机和目标机,并打开J-LINK ARM软件 4.2.1 芯片选型
“Options”→“Project Setting” 4.2.2 擦除芯片
“Traget”→“Erase Chip” 4.2.3 选择下载文件并对芯片编程
“File”→“Open”
“Traget”→“Program & Verify”
23
4.3 使用CPU自带的ISP功能下载(Flash Magic)
使用串口线将目标板的串口与宿主机的串口相连接,在宿主机端打开Flash Magic软件,设置相应的参数,如串口的通信速度(不能过高,过高可能出错,一般9600bps)、目标芯片型号(LPC…)、目标板晶振频率等。
然后复位目标机,并将复位后的目标机(LPC21xx)的P0.14引脚置低电平,从而进入ISP(在系统编程)模式。
选择需要下载的二进制可执行文件,按照先擦除整个芯片,然后编程的顺序,开始执行。
4.4 使用CPU自带的IAP功能下载
使用在应用编程技术(即IAP),在用户程序运行时对Flash进行擦除和/或编程操作,实现数据的存储和固件的现场升级。
24
5 附录一:IAR中的中断处理
IAR C/C++编译器支持ARM核的IRQ中断、FIQ快中断和SWI软件中断,可以直接采用C语言编写中断函数。中断函数必须采用ARM模式编译。
中断函数用关键字__irq __arm、__fiq __arm和__swi __arm来声明,如声明IRQ中断函数如下:__irq __arm void IRQ_Handler (void),又如声明FIQ中断函数如下:__fiq __arm void FIQ_Handler (void)。
每个中断函数都在异常向量表中有一个相关向量地址,所有中断函数必须安装到向量表中,这可以通过汇编语言编写的系统启动文件cstartup.s来实现。标准运行库对异常向量表的处理是跳转到一个预定义的无限循环函数,
启动文件cstartup.s定义如下异常函数名,并通过标准运行库中的异常向量引用:
Undefined_Handler SWI_Handler Prefetch_Handler Abort_Handler IRQ_Handler FIQ_Handler
用户只要定义一个与上面同名的异常函数,就可建立自己的异常句柄,如采用如下语句定义一个IRQ中断函数:
__irq __arm void IRQ_Handler(void){ … }
25
当异常发生后,ARM处理器硬件自动执行如下操作 ●将CPSR复制到相应模式下的SPSR_xxx中
●改变CPSR进入相应的异常模式(工作模式位【异常类型决定】、工作状态位【ARM状态】和F/I位【禁相应的中断】)
●将下一条指令地址(PC-4)存入相应模式下的LR_xxx中 ●强制PC从相应异常向量地址取下一条指令执行(通常是跳转指令),从而跳转到相应的异常处理程序执行
当异常处理结束后退出异常处理程序前,应当执行如下操作: ●将相应异常模式下的SPSR_xxx复制到CPSR
●将相应异常模式下的LR__xxx减去一个常量之后复制到PC,跳转到被中断的用户程序。 5.1 向量IRQ中断(ARM7)
如果使能IRQ中断和向量IRQ中断,当中断发生时,中断处理将进入向量IRQ方式。
典型的向量IRQ中断处理流程图如下: ③PC-4→LR_IRQ ④(0x18)→PC TIMER0中断服务函数(C) 中断向量表 0x18 b IRQ_Handler
26
中断产生 向量IRQ中断处理程序(C) __irq __arm ARM处理器 ①CPSR→SPSR_IRQ ②CPSR(MOD/T/I)↑↓ void irq_handler(void){ //读取向量IRQ地址寄存器 //执行相应的中断服务函数 } void TIMER0_ISR(){ } 5.2 非向量IRQ中断(ARM7)
如果使能IRQ中断同时禁用向量IRQ中断,当中断发生时,中断处理将进入非向量IRQ方式。
典型的非向量IRQ中断处理流程图如下: 中断产生 非向量IRQ中断处理程序(ASM/C) IRQ_Handler ARM处理器 ①CPSR→SPSR_IRQ ②CPSR(MOD/T/I)↑↓ ③PC-4→LR_IRQ SUB LR,LR,#4 STMFD SP!,{R0-R12,LR} ;确定外部中断源 ;计算对应的中断服务地址 ;跳转中断服务处理C程序 LDMFD SP!,{R0-R12,PC}^ ④(0x18)→PC
5.3 FIQ中断(ARM7) 0x18 b IRQ_Handler 0x1C b FIQ_Handler 中断向量表 END 0x0 b Reset_Handler 0x14 b . TIMER0中断服务函数(C) void TIMER0_ISR(){ } 如果使能FIQ中断,当中断发生时,中断处理将进入FIQ方式。 典型的FIQ中断处理流程与向量IRQ中断处理流程类似,只是将向量IRQ中断处理函数关键字__irq改成FIQ中断处理函数关键字__fiq。
一般地,为了提高响应速度,只有一个中断源被分配为FIQ。
27
6 附录二:IAR中C与汇编的混合编程
IAR C/C++编译器提供了3种C/C++与汇编混合编程方法:C语言本征函数、汇编语言程序和内联汇编。在实际使用中,最好避免使用内联汇编,如果没有合适的本征函数建议采用汇编语言程序代替内联汇编,因为调用汇编语言函数不会使系统性能降低太多。 6.1 C语言本征函数
IAR C/C++编译器提供了少量C语言编写的本征函数。采用本征函数可直接进行处理器底层操作而不需要采用汇编语言编程,这对于时序要求非常严格的场合十分有用。
本征函数被编译成内联汇编代码,如单条指令或一段指令序列。与使用内联汇编相比,本征函数的优点在于编译器具有完整信息,可实现指令序列和工作寄存器及变量之间的无缝接口。编译器还可以对本征函数的指令序列进行优化,而对内联汇编则无法优化
本征函数名以2个下划线开始,使用时应先用#include预处理语句将头文件intrinsics.h包含到源程序文件中,
IAR中常用的本征函数有: __disable_irq()和__enable_irq() __disable_fiq()和__enable_fiq()
__disable_interrupt()和__enable_interrupt() __get_interrupt_state()和__set_interrupt_state(s) __no_operation() 6.2 汇编语言程序
采用汇编语言程序和C语言程序相互调用时,需要增加一些额外负担,并要遵守一定的调用规则(ATPCS),解决如参数传递、全局变量访问等问题。
28
6.3 内联汇编
采用内联汇编可使用asm关键字直接在C/C++源程序中插入汇编代码,但内联汇编指令序列与C/C++源程序生成的周边代码之间没有很好定义的接口,而且内联汇编使用时还有种种。
29
7 附录三:H-JTAG和J-LINK的区别
类型 结构 速度 成本 逻辑协议 物理接口 软件兼容性 H-JTAG 片上调试(OCD) 74LS244(电平转换) 一般 较低 RDI 并口 J-LINK 片上调试(OCD) 较快 较高 RDI等 USB或网口 在有些软件(ADS)下,在多种软件下,都可以不能在FALSH中调试 在FALSH中调试 硬件兼容性 可调试的CPU种类有限 可调试的CPU种类很多 30
8 参考文献
[1] IAR System. IAR EWARM V5 Help [OL].
[2] IAR System. IAR EWARM V5 IDE User Guide [OL].
[3] 徐爱钧. IAR EWARM V5 嵌入式系统应用编程与开发 [M].北京:
北京航空航天大学出版社,2009.
[4] 唐思超. 嵌入式系统软件设计实战 [M].北京:北京航空航天大
学出版社,2010.
[5] 喻金钱,喻斌. STM32F系列ARM Cortex-M3核微控制器开发与
应用 [M].北京:清华大学出版社,2011.
[6] SEGGER Microcontroller. J-Link∕J-Trace ARM Manual [OL]. [7] IAR中国. IAR J-Link仿真器使用说明 [OL].
31
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- baomayou.com 版权所有 赣ICP备2024042794号-6
违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务