《51单片机应用开发范例大全(第3版)》——1.2 Keil Vision2
本节书摘来异步社区《51单片机应用开发范例大全(第3版)》一书中的第1章,第1.2节,作者:张杰 , 宋戈 , 黄鹤松 , 员玉良,更多章节内容可以访问云栖社区“异步社区”公众号查看1.2 Keil Vision2MCS-51单片机的开发除了需要硬件的支持以外,同样离不开软件。CPU真正可执行的是机器码,用汇编语言或C等高级语言编写的源程序必须转换为...
本节书摘来异步社区《51单片机应用开发范例大全(第3版)》一书中的第1章,第1.2节,作者:张杰 , 宋戈 , 黄鹤松 , 员玉良,更多章节内容可以访问云栖社区“异步社区”公众号查看
1.2 Keil Vision2
MCS-51单片机的开发除了需要硬件的支持以外,同样离不开软件。CPU真正可执行的是机器码,用汇编语言或C等高级语言编写的源程序必须转换为机器码才能运行,转换的方法有手工汇编和机器汇编两种,前者目前已极少使用。机器汇编是指通过汇编软件将源程序变为机器码的编译方法。这种汇编软件称为编译器。本节将向大家介绍目前十分流行的Keil Vision2。
1.2.1 Keil Vision2集成开发环境介绍
Keil Vision2是一个集成开发环境(Intergrated Development Environment,IDE),它包括编译器、汇编器、实时操作系统、项目管理器和调试器等。它可以用于编写、调试和软仿真所有的51内核控制器,也可以和IDE连接进行芯片的在线调试。同时C编译器保留了汇编代码高效、快速的特点,可以作为许多编程工具的第三方支持。因此,它无疑是8051开发用户的首选。
当使用Vision2的开发工具进行项目开发时,项目的开发流程和其他软件开发项目的流程极其相似,一般遵循下面的几步。
(1)创建一个项目,从器件库中选择目标器件,配置工具设置。
(2)用C语言或汇编语言创建源程序。
(3)用项目管理生成应用。
(4)修改源程序中的错误。
(5)测试、连接应用。
用带有Vision集成开发环境的Keil Vision2工具进行软件开发的流程如图1-12所示。
1.2.2 使用Keil Vision2进行开发
对Keil Vision2软件及其集成开发环境有了整体认识后,本小节将详细介绍如何使用Keil Vision2软件来进行单片机程序的开发。
1.建立工程
首先启动Keil Vision2软件的集成开发环境,如图1-13所示。几秒钟后出现编辑界面,程序窗口的左边会出现一个工程管理窗口,如图 1-14 所示。该窗口中有 3 个标签,分别是“Files”、“Regs”和“Books”,这3个标签页分别显示当前项目的文件结构、CPU的寄存器及部分特殊功能寄存器的值(调试时才出现)和所选CPU的附加说明文件,如果是第一次启动Keil Vision2,则这3个标签页全是空的。
使用菜单“File/New”或者单击工具栏的新建文件按钮,即可在项目窗口的右侧打开一个新的文本编辑窗口,在该窗口中输入源程序代码,然后保存该文件,注意必须加上扩展名“.c”。源文件不一定使用Keil Vision2 自带的文本编辑器编写,可以使用任意文本编辑器编写。
在项目开发中,并不仅是有一源程序就行了,还要为这个项目选择CPU(Keil Vision2支持数百种CPU,这些CPU的特性不完全相同),确定编译、汇编、连接的参数,指定调试的方式。有一些项目还会由多个文件组成,为管理和使用方便,Keil Vision2使用工程(Project)这一概念,将这些参数设置和所需的所有文件都加在一个工程中,对工程里的MAIN.C文件进行编译、连接,这样生成的代码才有意义。
选择“Project/New Project”菜单,弹出一个对话框,如图1-15所示。
要求给将要建立的工程起一个名字,不需要扩展名,单击“保存”按钮,然后出现第二个对话框,如图1-16所示。这个对话框要求选择目标CPU,从图中可以看出Keil Vision2支持的CPU种类繁多,几乎所有目前流行的芯片厂家的CPU型号都包括其中。选择时,单击所选厂家前面的“+”号,展开之后选择所需要的CPU类型即可。
选好以后回到主界面,此时在工程窗口的文件页中,出现了“Target 1”,“Target 1”的前面有一个“+”号,单击“+”号展开,可以看到下一层的“Source Group 1”,这时的工程还是一个空的工程,里面什么文件也没有,需要手动把编写好的源程序文件输入。单击“Source Group 1”使其反白显示,然后单击鼠标右键,出现一个下拉菜单,如图1-17所示。
选择其中的“Add Files to Group‘Source Group 1’”选项,出现如图1-18所示的“添加源文件”对话框。
注意该对话框下面的“文件类型”默认为“C Source files (*.C)”,也就是以C为扩展名的文件,找到并选中需要加入的文件,将文件拖入到项目中,此后还可以继续加入其他需要的文件。
2.工程的设置
Vision2允许用户为目标硬件设置选项。先单击左边“Project”窗口的“Target 1”,然后选择菜单“Project/Options for Target‘Target 1’”,即出现工程设置对话框,此对话框共有8个选项卡,绝大部分设置取默认值即可。
(1)Target选项卡。
单击Target选项卡,如图1-19所示。
其中各参数设置如下。
Xtal(MHz):用于设置单片机的工作频率,默认设置是所选目标CPU的最高可用频率值,该数值与最终产生的目标代码无关,仅用于软件模拟调试时显示程序执行时间。正确设置该数值可使显示时间与实际所用时间一致,一般将其设置为开发的硬件所用的晶振频率。
Memory Model:用于设置数据存储空间的类型,有3个选择项:“Small”指变量存储在内部RAM里;“Compact”指变量存储在外部RAM里,使用8位间接寻址;“Large”指变量存储在外部RAM里,使用16位间接寻址。
Code Rom Size:用于设置ROM空间的使用,同样也有3个选项值:“Small”模式,表示只使用不超过2KB的程序空间;“Compact”模式,表示函数的代码量不能超过2KB,整个程序可以使用64KB的程序空间;“Large”模式,程序和函数可用全部的64KB空间。
Operating:用于选择是否使用操作系统,Keil Vision2提供了两种操作系统:RTX-51 Tiny和RTX-51 Full。一般情况下不使用操作系统,即使用该项的默认值:“None”。
Off-chip Code memory:用于确定系统外扩ROM的地址范围,如果没有外接ROM不要填任何数据。
off-chip XData memory:用于确定系统外展RAM的地址范围,如果没有外接RAM不要填任何数据。
(2)Output选项卡。
单击Output选项卡,如图1-20所示。
Output选项卡的设置比较多,下面逐一介绍。
Select Folder for Objects:用于选择最终的目标文件所在的文件夹,默认是与工程文件在同一个文件夹中。
Name of Executable:用于指定最终产生的目标文件夹的名字,默认与工程的名字相同,这两项一般不需要更改。
Debug Information:用于产生调试信息,这些信息用于调试。如果需要对程序进行调试,应当选中该项。
Browse Information:用于产生浏览信息,该信息可以用菜单“View/Browse”来查看,这里取默认值。
Creat Hex File:用于生成可执行代码文件,扩展名为“.HEX”,默认情况下该项未被选中,如果要需要生成HEX文件,必须选中该项。
Create Library:生成库文件。选中该选项时将生成lib库文件,根据用户的需要是否生成库文件,一般的应用是不生成库文件的。
(3)Listing选项卡。
“Listing”选项卡用于调整生成的列表文件选项。在汇编或编译完成后将产生.lst的列表文件,在连接完成后也将产生.m51的列表文件,该选项卡用于对列表文件的内容和形式进行细致的调节。其中比较常用的选项是“C Compile Listing”下的“Assemble Code”项,选中该项可以在列表文件中生成C语言源程序所对应的汇编代码。
(4)C 51选项卡。
用于对Keil Vision2的MCS-51单片机的编译过程进行控制,其中比较常用的是“Code Optimization”组,如图1-21所示。
该组中“Level”是优化等级,MCS-51在对源程序进行编译时,可以对代码进行多至9级优化,默认使用第8级,一般不必修改。如果在编译中出现一些问题,可以降低优化级别试一试。
“Emphasis”是选择编译优先方式,第一项是代码量优化(最终生成的代码量最小),第二项是速度优先(最终生成的代码速度最快),第三项是默认选项。默认的是速度优先,可根据需要更改。
设置完成后单击“确定”按钮返回主界面,工程文件设置完毕。
- 编译与连接
在工程建立并设置好以后,接下来的工作就是对工程进行编译。如果一个项目包含多个源程序文件,并且已经编译,则当只修改了某一个文件时,没有必要全部再编译一次,可选择“Project/Build Target”(图片 40),仅对修改过的文件进行编译,然后和已被编译过的文件进行连接。如果对所有原程序全部进行编译连接,可选择“Rebuild all Target Files(图片 42)”。推荐按F7键或单击快捷按钮图片 43,仅对修改过的文件进行编译连接。
编译是通过单击快捷按钮(图片 44或者图片 45)进行的,如果源文件没有语法错误,将生成.OBJ文件,同时如果设置正确,OH51.HEX文件会被调用来生成HEX代码。源文件没有语法错误并不能保证就是正确可行的,能不能实现需要的功能还需进行调试。调试是一项复杂的工作,好的调试工具这时将起到至关重要的作用。有关Keil Vision2的调试器环境和调试方法将在后文做详细介绍。
利用编程环境通过编程器将可执行的.HEX文件写入到51芯片的程序存储器ROM里,然后插入到目标硬件系统上电就可以执行。编程器的种类繁多,但使用方法大多相同(界面有些区别),具体过程本书不作介绍。
1.2.3 dScope for Windows的使用
在开发产品时,软件仿真是芯片不具有在线调试接口时的首要步骤(8051低端单片机不具备此功能,F系列的Soc除外),可以用软件模拟仿真器(Simulator)对应用程序进行软件模拟调试。另外,现在应用程序的开发往往由几个人共同开发的情形较多,因此直接用硬件方法调试软件会带来一定的困难。Keil Vision2提供了一种软件仿真器dScope,为MCS-51单片机应用程序的调试带来了极大的方便。本小节将详细介绍dScope for Windows的使用方法。
1.如何启动
如果源程序代码编译成功,那么运行dScope可以对MCS-51应用程序进行软件仿真调试Simulator。为了运行dScope,在图1-22所示的“Option for Target”对话框的“Debug”选项卡中要选中“Use Simulator”单选项。“Load Application at Startup”复选框用于在dScope启动时能够调用自己应用程序的OMF文件,因此也要选中这个复选框。如果不选中此复选框而运行了dScope,则要手动装载应用程序。
“Run to main()”选项用于选择在dScope启动后,是否从C源程序的main()函数开始,因此推荐选中此复选框。
“Use”选项中的监控软件“Keil Vision2 Monitor”,具有把已经编译好的代码下载到用户目标硬件系统后,监控硬件目标系统的功能。该监控软件通过RS-232串口实时地实现Keil Vision2的dScope和硬件目标系统相互联系的强大功能。这里由于使用软件仿真,所以不选取。
在编译源程序代码时,出现警告仍然可以写入芯片进行调试,但出现错误就不可以进行调试了,然后就应该执行dScope。dScope一词是Debug和Scope的合成语。图1-23中Keil Vision2执行菜单文件工具栏中带有红色“d”字的按钮图片 47,就是启动dScope的快捷按钮。
进入调试状态后,界面与编辑界面相比有明显的变化,“Debug”菜单项中原来不能用的命令现在已可以使用了,工具栏中会多出一个用于运行和调试的工具条,如图1-24所示。
2.如何调试
调试是在源文件编辑、编译无误之后才得以进行的,主要是反复修改程序并检验编写的程序是否能够可靠地实现预期目标的过程。在做开发计划时,通常就把开发周期和调试周期同等对待。
程序调试时,必须明确两个重要的概念,即单步执行与全速运行。全速运行是指一程序行执行完以后紧接着执行下一程序行,中间不停止,这样可以看到该段程序执行的总体效果,即最终结果正确还是错误,但如果程序错误,则难以确认错误出现的位置。单步执行是每次执行一行程序,执行完该行程序即停止,等待命令执行下一行程序,此时可以观察该程序行执行完以后得到的结果,是否与我们写该程序行所想要得到的结果相同,由此可以找到程序中的问题所在。程序调试中,这两种运行方式都要用到。
使用菜单“Step”或相应的快捷按钮图片 50或使用快捷键F11,可以单步执行程序。使用菜单“Step Over”或相应的快捷按钮图片 51或使用快捷键F10,可以以过程单步形式执行命令。所谓过程单步,是指将汇编语言中的子程序或高级语言中的函数作为一个语句来全速执行。
通过单步执行程序,可以找出一些问题的所在,但是仅依靠单步执行来查错有时是困难的,或虽能查出错误但效率很低,为此必须辅以其他方法。比如在循环次数很多的循环子程序中,单步执行方法就不再合适,这时候可以使用“单步执行到函数外”命令(图片 52),或者“运行到光标所在行”命令(图片 53)来跳出循环子程序。还有个办法就是在单步执行到循环子程序的时候,不再使用单步命令F11(图片 54)而采用过程单步F10(图片 55)命令,这样就不会进入循环子程序内部。灵活使用这几种方法,可以大大提高调试的效率。
在进入Keil Vision2的调试环境以后,如果发现程序有错,可以直接对源程序进行修改,但是要实现重新编译,必须先退出调试环境,然后重新编译、连接后再次进入调试。如果只是需要对某些程序进行作测试,或仅需要对源程序进行临时的修改,这样的过程未免有些麻烦,可以采用Keil Vision2软件提供的在线汇编的方法。将光标定位于需要修改的程序行上,选择菜单“Debug/Inline Assembly”,会弹出如图 1-25 所示的对话框,在“Enter New Instruction”后面的编辑框内直接输入需更改的程序语句,输入完成以后回车将自动指向下一条语句,可以继续修改,如果不再需要修改,可以单击右上角的关闭按钮关闭窗口。
程序调试时,一些程序行必须满足一定的条件才能被执行(如程序中某变量达到一定的值、按键被按下、串口接收到数据、有中断产生等),这些条件往往是异步发生或难以预先设定的,这类问题使用单步执行的方法是很难调试的,这时就需要使用到程序调试中的另一种非常重要的方法——断点设置。
断点设置的方法有很多种,常用的是在某一程序行设置断点,设置好断点后可以全速运行程序,一旦执行到该程序行即停止,可在此观察有关变量值,以确定问题所在。在程序行设置/删除断点的方法是将光标定位于需要设置断点的程序运行,使用菜单“Debug/Insert/Remove Breakpoint”(图片 56)设置或删除断点(也可以用鼠标在该行双击实现同样的功能)。其他几个选项的意义为:
“Debug/Enable/Disable Breakpoint”(图片 57)是指开启或暂停光标所在行的断点功能,“Debug/Disable All Breakpoint”(图片 58)暂停所有的断点,“Debug/Kill All Breakpoint”(图片 59)清除所有的断点设置。
3.调试窗口
Keil Vision2软件在调试程序时提供了多个窗口,主要包括输出窗口(Output Window)、观察窗口(Watch & Call Stack Window)、存储器窗口(Memory Window)、反汇编窗口(Disassembly Window)和串行窗口(Serial Window)等。进入调试模式后,可以通过菜单“View”下的相应命令打开或关闭这些窗口。
在进入调试模式之前,工程窗口的寄存器页面是空白的,进入调试模式以后,此页面就会显示出当前模拟状态下单片机寄存器的值,如图1-26所示。
寄存器页面包括了当前的工作寄存器组和系统寄存器,系统寄存器有一些是实际存在的寄存器(如A、B、DPTR、SP、PSW等),有一些是实际中并不存在或虽然存在却不能对其进行操作的(如PC、Status等)。每当程序中执行到对某寄存器的操作时,该寄存器会以反色(蓝底白字)显示,用鼠标单击然后按下F2键,即可修改该值。
图1-27所示是调试模式下的输出窗口、存储器窗口和观察窗口。
进入调试程序后,输出窗口自动切换到“Command”页(命令窗口)。输出窗口可以输入调试命令,同时可以输出调试信息,调试命令以文本的形式输入,详细的命令语句可以参照“Getting Started with Vision2”的说明,大约有30个命令,这里不做详细介绍。
存储器窗口可以显示系统中各种内存中的值,通过在Address后的编辑框内输入“字母:数字”即可显示相应内存值,其中字母可以是C、D、I和X,它们分别代表代码存储空间、直接寻址的片内存储空间、间接寻址的片内存储空间和扩展的外部RAM空间。数字代表想要查看的地址。如输入“D:5”,即可观察到地址0x05开始的片内RAM单元值,键入“C:0”即可显示从0开始的ROM单元中的值,即查看程序的二进制代码。该窗口的显示值可以以各种形式显示,如十进制、十六进制、字符型等。
改变显示方式的方法是:按鼠标右键,在弹出的快捷菜单中选择,该菜单用分隔条分成3部分,其中第一部分与第二部分的3个选项为同一级别,选中第一部分的任意选项,内容将以整数形式显示;而选中第二部分的“ASCII”项将以字符型显示,选中“Float”项内容将以相邻4字节组成的浮点数形式显示,选中“Double”项内容将以相邻8字节组成的双精度形式显示。第一部分又有多个选项,其中“Decimal”项是一个开关,如果选中该选项,则窗口中的值将以十进制的形式显示,否则按默认的十六进制方式显示。“Unsigned”和“Signed”后分别有3个选项:Char,Int,Long,分别代表以单字节方式显示、相邻双字节组成整型数方式显示、相邻4字节组成长整型方式显示,而“Unsigned”和“Signed”则分别代表无符号形式和有符号形式,至于究竟从哪一个单元开始相邻单元则与设置有关。第三部分的“Modify Memory at X:xx”用于更改鼠标处的内存单元值,选中该项即出现如图1-28所示的对话框,可以在对话框中输入要修改的内容。
观察窗口是很重要的一个窗口,工程窗口中仅可观察到工作寄存器和有限的系统寄存器,如A、B、DPTR等,如果需要观察其他寄存器的值或者在高级语言编程时需要直接观察变量,就要借助于观察窗口了。比如如果想要观察程序中某个临时变量tmp在单步工作时的变化情况,就可以在观察窗口中按F2键,然后键入变量名tmp,这样在程序运行的时候会看到tmp变量的即时值。一般情况下,仅在单步执行时才对变量值的变化感兴趣,全速运行时,变量的值是不变的,只有在程序停下来之后,才会将这些最新的变化反映出来。但是,在一些特殊的场合也可能需要在全速运行时观察变量的变化,此时可以选择“View/Periodic Window Updata”菜单,确认该项处于被选中状态,即可在全速运行时动态地观察有关变量值的变化。选中该项,将会使程序模拟执行的速度变慢。
选择菜单“View/Disassembly Window”可以打开反汇编窗口,如图1-29所示。
该窗口可以显示反汇编后的代码、源程序和相应反汇编代码的混合代码,可以在该窗口进行在线汇编、利用该窗口跟踪已执行的代码、在该窗口按汇编代码的方式单步执行。打开反汇编窗口,单击鼠标右键,出现快捷菜单,如图1-30所示,其中“Mixed Mode”是以混合方式显示,“Assembly Mode”是以反汇编码方式显示。
程序调试中常使用设置断点然后全速执行的方式,在断点处可以获得各变量值,但却无法知道程序在断点前究竟执行了哪些代码,而这往往是需要了解的。为此,Keil Vision2提供了跟踪功能,在运行程序之前打开调试工具条上的运行跟踪代码开关,然后全速运行程序。当程序停止运行后,单击查看跟踪代码按钮,自动切换到反汇编窗口,其中前面标有“-”号的行就是中断以前执行的代码,可以按窗口边的上卷按钮向上翻查看代码执行记录。
Keil Vision2提供了2个串行观察窗口,用于PC机与模拟的51单片机窗口通信。从模拟的51单片机的CPU串口输出的数据,将在这个串行窗口中显示,而在串口中输入的字符,将被输入到模拟的51单片机的CPU串口中,利用这一点,可以在没有外部硬件的情况下模拟51单片机CPU的UART。这是一种高级调试技巧,本书不再做详细介绍。
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)