IAR使用手册Word文件下载.docx
《IAR使用手册Word文件下载.docx》由会员分享,可在线阅读,更多相关《IAR使用手册Word文件下载.docx(31页珍藏版)》请在冰点文库上搜索。
IAR中C与汇编的混合编程……………………………28
6.1C语言本征函数…………………………………………………28
6.2汇编语言程序……………………………………………………28
6.3内联汇编…………………………………………………………29
7附录三:
H-JTAG和J-LINK的比较………………………………30
8参考文献……………………………………………………………31
1创建一个IAR工程
1.1打开IAR开发环境
“开始”→“程序”→“IARSystems”→“IAREmbeddedWorkbenchforARM5.50Evaluation”→“IAREmbeddedWorkbench”
1.2新建一个工作区
这步可选,但最好新建一个专用的目录,用来存放自己工程文件,“File”→“New”→“Workspace”:
.eww
1.3新建一个IAR空工程
“Project”→“CreateNewProject”:
.ewp
1.4新建文件并保存
“File”→“New”→“File”
“File”→“Save”
1.5为IAR工程添加已有文件
“Project”→“AddFiles”
2编译和链接一个IAR工程
在工作区窗口选中工程文件夹test-Debug,然后“Project”→“Options…”,弹出对话框:
2.1GeneralOption
选中该对话框左侧Category列表框中“GeneralOption”,并对右侧对应的选项卡中的内容作以下设置:
选项卡
设置
Target
Core:
ARM7TDMI-S/Cortex-M3
Device:
NXPLPC21xx/STSTM32F10xxB
Output
Output
OutputDirectories:
…
LibraryConfiguration
Librarylow-levelinterfaceimplementation:
Semihosted
1、目标板上MCU是LPC2103(ARM7TDMI):
2、目标板上MCU是STM32(Cortex-M3):
2.2C/C++Compiler
选中该对话框左侧Category列表框中“C/C++Compiler”,并对右侧对应的选项卡中的内容作以下设置:
Code
ProcessorMode:
ARM
Optimization
Level:
None(BestDebugSupport)∕Low
GenerateDebugInformation
/
Preprocessor
AdditionalIncludeDirectories:
--$PROJ_DIR$\..\
--$PROJ_DIR$\..\..\..\Libraries\CMSIS\CM3\CoreSupport
--$PROJ_DIR$\..\..\..\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x
--$PROJ_DIR$\..\..\..\Libraries\STM32F10x_StdPeriph_Driver\inc
DefinedSymbol:
--USE_STDPERIPH_DRIVER
--STM32F10X_MD_VL
--USE_STM32100B_EVAL
2.3OutputConverter设置
选中该对话框左侧Category列表框中“OutputConverter”,并对右侧对应的选项卡中的内容作以下设置:
GenerateAdditionalOutput(OverrideDefault)
OutputFormat:
IntelExtended
2.4Linker设置
1、IAREWARM4且目标板上MCU是LPC2103(ARM7TDMI):
在工作区窗口选中工程文件夹test-Debug,然后“Project”→“Options…”,弹出对话框,并选中该对话框左侧Category列表框中“Linker”,对右侧对应的选项卡中的内容作以下设置:
Config
LinkerConfigurationFile:
(OverrideDefault)
$PROJ_DIR$\LPC2103_ROM.xcl
List
GenerateLinkerMapFile
2、IAREWARM5且目标板上MCU是STM32(Cortex-M3):
$PROJ_DIR$\stm32f10x_flash.icf
点击“LinkerConfigurationFile”下“Edit…”按键,打开“LinkerConfiguration”对话框,选择不同的选项卡,可分别查看和设置中断向量表(VectorTable)、存储器地址分配(RAM和ROM)以及堆和栈的大小(HeapSize和StackSize),具体设置如下图所示。
1)中断向量表(VectorTable):
2)存储器地址分配(RAM和ROM):
3)堆和栈的大小(HeapSize和StackSize):
2.5开始编译和连接,并生成可下载的输出文件
“Project”→“Make”
3使用C-SPY进行调试和分析
3.1软件仿真调试
3.1.1软件仿真调试设置
在工作区窗口选中工程文件夹test-Debug,然后“Project”→“Options…”,弹出对话框,并选中该对话框左侧Category列表框中“Debugger”,对右侧对应的选项卡中的内容作以下设置:
3.1.2进入调试模式
设置完毕,点击菜单“Project”→“DownloadandDebug”,进入调试模式。
3.1.3中断仿真
使用C-SPY模拟器可以在没有实际硬件的条件下进行中断仿真,以检测应用程序的逻辑性是否正确。
使用中断仿真系统(以定时器中断为例)一般按以下步骤进行:
1)编写中断仿真源程序(包括定时器初始化函数,定时器中断服务函数和定时器中断服务安装函数等),详见IARHELP。
2)选择目标CPU并编译
在“Project”→“Options…”对话框中,选中该对话框左侧的Category列表框中“GeneralOption”,并在右侧“Target”选项卡的“Device”选项中选择目标CPU。
然后,编译工程。
3)选择软件仿真方式并进入调试模式
在“Project”→“Options…”对话框中,选中该对话框左侧的Category列表框中“Debugger”,并在其右侧“Setup”选项卡中的“Driver”选项选择Simulator。
然后,单击
按钮进入调试模式。
4)设置中断
单击下拉菜单“Simulator”→“InterruptSetup”选项,弹出中断仿真配置对话框,并作如下配置:
——FirstActivation:
首次触发中断所需循环计数器周期数
——RepeatInterval:
中断重复间隔所需循环计数器周期数
——Variance:
发生时间的变化率,以重复间隔的百分比表示
——HoldTime:
中断等待被处理的保持时间,以周期为单位
——Probability:
中断发生的概率
5)打开中断日志窗口和强制中断窗口观察中断
单击下拉菜单“Simulator”→“InterruptLog”选项,可打开中断日志窗口查看中断产生情况。
单击下拉菜单“Simulator”→“ForcedInterrupt”选项,可打开强制中断窗口,选中一个中断如IRQ,单击该窗口的“Trigger”按钮,可以立即强制执行该中断,这种方法对想检查中断逻辑和中断程序非常有用。
中断仿真系统默认为打开状态,如果不需要使用中断仿真系统,可以将其关闭以提高仿真速度。
3.2H-JTAG仿真调试
3.2.1H-JTAG仿真调试设置
在工作区窗口选中项目文件夹test-Debug,然后“Project”→“Options…”,弹出对话框,并选中该对话框左侧Category列表框中“Debugger”,对右侧对应的选项卡中的内容作以下设置:
使用硬件仿真器(如H-JTAG或J-LINK)调试程序,根据将程序运行的空间不同,可分为在RAM中调试和在ROM中调试两种:
★在RAM中调试:
在RAM中调试,是指被调试程序在片内RAM中运行
在工作区窗口选中项目文件夹test-Debug,然后“Project”→“Options…”,弹出对话框,并选中该对话框左侧Category列表框中“Linker”,对右侧对应的选项卡中的内容作以下设置:
$$PROJ_DIR$\LPC2131_RAM.icf
★在ROM中调试:
在ROM中调试,是指被调试程序在片内ROM中运行
$PROJ_DIR$\LPC2131_FLASH.icf
Download
verifydownload
useflashloader
3.2.2进入调试模式
设置完毕,打开调试代理“开始”→“程序”→“H-JTAG”→“H-JTAG”。
打开H-JTAG调试代理后,并点击菜单“Project”→“DownloadandDebug”,进入调试模式。
3.2.3程序执行方式
进入调试模式后,可选择单步执行或全速执行方式来调试程序,它们的主要介绍如下:
●单步执行
StepOver【F10】或StepInto【F11】
(进入函数详细跟踪)
●全速执行
全速执行直至一个断点或程序末尾【F5】
★全速执行中的断点设置:
ARM7体系架构可设置两个硬件断点和无限个软件断点。
当使用H-JTAG仿真器在RAM中调试应用程序时,要使用软件断点;
当使用H-JTAG仿真器在ROM中调试应用程序时,要使用硬件断点;
其中,一个硬件断点通常被保留用于单步运行,所以当使用H-JTAG仿真器在ROM中调试应用程序时,你只能设置一个(硬件)断点。
解决ROM调试硬件断点不足的办法之一是使用J-LINK仿真器。
它在ROM中设置硬件断点就像在RAM中使用和设置软件断点一样。
3.2.4调试观察窗口
在调试过程中,经常用到观察窗口,用来察看寄存器、存储器、变量和表达式等,这些窗口可以通过单击“View”下相应的下拉菜单得到。
●源程序窗口
●反汇编窗口
●消息窗口
●寄存器窗口(“View”→“Register”)
●存储器窗口(“View”→“Memory”)
●调用堆栈窗口(“View”→“CallStack”)
显示程序调试过程中函数调用的列表
●局部变量窗口(“View”→“Locals”)
显示当前运行函数的局部变量和函数参数值
●全局变量窗口(“View”→“Live”)
显示当前运行函数的全局变量
●自动变量窗口(“View”→“Auto”)
自动显示与当前执行语句相关变量和表达式的值
●观察窗口(“View”→“Watch”)
可输入变量和表达式并随程序执行而不断更新显示
●输入输出终端窗口(“View”→“TerminalI/O”)
利用该窗口和stdin/stdout库函数,在没有实际硬件支持的条件下实现输入∕输出操作
3.3J-LINK仿真调试(J-LINK)
与使用H-JTAG仿真器在RAM中调试的设置步骤相同。
与使用H-JTAG仿真器在RAM中调试的设置步骤相同。
3.4应用程序分析
C-SPY具有函数剖析和代码覆盖功能,用于对应用程序进行分析以确定其运行中的瓶颈问题。
3.4.1函数剖析
C-SPY剖析器可以找出程序运行过程中对一个给定激发信号耗时最长的函数,从而能集中精力研究如何更好地对这些函数进行优化,如在编译时选择速度优化模式,讲函数移到能更高效寻址的存储器中运行等。
使用C-SPY剖析器前,必须对用户所在工程在“Project”→“Options…”对话框中按下图进行配置:
选项
C/C++
Compiler
Generatedebuginformation
Linker
Includingdebuginformationinoutput
Debugger
Plugins
Profiling
然后,进入调试模式并单击下拉菜单“View”→“Profiling”选项,打开剖析窗口,单击
按钮开启剖析器同时单击
按钮开启自动刷新剖析记录。
接着,启动程序全速执行,当程序运行到一个断点或程序结束时,窗口将显示对当前所有函数运行的剖析记录结果,如下图所示。
3.4.2代码覆盖
C-SPY模拟器具有代码覆盖功能,来帮助用户确认是否所有程序代码都得到执行,这对于鉴别程序代码中是否存在不能被执行的部分特别有用。
CodeCoverage
然后,进入调试模式,并单击下拉菜单“View”→“CodeCoverage”选项,打开代码覆盖窗口,其中显示是当前代码覆盖分析状态报告。
单击
按钮开启代码覆盖器,同时单击
按钮开启自动刷新代码覆盖记录。
启动程序执行,代码覆盖分析报告如下图所示。
4将可执行二进制文件下载到片内FLASH
4.1使用H-JTAG下载(H-Flasher)
将H-JTAG分别连接到宿主机和目标机,并打开H-Flasher软件
4.1.1芯片选型
FlashSelection:
4.1.2擦除芯片
Programming:
Erase
4.1.3选择下载文件及其类型并对芯片编程
Program
4.2使用J-Link下载(J-LINKARM)
将J-LINK分别连接到宿主机和目标机,并打开J-LINKARM软件
4.2.1芯片选型
“Options”→“ProjectSetting”
4.2.2擦除芯片
“Traget”→“EraseChip”
4.2.3选择下载文件并对芯片编程
“File”→“Open”
“Traget”→“Program&
Verify”
4.3使用CPU自带的ISP功能下载(FlashMagic)
使用串口线将目标板的串口与宿主机的串口相连接,在宿主机端打开FlashMagic软件,设置相应的参数,如串口的通信速度(不能过高,过高可能出错,一般9600bps)、目标芯片型号(LPC…)、目标板晶振频率等。
然后复位目标机,并将复位后的目标机(LPC21xx)的P0.14引脚置低电平,从而进入ISP(在系统编程)模式。
选择需要下载的二进制可执行文件,按照先擦除整个芯片,然后编程的顺序,开始执行。
4.4使用CPU自带的IAP功能下载
使用在应用编程技术(即IAP),在用户程序运行时对Flash进行擦除和/或编程操作,实现数据的存储和固件的现场升级。
IAR中的中断处理
IARC/C++编译器支持ARM核的IRQ中断、FIQ快中断和SWI软件中断,可以直接采用C语言编写中断函数。
中断函数必须采用ARM模式编译。
中断函数用关键字__irq__arm、__fiq__arm和__swi__arm来声明,如声明IRQ中断函数如下:
__irq__armvoidIRQ_Handler(void),又如声明FIQ中断函数如下:
__fiq__armvoidFIQ_Handler(void)。
每个中断函数都在异常向量表中有一个相关向量地址,所有中断函数必须安装到向量表中,这可以通过汇编语言编写的系统启动文件cstartup.s来实现。
标准运行库对异常向量表的处理是跳转到一个预定义的无限循环函数,
启动文件cstartup.s定义如下异常函数名,并通过标准运行库中的异常向量引用:
Undefined_Handler
SWI_Handler
Prefetch_Handler
Abort_Handler
IRQ_Handler
FIQ_Handler
用户只要定义一个与上面同名的异常函数,就可建立自己的异常句柄,如采用如下语句定义一个IRQ中断函数:
__irq__armvoidIRQ_Handler(void){
…
}
当异常发生后,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中断处理流程图如下:
5.2非向量IRQ中断(ARM7)
如果使能IRQ中断同时禁用向量IRQ中断,当中断发生时,中断处理将进入非向量IRQ方式。
典型的非向量IRQ中断处理流程图如下:
5.3FIQ中断(ARM7)
如果使能FIQ中断,当中断发生时,中断处理将进入FIQ方式。
典型的FIQ中断处理流程与向量IRQ中断处理流程类似,只是将向量IRQ中断处理函数关键字__irq改成FIQ中断处理函数关键字__fiq。
一般地,为了提高响应速度,只有一个中断源被分配为FIQ。
IAR中C与汇编的混合编程
IARC/C++编译器提供了3种C/C++与汇编混合编程方法:
C语言本征函数、汇编语言程序和内联汇编。
在实际使用中,最好避免使用内联汇编,如果没有合适的本征函数建议采用汇编语言程序代替内联汇编,因为调用汇编语言函数不会使系统性能降低太多。
6.1C语言本征函数
IARC/C++编译器提供了少量C语言编写的本征函数。
采用本征函数可直接进行处理器底层操作而不需要采用汇编语言编程,这对于时序要求非常严格的场合十分有用。