4.2 集成开发环境使用说明
4.2.1 μVision IDE主框架窗口
μVision IDE由如图4-2所示的多个窗口、对话框、菜单栏、工具栏组成.其中菜单栏和工具栏用来实现快速的操作命令;工程工作区(Project Workspace)用于文件管理、寄存器调试、函数管理、手册管理等;输出窗口(Output Window)用于显示编译信息、搜索结果以及调试命令交互灯;内存窗口(Memory Window)可以以不同格式显示内存中的内容;观测窗口(Watch &Call Stack Window)用于观察、修改程序中的变量以及当前的函数调用关系;工作区(Workspace)用于文件编辑、反汇编输出和一些调试信息显示;外设对话框(Peripheral Dialog)帮助设计者观察片内外围接口的工作状态.
本节将主要介绍μVision IDE的菜单栏、工具栏、常用快捷方式,以及各种窗口的内容和使用方法,以便让读者能快速了解μVision IDE,并能对μVision IDE进行简单和基本的操作.
μVision IDE集成开发环境的菜单栏可提供如下菜单功能:编辑操作、工程维护、开发工具配置、程序调试、外部工具控制、窗口选择和操作,以及在线帮助等.工具栏按钮可以快速执行μVision的命令.状态栏显示了编辑和调试信息,在View菜单中可以控制工具栏和状态栏是否显示.键盘快捷键可以快速执行μVision的命令,它可以通过菜单命令Edit-Configuration-Shortcut Key来进行配置.
4.2.2 工程管理
(1)工程管理介绍.
在μVision IDE集成开发环境中,工程是一个非常重要的概念,它是用户组织一个应用的所有源文件、设置编译链接选项、生成调试信息文件和最终的目标Bin文件的一个基本结构.一个工程管理一个应用程序的所有源文件、库文件、其他输入文件,并根据实际情况进行相应的编译链接设置,一个工程必须生成一个相对应的目录,以进行文件管理.
μVision IDE工程管理提供以下功能:
μVision IDE的工作区由五部分组成,分别为Files(文件)页、Regs(寄存器)页、Books(书)页、Functions(函数)页、Templates(模板)页.工作区如图4-6所示,它显示了工程结构.
图4-6 工程管理区结构图
a.以工程为单位定义设置应用程序的各选项,包括目标处理器和调试设备的选择与设置,调试相关信息的配置,以及编译、汇编、链接等选项的设置等.系统提供一个专门的对话框来设置这些选项.
b.提供Build菜单和工具按钮,让用户轻松将工程编译、链接.编译、链接信息输出到输出窗口中的Build标签窗中,如图4-7所示,编译链接出现的错误,通过鼠标左键双击错误信息提示行来定位相应的源文件行.
图4-7 编译链接输出子窗口
c.一个应用工程编译链接后根据编译器的设置生成相应格式的调试信息文件,调试通过的程序转换成二进制格式的可执行文件后最终在目标板上运行.
①工程的创建.
μVision所提供的工程管理,使得基于ARM处理器的应用程序设计开发变得越来越方便.通常使用μVision创建一个新的工程需要以下几步:选择工具集、创建工程并选择处理器、创建源文件及文件组、配置硬件选项、配置对应启动代码、最后编译链接生成HEX文件.
a.选择工具集.
利用μVision创建一个基于处理器的应用程序,首先要选择开发工具集.单击Project-Manage-Components,Environment and Books菜单项,在如图4-8所示对话框中,可选择所使用的工具集.在μVision中既可使用ARM RealView编译器、GNU GCC编译器,也可以使用Keil CARM编译器.当使用GNU GCC编译器时,需要安装相应的工具集.在本例程中选择ARM RealView编译器,MDK环境默认的编译器,可不用配置.
b.创建工程并选择处理器.
单击Project-NewμVision Project…菜单项,μVision将打开一个标准对话框,输入希望新建工程的名字即可创建一个新的工程,建议对每个新建工程使用独立的文件夹.这里先建立一个新的文件夹Hello,在前述对话框中输入Hello,μVision将会创建一个以Hello.UV2为名字的新工程文件,它包含了一个缺省的目标(target)和文件组名.这些内容在Project Workspace窗口中可以看到.
创建一个新工程时,μVision要求设计者为工程选择一款对应处理器,如图4-9所示,该对话框中列出了μVision所支持的处理器设备数据库,也可单击Project-Select Device菜单项进入此对话框.选择了某款处理之后,μVision将会自动为工程设置相应的工具选项,这使得工具的配置过程简化.
对于大部分处理器设备,μVision会提示是否在目标工程里加入CPU的相关启动代码.如图4-10所示.启动代码是用来初始化目标设备的配置,完成运行时系统的初始化工作,对于嵌入式系统开发而言是必不可少的,单击OK便可将启动代码加入工程,这使得系统的启动代码编写工作量大大减少.
图4-8 选择工具集
图4-9 选择处理器
图4-10 加入启动代码
在设备数据库中为工程选择CPU后,Project Workspace-Books内就可以看到相应设备的用户手册,以供设计者参考,如图4-11所示.
图4-11 相应设备数据手册
②建立一个新的源文件.
创建一个工程之后,就应开始编写源程序.选择菜单项File-New可创建新的源文件,μVision IDE将会打开一个空的编辑窗口用以输入源程序.在输入完源程序后,选择File-Save As菜单项保存源程序,当以*.C为扩展名保存源文件时,μVision IDE将会根据语法以彩色高亮字体显示源程序.
③工程中文件的加入.
创建完源文件后便可以在工程里加入此源文件,μVision提供了多种方法加入源文件到工程中.例如,在Project Workspace-Files菜单项中选择文件组,右击将会弹出如图4-12所示快捷菜单,单击选项Add Files to Group…打开一个标准文件对话框,将已创建好的源文件加入到工程中.
图4-12 加入源文件到工程中
通常,设计人员应采用文件组来组织大的工程,将工程中同一模块或者同一类型的源文件放在同一文件组中.例如,可在Project-Manage-Components,Environment and Books…对话框中创建自己的文件组System Files来管理CPU启动代码和其他系统配置文件等,如图4-13所示.可使用New(Insert)按钮可创建新的文件组,或在Groups文件组中选定一个文件组,然后点击为其添加文件.
图4-13 创建新的文件组
④设置活动工程.
在μVision IDE中可以存在几个同时打开的工程,但只有一个工程处于活动状态并显示在工程区中,处于活动状态的工程才可以作为调试工程.可在图4-13中的工程目标框中选择需要激活的工程,然后单击按钮即可.
(2)工程基本配置.
①硬件选项配置.
μVision可根据目标硬件的实际情况对工程进行配置.通过单击目标工具栏图标或者击菜单项Project-Options for Target,在弹出的Target页面可指定目标硬件和所选择设片内组件的相关参数,如图4-14所示.
图4-14 处理器配置对话框
表4-1对Target页面选项作一个简要说明:
表4-1 目标硬件配置选项说明表
②处理器启动代码配置.
通常情况下,ARM程序都需要初始化代码用来配置所对应的目标硬件.如4.2.2节所述,当创建一个应用程序时μVision会提示使用者自动加入相应设备的启动代码.
μVision提供了丰富的启动代码文件,可在相应文件夹中获得.例如,针对Keil开发工具的启动代码放在..\ARM\Startup文件夹下,针对GNU开发工具的在..\ARM\GNU\Startup文件夹下,针对ADS开发工具的在文件夹..\ARM\ADS\Startup下.以S3C2410处理器为例,其启动代码文件为...\Startup\Samsung\S3C2410A.s,可把这个启动代码文件复制到工程文件夹下.双击S3C2410A.s源文件,根据目标硬件作相应的修改即可使用.μVision里大部分启动代码文件都有一个配置向导(Configuration Wizard),如图4-15所示,它提供了一种菜单驱动方式来配置目标板的启动代码.
开发工具提供缺省的启动代码,对于大部分单芯片应用程序来说是一个很好的起点,但是开发者必须根据目标硬件来调整部分启动代码的配置,否则很可能是无法使用的.例如,CPU/PLL时钟和总线系统往往会根据目标系统的不同而不同,不能够自动地配置.一些设备还提供了片上部件的使能/禁止可选项,这就需要开发者对目标硬件有足够的了解,能够确保启动代码的配置和目标硬件完全匹配.
图4-15 启动代码文件配置向导
③仿真器配置.
选择菜单项Project→Project-Option for Target或者直接单击,打开Option for Target对话框的Debug页,弹出如下对话框,进行仿真器的连接配置.
图4-16 Option for Target对话框Debug页
使用ULINK仿真器时,为仿真器选择合适的驱动以及为应用程序和可执行文件下载进行配置,对图4-16对话框的设置如图4-17、图4-18所示.
图4-17 仿真器驱动配置图
图4-18 仿真器下载应用程序配置图
PC机通过ULINK USB-JTAG仿真器与目标板连接成功之后,可以打开图4-18中的Settings选项查看ULINK信息,如图4-20所示.
图4-19 未连ULINK仿真器前
④工具配置.
工具选项主要设置Flash下载选项.打开菜单栏的Project→Project-Option for Target对话框选择其“Utilities”页,或者打开菜单Flash→Configue Flash Tools…,将弹出如图4-21所示的对话框.
图4-20 连接ULINK仿真器后
图4-21 选择ULINK下载代码到FLASH
在图4-21对话框中选“Use Target Driver for Flash Programming”,再选择“ULINK ARM Debugger”,同时钩上“Update Target before Debugging”选项.这时还没有完成设置,还需要选择编程算法,点击“Settings”将弹出如图4-22所示的对话框.
点击图4-22的对话框中的“Add”,将弹出如图4-23所示的对话框,在该对话框中选对需要的FLASH编程算法.例如对STR912FW芯片,由于其FLASH为256KB则需要选择如下图4-23所标注的FLASH编程算法.
图4-22 FLASH下载设置
图4-23 选择FLASH编程算法
⑤调试设置.
μVision调试器提供了两种调试模式,可以从Project→Options for Target对话框的Debug页内选择操作模式,如图4-24所示.
图4-24 调试器的选择
软件仿真模式.
在没有目标硬件情况下,可以使用仿真器(Simulator)将μVision调试器配置为软件仿真器.它可以仿真微控制器的许多特性,还可以仿真许多外围设备包括串口、外部I/O口及时钟等.所能仿真的外围设备在为目标程序选择CPU时就被选定了.在目标硬件准备好之前,可用这种方式测试和调试嵌入式应用程序.
GDI驱动模式:
使用高级GDI驱动设备连接目标硬件来进行调试,例如使用ULINK Debugger.
对μVision来说,可用于连接的驱动设备有:
a.JTAG/OCDS适配器:它连接到片上调试系统,例如AMR Embedded ICE.
b.Monitor(监视器):它可以集成在用户硬件上,也可以用在许多评估板上.
c.Emulator(仿真器):它连接到目标硬件的CPU引脚上.
d.In-System Debugger(系统内调试器):它是用户应用程序的一部分,可以提供基本的测试功能.
e.Test Hardware(测试硬件):如Philips SmartMX DBox、Infineon SmartCard ROM Monitor RM66P等.
使用仿真器调试时,选择菜单项Project→Project-Option for Target或者直接单击,打开Option for Target对话框的Debug页,弹出如下对话框,可进行调试配置.
图4-25 选择ULINK USB-JTAG仿真器调试
如果目标板已上电,并且与ULINK USB-JTAG仿真器连接上,点击图4-25中的“Settings”,将弹出如图4-26所示的对话框,正常则可读取目标板芯片ID号.如果读不出ID号,则需要检查ULINK USB-JTAG仿真器与PC或目标板的连接是否正确.
⑥编译配置.
选择编译器:
μVision IDE目前支持RealView、Keil CARM和GNU这三种编译器,从菜单栏的Project→Manage→Component,Environment and Books或者直接单击工具栏中的图标,打开其Folders/Extensions页进入编译器选择界面.我们使用RealView编译器如图4-27所示.
图4-26 读取设备ID
图4-27 选择编译器
配置编译器:
选择好编译器后,单击图标,打开Option for Target对话框的C/C++页,出现如图4-28的编译属性配置页面(这里主要说明RealView编译器的编译配置).
各个编译选项说明如下:
Enable ARM/Thumb Interworking:生成ARM/Thumb指令集的目标代码,支持两种指令之间的函数调用.
Optimization:优化等级选项,分四个档次.
Optimize for Time:时间优化.
图4-28 编译器配置页
Split Load and Store Multiple:非对齐数据采用多次访问方式.
One ELF Section per Function:每个函数设置一个ELF段.
Strict ANSI C:编译标准ANSI C格式的源文件.
Enum Container always int:枚举值用整型数表示.
Plain Char is Signed:Plain Char类型用有符号字符表示.
Read-Only Position Independent:段中代码和只读数据的地址在运行时候可以改变.
Read-Write Position Independent:段中的可读/写的数据地址在运行期间可以改变.
Warning:编译源文件时,警告信息输出提示选项.
⑦汇编选项设置.
单击图标,打开Option for Target对话框的Asm页,出现如图4-29的汇编属性配置页面:
图4-29 汇编配置页
各个汇编选项说明如下:
Enable ARM/Thumb Interworking:生成ARM/Thumb指令集的目标代码,支持两种指令之间的函数调用.
Read-Only Position Independent:段中代码和只读数据的地址在运行时候可以改变.
Read-Write Position Independent:段中的可读/写的数据地址在运行期间可以改变.
Thumb Mode:只编译Thumb指令集的汇编源文件.
No Warnings:不输出警告信息.
Software Stack-Checking:软件堆栈检查.
Split Load and Store Multiple:非对齐数据采用多次访问方式.
⑧链接选项设置.
链接器/定位器用于将目标模块进行段合并,并对其定位,生成程序.既可通过命令行方式使用链接器,也可在μVision IDE中使用链接器.单击图标,打开Options for Target对话框的Linker页,出现如图4-30的链接属性配置页面.
图4-30 链接配置页
各个链接选项配置说明如下:
Make RW Sections Position Independent:RW段运行时可改变.
Make RO Sections Position Independent:RO段运行时可改变.
Don’t search Standard Libraries:链接时不搜索标准库.
Report‘might fail’Conditions as Err:将“might fail”报告为错误提示输出.
R/O Base:R/O段起始地址输入框.
R/W Base:R/W段起始地址输入框.
⑨输出文件设置.
在Project→Options for Target的Output页中配置输出文件,如图4-31所示.
图4-31 输出文件配置页
输出文件配置选项说明如下:
Name of Executable:指定输出文件名.
Debug Information:允许时,在可执行文件内存储符号的调试信息.
Create HEX File:允许时,使用外部程序生成一个HEX文件进行Flash编程.
Browse Information:浏览信息.
Create Batch File:创建批文件.
(3)工程的编译链接.
完成工程的设置后,就可以对工程进行编译链接了.用户可以通过选择主窗口Project菜单的Build target项或工具条按钮,编译相应的文件或工程,同时在输出窗的Build子窗口中输出有关信息.如果在编译链接过程中,出现任何错误,包括源文件语法错误和其他错误时,编译链接操作立刻终止,并在输出窗的Build子窗口中提示错误,如果是语法错误,用户可以通过鼠标左键双击错误提示行,来定位引起错误的源文件行.
(4)加载调试.
μVision调试器提供了软件仿真和GDI驱动两种调试模式,采用ULINK仿真器调试时,首先将集成环境与ULINK仿真器连接,按照前面4.2.2.2小节中的工程配置方法对要调试的工程进行配置后,点击Flash→Download菜单项可将目标文件下载到目标系统的指定存储区中,文件下载后即可进行在线仿真调试.
①断点和单步.
调试器可以控制目标程序的运行和停止,并反汇编正在调试的二进制代码,同时可通过设置断点来控制程序的运行,辅助用户更快地调试目标程序.μVision IDE的调试器可以在源程序、反汇编程序以及源程序汇编程序混合模式窗口中设置和删除断点.在μVision中设置断点的方式非常灵活,甚至可以在程序代码被编译前在源程序中设置断点.定义和修改断点的方式有如下几种:
图4-32 工程Project菜单和工具条
使用文件工具栏,只要在编辑窗口或反汇编窗口中选中要插入断点的行,然后再单击工具栏上的按钮就可以定义或修改断点;
使用快捷菜单上的断点命令,在编辑窗口或反汇编窗口中单击右键即可打开快捷菜单;
在Debug-Breakpoints…对话框中,可以查看、定义、修改断点.这个对话框可以定义及访问不同属性的断点;
在Output Window-Command页中,使用BreakSet、BreakKill、BreakList、BreakEnable、BreakDisable命令对断点进行管理.
在断点对话框中可以查看及修改断点,如图4-33所示.可以在Current Breakpoints列表中通过单击复选框来快捷地Disable或Enable一个断点.在Current Breakpoints列表中双击可以修改选定的断点.
如图4-33所示,可以在断点对话框表达式的文本框中输入一个表达式来定义断点.根据表达式的类型可以定义如下类型的断点:
当表达式是代码地址时,一个类型为Execution Break(E)的断点被定义,当执行到指定的代码地址时,此断点有效.输入的代码地址要参考每条CPU指令的第一个字节;
当对话框中一个内存访问类型(可读、可写或既可读又可写)被选中时,那么将会定义一个类型为Access Break(A)的断点.当指定的内存访问发生时,此断点有效.可以以字节方式指定内存访问的范围,也可以指定表达式的目标范围.Access Break类型的表达式必须能转化为内存地址及内存类型.在Access Break类型的断点停止程序执行或执行命令之前操作符(&,&&,<,<=,>,>=,==,and!=)可用于比较变量的值;
当表达式不能转换为内存地址时,一个Conditional Break(C)类型的断点将被定义,当指定的条件表达式为真时,此断点有效.在每个CPU指令后,均需要重新计算表达式的值,因此,程序执行速度会明显降低.
图4-33 断点对话框
在Command文本框中可以为断点指定一条命令,程序执行到断点时将执行该命令,μVision执行命令后会继续执行目标程序.在此指定的命令可以是μVision的调试命令或信号函数.μVision中,可以使用系统变量_break_来停止程序的执行.Count的值用于指定断点触发前断点表达式为真的次数.
②反汇编窗.
反汇编窗用于显示反汇编二进制代码后得到的汇编级代码,可以混合源代码显示,也可以混合二进制代码显示.反汇编窗可以设置和清除汇编级别断点,并可按照ARM或Thumb格式的反汇编二进制代码.
如图4-34所示,反汇编窗口可用于将源程序和反汇编程序一起显示,也可以只显示反汇编程序.通过Debug→View Trace Records可以查看前面指令的执行记录.为了实现这一功能,需要设置Debug→Enable/Disable Trace Recording.
若选择反汇编窗口作为当前窗口,那么程序的执行是以CPU指令为单位的而不是以源程序中的行为单位的.可以用工具条上的按钮或快捷菜单命令为选中的行设置断点或对断点进行修改.还可以使用对话框Debug→Inline Assembly…来修改CPU指令,它允许设计这对调试的目标程序进行临时修改.
图4-34 源文件与反汇编指令交叉显示窗口
③寄存器窗.
在Project Workspace-Regs页中列出了CPU的所有寄存器,按模式排列共有八组,分别为Current模式寄存器组、User/System模式寄存器组、Fast Interrupt模式寄存器组、Interrupt模式寄存器组、Supervisor模式寄存器组、Abort模式寄存器组、Undefined模式寄存器组以及Internal模式寄存器组,如图4-35所示.在每个寄存器组中又分别有相应的寄存器.在调试过程中,值发生变化的寄存器将会以蓝色显示.选中指定寄存器单击或按F2键便可以出现一个编辑框,从而改变此寄存器的值.
图4-35 Regs页
④存储区窗.
图4-36 内存窗口
通过内存窗口可以查看与显示存储情况,View-Memory Window可以打开存储器窗口,如图4-36所示.μVision可仿真了高达4GB的存储空间,这些空间可以通过MAP命令或Debug-Memory Map打开内存映射对话框来映射为可读的、可写的、可执行的,如图4-37.μVision能够检查并报告非法的存储访问.
图4-37 内存映射对话框
从图4-36中可看出内存窗口有四个Memory页,分别为Memory#1、Memory#2、Memory#3、Memory#4,即可同时显示四个指定存储区域的内容.在Address域内,输入地址即可显示相应地址中的内容.需要说明的是,它支持表达式输入,只要这个表达式代表了某个区域的地址即可,例如图4-36中所示的main.双击指定地址处会出现编辑框,可以改变相应地址处的值.在存储区内单击右键可以打开如图4-36所示的快捷菜单,在此可以选择输出格式.通过选中View→Periodic Window Update,可以在运行时实时更新此内存窗口中的值.在运行过程中,若某些地址处的值发生变化,将会以红色显示.
内存映射对话框可以用来设定哪些地址空间用于存储数据、哪些地址空间用于存储程序.也可以用MAP命令来完成上述工作.在载入目标应用时,μVision自动地对应用进行地址映射,一般不需要映射额外的地址空间,但被访问的地址空间没有被明确声明时就必须进行地址映射,如存储映射I/O空间.如上图所示,每一个存储空间均可指定为可读、可写、可执行,若在编辑框内输入”MAP 0X0C000000,0X0E000000READ WRITE EXEC”,此命令就是将从0X0C000000到0X0E000000这部分区域映射为可读的、可写的、可执行的.在目标程序运行期间,μVision使用存储映射来保证程序没有访问非法的存储区.
⑤观测窗口.
观测窗口(Watch Windows)用于查看和修改程序中变量的值,并列出了当前的函数调用关系.在程序运行结束之后,观测窗口中的内容将自动更新.也可通过菜单View-Periodic Window Update设置来实现程序运行时实时更新变量的值.观测窗口共包含四个页:Locals页、Watch#1页、Watch#2页、Call Stack页,分别介绍如下.
图4-38 Watch窗口之Locals页
Locals页:如图4-38所示,此页列出了程序的当前函数中全部的局部变量.要修改某个变量的值,只需选中变量的值,然后单击或按F2即可弹出一个文本框来修改该变量的值.
Watch页:如图4-39所示,观测窗口有2个Watch页,此页列出了用户指定的程序变量.有三种方式可以把程序变量加到Watch页中:
a.在Watch页中,选中<type F2to edit>,然后按F2,会出现一个文本框,在此输入要添加的变量名即可,用同样的方法,可以修改已存在的变量;
b.在工作空间中,选中要添加到Watch页中的变量,右击会出现快捷菜单,在快捷菜单中选择Add to Watch Window,即可把选定的变量添加到Watch页中;
c.在Output Window窗口的Command页中,用WS(WatchSet)命令将所要添加的变量添入Watch页中.
若要修改某个变量的值,只需选中变量的值,再单击或按F2即可出现一个文本框修改该变量的值.若要删除变量,只需选中变量,按Delete键或在Output Window窗口的Command页中用WK(WatchKill)命令就可以删除变量.
图4-39 Watch窗口之Watch页
Call Stack页:如图4-40所示,此页显示了函数的调用关系.双击此页中的某行,将会在工作区中显示该行对应的调用函数以及相应的运行地址.
图4-40 Watch窗口之Call Stack页
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。