1、IAR使用手册ARM开发和调试工具的使用(IAR EWARM和H-JTAG/J-LINK)上海工程技术大学电子电气工程学院1 创建一个IAR工程 32 编译和链接一个IAR工程 52.1 General Options设置 52.2 C/C+ Compiler设置 72.3 Linker设置 82.4 Output Converter设置 82.5 开始编译和链接并生成可下载的输出文件 103 使用C-SPY进行调试和分析 113.1 软件仿真调试(中断模拟) 113.2 使用H-JTAG仿真调试(RAMROM) 133.3 使用J-LINK仿真调试(RAMROM) 183.4 应用程序分析
2、194 将可执行二进制文件下载到片内FLASH 224.1 使用H-JTAG下载(H-Flasher) 224.2 使用J-LINK下载(J-Link ARM) 234.3 使用CPU自带的ISP 功能下载 244.4 使用CPU自带的IAP 功能下载 245 附录一:IAR中的中断处理 255.1 向量IRQ中断(ARM7) 265.2 非向量IRQ中断(ARM7) 275.3 FIQ 中断(ARM7) 276 附录二:IAR中C与汇编的混合编程 286.1 C 语言本征函数 286.2 汇编语言程序 286.3 内联汇编 297 附录三:H-JTAG和J-LINK的比较 308 参考文献
3、311 创建一个IAR工程1.1 打开IAR开发环境“开始”“程序”“IAR Systems”“IAR Embedded Workbench for ARM 5.50 Evaluation”“IAR Embedded Workbench”1.2 新建一个工作区这步可选,但最好新建一个专用的目录,用来存放自己工程文件, “File”“New”“Workspace”:.eww1.3 新建一个IAR空工程 “Project”“Create New Project”:.ewp1.4 新建文件并保存 “File”“New”“File”“File”“Save”1.5 为IAR工程添加已有文件 “Proje
4、ct”“Add Files”2 编译和链接一个IAR工程在工作区窗口选中工程文件夹test-Debug,然后“Project”“Options”,弹出对话框:2.1 General Option选中该对话框左侧Category列表框中“General Option”,并对右侧对应的选项卡中的内容作以下设置:选项卡设置TargetCore:ARM7TDMI-S/Cortex-M3Device:NXP LPC21xx/ST STM32F10xxBOutputOutput Output Directories:Library ConfigurationLibrary low-level interf
5、ace implementation:Semihosted1 、目标板上MCU是LPC2103(ARM7TDMI):2 、目标板上MCU是STM32(Cortex-M3):2.2 C/C+ Compiler1 、目标板上MCU是LPC2103(ARM7TDMI):选中该对话框左侧Category列表框中“C/C+ Compiler”,并对右侧对应的选项卡中的内容作以下设置:选项卡设置CodeProcessor Mode:ARMOptimizationLevel:None(Best Debug Support)LowOutputGenerate Debug Information2 、目标板上M
6、CU是STM32(Cortex-M3):选中该对话框左侧Category列表框中“C/C+ Compiler”,并对右侧对应的选项卡中的内容作以下设置:选项卡设置CodeProcessor Mode:/PreprocessorAdditional Include Directories:-$PROJ_DIR$.-$PROJ_DIR$.LibrariesCMSISCM3CoreSupport-$PROJ_DIR$.LibrariesCMSISCM3DeviceSupportSTSTM32F10x-$PROJ_DIR$.LibrariesSTM32F10x_StdPeriph_DriverincD
7、efined Symbol:-USE_STDPERIPH_DRIVER-STM32F10X_MD_VL-USE_STM32100B_EVALOptimizationLevel:None(Best Debug Support)LowOutputGenerate Debug Information2.3 Output Converter设置选中该对话框左侧Category列表框中“Output Converter”,并对右侧对应的选项卡中的内容作以下设置:选项卡设置OutputGenerate Additional Output(Override Default)Output Format:Int
8、el Extended2.4 Linker设置1 、IAR EWARM 4且目标板上MCU是LPC2103(ARM7TDMI):在工作区窗口选中工程文件夹test-Debug,然后“Project”“Options”,弹出对话框,并选中该对话框左侧Category列表框中“Linker”,对右侧对应的选项卡中的内容作以下设置:选项卡设置ConfigLinker Configuration File:(Override Default)$PROJ_DIR$LPC2103_ROM.xclListGenerate Linker Map File2 、IAR EWARM 5且目标板上MCU是STM32
9、(Cortex-M3):在工作区窗口选中工程文件夹test-Debug,然后“Project”“Options”,弹出对话框,并选中该对话框左侧Category列表框中“Linker”,对右侧对应的选项卡中的内容作以下设置:选项卡设置ConfigLinker Configuration File:(Override Default)$PROJ_DIR$stm32f10x_flash.icfListGenerate Linker Map File点击“Linker Configuration File”下“Edit”按键,打开“Linker Configuration ”对话框,选择不同的选项卡
10、,可分别查看和设置中断向量表(Vector Table)、存储器地址分配(RAM和ROM)以及堆和栈的大小(Heap Size和Stack Size),具体设置如下图所示。1 )中断向量表(Vector Table):2 )存储器地址分配(RAM和ROM):3 )堆和栈的大小(Heap Size和Stack Size):2.5 开始编译和连接,并生成可下载的输出文件 “Project”“Make”3 使用C-SPY进行调试和分析3.1 软件仿真调试3.1.1 软件仿真调试设置在工作区窗口选中工程文件夹test-Debug,然后“Project”“Options”,弹出对话框,并选中该对话框左侧
11、Category列表框中“Debugger”,对右侧对应的选项卡中的内容作以下设置:3.1.2 进入调试模式设置完毕,点击菜单“Project”“Download and Debug”,进入调试模式。3.1.3 中断仿真使用C-SPY模拟器可以在没有实际硬件的条件下进行中断仿真,以检测应用程序的逻辑性是否正确。使用中断仿真系统(以定时器中断为例)一般按以下步骤进行:1)编写中断仿真源程序(包括定时器初始化函数,定时器中断服务函数和定时器中断服务安装函数等),详见IAR HELP。2)选择目标CPU并编译在“Project”“Options”对话框中,选中该对话框左侧的Category列表框中“
12、General Option”,并在右侧“Target”选项卡的“Device”选项中选择目标CPU。然后,编译工程。3)选择软件仿真方式并进入调试模式在“Project”“Options”对话框中,选中该对话框左侧的Category列表框中“Debugger”,并在其右侧“Setup”选项卡中的“Driver”选项选择Simulator。然后,单击按钮进入调试模式。4)设置中断单击下拉菜单“Simulator”“Interrupt Setup”选项,弹出中断仿真配置对话框,并作如下配置:First Activation:首次触发中断所需循环计数器周期数Repeat Interval:中断重复
13、间隔所需循环计数器周期数Variance:发生时间的变化率,以重复间隔的百分比表示Hold Time:中断等待被处理的保持时间,以周期为单位Probability:中断发生的概率5)打开中断日志窗口和强制中断窗口观察中断单击下拉菜单“Simulator”“Interrupt Log”选项,可打开中断日志窗口查看中断产生情况。单击下拉菜单“Simulator”“Forced Interrupt”选项,可打开强制中断窗口,选中一个中断如IRQ,单击该窗口的“Trigger”按钮,可以立即强制执行该中断,这种方法对想检查中断逻辑和中断程序非常有用。中断仿真系统默认为打开状态,如果不需要使用中断仿真系
14、统,可以将其关闭以提高仿真速度。3.2 H-JTAG仿真调试3.2.1 H-JTAG仿真调试设置在工作区窗口选中项目文件夹test-Debug,然后“Project”“Options”,弹出对话框,并选中该对话框左侧Category列表框中“Debugger”,对右侧对应的选项卡中的内容作以下设置:使用硬件仿真器(如H-JTAG或J-LINK)调试程序,根据将程序运行的空间不同,可分为在RAM中调试和在ROM中调试两种: 在RAM中调试:在RAM中调试,是指被调试程序在片内RAM中运行在工作区窗口选中项目文件夹test-Debug,然后“Project”“Options”,弹出对话框,并选中该
15、对话框左侧Category列表框中“Linker”,对右侧对应的选项卡中的内容作以下设置:选项卡设置ConfigLinker Configuration File:(Override Default)$PROJ_DIR$LPC2131_RAM.icf 在ROM中调试:在ROM中调试,是指被调试程序在片内ROM中运行在工作区窗口选中项目文件夹test-Debug,然后“Project”“Options”,弹出对话框,并选中该对话框左侧Category列表框中“Linker”,对右侧对应的选项卡中的内容作以下设置:选项卡设置ConfigLinker Configuration File:(Over
16、ride Default)$PROJ_DIR$LPC2131_FLASH.icf在工作区窗口选中项目文件夹test-Debug,然后“Project”“Options”,弹出对话框,并选中该对话框左侧Category列表框中“Debugger”,对右侧对应的选项卡中的内容作以下设置:选项卡设置Downloadverify downloaduse flash loader3.2.2 进入调试模式设置完毕,打开调试代理“开始”“程序”“H-JTAG”“H-JTAG”。打开H-JTAG调试代理后,并点击菜单“Project”“Download and Debug”,进入调试模式。3.2.3 程序执行
17、方式进入调试模式后,可选择单步执行或全速执行方式来调试程序,它们的主要介绍如下:单步执行Step Over【F10】或Step Into【F11】(进入函数详细跟踪)全速执行全速执行直至一个断点或程序末尾【F5】全速执行中的断点设置:ARM7体系架构可设置两个硬件断点和无限个软件断点。当使用H-JTAG仿真器在RAM中调试应用程序时,要使用软件断点;当使用H-JTAG仿真器在ROM中调试应用程序时,要使用硬件断点;其中,一个硬件断点通常被保留用于单步运行,所以当使用H-JTAG仿真器在ROM中调试应用程序时,你只能设置一个(硬件)断点。解决ROM调试硬件断点不足的办法之一是使用J-LINK仿真
18、器。它在ROM中设置硬件断点就像在RAM中使用和设置软件断点一样。3.2.4 调试观察窗口在调试过程中,经常用到观察窗口,用来察看寄存器、存储器、变量和表达式等,这些窗口可以通过单击“View”下相应的下拉菜单得到。源程序窗口反汇编窗口消息窗口寄存器窗口(“View”“Register”) 存储器窗口(“View”“Memory”) 调用堆栈窗口(“View”“Call Stack”) 显示程序调试过程中函数调用的列表局部变量窗口(“View”“Locals”) 显示当前运行函数的局部变量和函数参数值全局变量窗口(“View”“Live”) 显示当前运行函数的全局变量自动变量窗口(“View”
19、“Auto”) 自动显示与当前执行语句相关变量和表达式的值观察窗口(“View”“Watch”) 可输入变量和表达式并随程序执行而不断更新显示输入输出终端窗口(“View”“Terminal I/O”) 利用该窗口和stdin/stdout库函数,在没有实际硬件支持的条件下实现输入输出操作3.3 J-LINK仿真调试(J-LINK)在工作区窗口选中项目文件夹test-Debug,然后“Project”“Options”,弹出对话框,并选中该对话框左侧Category列表框中“Debugger”,对右侧对应的选项卡中的内容作以下设置: 在RAM中调试: 与使用H-JTAG仿真器在RAM中调试的设
20、置步骤相同。 在ROM中调试:与使用H-JTAG仿真器在RAM中调试的设置步骤相同。3.4 应用程序分析 C-SPY具有函数剖析和代码覆盖功能,用于对应用程序进行分析以确定其运行中的瓶颈问题。3.4.1 函数剖析C-SPY剖析器可以找出程序运行过程中对一个给定激发信号耗时最长的函数,从而能集中精力研究如何更好地对这些函数进行优化,如在编译时选择速度优化模式,讲函数移到能更高效寻址的存储器中运行等。使用C-SPY剖析器前,必须对用户所在工程在“Project”“Options”对话框中按下图进行配置:选项选项卡设置C/C+CompilerOutputGenerate debug informat
21、ionLinkerOutputIncluding debug information in outputDebuggerPluginsProfiling然后,进入调试模式并单击下拉菜单“View”“Profiling”选项,打开剖析窗口,单击按钮开启剖析器同时单击按钮开启自动刷新剖析记录。接着,启动程序全速执行,当程序运行到一个断点或程序结束时,窗口将显示对当前所有函数运行的剖析记录结果,如下图所示。3.4.2 代码覆盖C-SPY模拟器具有代码覆盖功能,来帮助用户确认是否所有程序代码都得到执行,这对于鉴别程序代码中是否存在不能被执行的部分特别有用。使用C-SPY剖析器前,必须对用户所在工程在“
22、Project”“Options”对话框中按下图进行配置:选项选项卡设置C/C+CompilerOutputGenerate debug informationLinkerOutputIncluding debug information in outputDebuggerPluginsCode Coverage然后,进入调试模式,并单击下拉菜单“View”“Code Coverage”选项,打开代码覆盖窗口,其中显示是当前代码覆盖分析状态报告。单击按钮开启代码覆盖器,同时单击按钮开启自动刷新代码覆盖记录。启动程序执行,代码覆盖分析报告如下图所示。4 将可执行二进制文件下载到片内FLASH4.
23、1 使用H-JTAG下载(H-Flasher) 将H-JTAG分别连接到宿主机和目标机,并打开H-Flasher软件4.1.1 芯片选型Flash Selection:4.1.2 擦除芯片Programming:Erase4.1.3 选择下载文件及其类型并对芯片编程Programming:Program4.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 选择下载文件并对芯片编程“F
24、ile”“Open” “Traget”“Program & Verify”4.3 使用CPU自带的ISP功能下载(Flash Magic)使用串口线将目标板的串口与宿主机的串口相连接,在宿主机端打开Flash Magic软件,设置相应的参数,如串口的通信速度(不能过高,过高可能出错,一般9600bps)、目标芯片型号(LPC)、目标板晶振频率等。然后复位目标机,并将复位后的目标机(LPC21xx)的P0.14引脚置低电平,从而进入ISP(在系统编程)模式。选择需要下载的二进制可执行文件,按照先擦除整个芯片,然后编程的顺序,开始执行。4.4 使用CPU自带的IAP功能下载 使用在应用编程技术(即
25、IAP),在用户程序运行时对Flash进行擦除和/或编程操作,实现数据的存储和固件的现场升级。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)。每个中断函数都在异常向量表中有一个相关向量地址,所有中断函数必
26、须安装到向量表中,这可以通过汇编语言编写的系统启动文件cstartup.s来实现。标准运行库对异常向量表的处理是跳转到一个预定义的无限循环函数,启动文件cstartup.s定义如下异常函数名,并通过标准运行库中的异常向量引用:Undefined_HandlerSWI_HandlerPrefetch_HandlerAbort_HandlerIRQ_HandlerFIQ_Handler用户只要定义一个与上面同名的异常函数,就可建立自己的异常句柄,如采用如下语句定义一个IRQ中断函数:_irq _arm void IRQ_Handler(void) 当异常发生后,ARM处理器硬件自动执行如下操作将C
27、PSR复制到相应模式下的SPSR_xxx中改变CPSR进入相应的异常模式(工作模式位【异常类型决定】、工作状态位【ARM状态】和F/I位【禁相应的中断】)将下一条指令地址(PC-4)存入相应模式下的LR_xxx中强制PC从相应异常向量地址取下一条指令执行(通常是跳转指令),从而跳转到相应的异常处理程序执行当异常处理结束后退出异常处理程序前,应当执行如下操作:将相应异常模式下的SPSR_xxx复制到CPSR将相应异常模式下的LR_xxx减去一个常量之后复制到PC,跳转到被中断的用户程序。5.1 向量IRQ中断(ARM7)如果使能IRQ中断和向量IRQ中断,当中断发生时,中断处理将进入向量IRQ方
28、式。典型的向量IRQ中断处理流程图如下:5.2 非向量IRQ中断(ARM7)如果使能IRQ中断同时禁用向量IRQ中断,当中断发生时,中断处理将进入非向量IRQ方式。典型的非向量IRQ中断处理流程图如下:5.3 FIQ中断(ARM7)如果使能FIQ中断,当中断发生时,中断处理将进入FIQ方式。典型的FIQ中断处理流程与向量IRQ中断处理流程类似,只是将向量IRQ中断处理函数关键字_irq改成FIQ中断处理函数关键字_fiq。一般地,为了提高响应速度,只有一个中断源被分配为FIQ。6 附录二:IAR中C与汇编的混合编程IAR C/C+编译器提供了3种C/C+与汇编混合编程方法:C语言本征函数、汇编语言程序和内联汇编。在实际使用中,最好避免使用内联汇编,如果没有合适的本征函数建议采用汇编语言程序代替内联汇编,因为调用汇编语言函数不会使系统性能降低太多。6.1 C语言本征函数IAR C/C+编译器提供了少量C语言编写的本征函数。采用本征函数可直接进行处理器底层操作而不需要采用汇编语言编程,这对于时序要求非常严格的场合十分有用。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1