目录
软件仿真是利用PC的CPU来模拟单片机的运行,在模拟运行的过程中,通过监测程序的方向、时间、寄存器以及变量值等关键因素来分析程序,找出存在的问题。对于8051单片机进行软件仿真的方法是使用集成开发环境提供的软件模拟器,它不需要有专用的硬件编程器或系统板的配合,可以独立完成单片机的模拟运行,接下来我们就以位操作流水灯的程序为例,来说明如何对8051系列单片机进行软件仿真。
1. μVision2调试器
μVision2集成开发环境中集成了专用的调试器,其内部有一个高速的软件模拟器,可以模拟整个8051单片机CPU、片上外围器件和寄存器的运行,并可以直观地查看程序运行时单片机的状态。
μVision2集成开发环境有两种工作模式,一种是创建模式,它是μVision2集成开发环境默认的工作模式,在为8051系列单片机开发应用程序时使用的是创建模式。
另一种工作模式是调试模式,用于对创建模式下编译完成的程序代码进行仿真调试。
这里需要说明的是,调试的过程不是软件开发所必需的,只有当我们有需要的时候才进入到该状态。为了得到正确的仿真结果,在进入到调试模式之前,需要完成以下两个步骤的设置:
1)更改晶振频率。方法是单击工具栏上的“目标选项”按钮,在“目标”选项卡中将晶振的频率设成和系统板一致的11.0592M,具体方法如图:
2)编译应用程序。程序在开始调试前需要进行一次成功的编译,以使所有的设置和代码生效,成功编译后会有相应提示,如图:
2. 调试工具
在更改了晶振频率并对程序进行正确编译后,就可以开始仿真调试了。首先需要将集成开发环境置于调试模式,方法是单击工具栏上的“开始/停止调试”按钮,将集成开发环境置于调试模式,如图
进入到调试模式后,软件界面有两个明显的变化,一个是工具栏上的“建造工具”按钮组会被“调试工具”按钮组替代,另一个是黄色的程序指针会出现在主函数的入口处,如图
在μVision2集成开发环境下调试任务可以通过使用按钮来完成,这些按钮如图所示,按钮所能实现的功能也可以在“调试”菜单中找到。
在μVision5集成开发环境下:
以下,我们要分别介绍一下这些调试按钮的功能:
1) 复位:复位后单片机各寄存器恢复到默认设置,RAM全部清零。
2)运行:程序开始全速运行,遇到断点或按下“停止”按钮会停止运行。
3)暂停:当程序处于运行状态时,执行此命令将中止程序的运行。当程序停止时,所有窗口中的信息将会被更新。
4) 跟踪:单步跟踪运行程序。每次按下该按钮,程序都会执行一条指令,如果待运行的语句是调用子函数的语句,使用“跟踪”按钮将会进入子函数的内部运行程序。
5) 单步:单步执行程序,跳过子函数。与“跟踪”功能相似,每按下一次该按钮,程序都会执行一条指令,但在运行子函数时,不会进入到子函数内部,而是将子函数作为一步执行完毕,程序指针指向下一条语句。
6) 运行到退出:单步运行并跳出子程序。如果程序当前运行在子函数内部,使用“运行到退出”按钮将会全速完成该子函数的运行并退出子函数,程序指针指向下一条语句。
7) 运行到光标行:程序将运行到光标所在位置。
8) 下一状态:表明该程序指针指示的程序行将在下一步时运行。
9) 使能/禁止跟踪记录:使能或禁止程序运行轨迹的标识。
10) 观察跟踪记录:观察程序运行的轨迹。
11) 反汇编窗口:将C代码反汇编为汇编代码并在编辑器中进行察看。
12) 查看调用堆栈窗口:打开调用堆栈 窗口。
13) 代码覆盖窗口:打开代码覆盖窗口。
14)串行口窗口:打开串行口窗口。
15) 存储器窗口:打开存储器窗口。
16) 性能分析器窗口:打开设置性能分析的窗口。
17) 工具栏:打开工具栏更新窗口。
3. 单步调试
以下将使用调试工具按钮,让程序在我们的控制下分步运行,并观察程序运行时间的变化。
1)进入调试模式后,我们会发现程序指针已经停留在主函数的第一个程序行前,程序运行到此处,花费的时间为0.00042209s,即422.09μs,如图:
2)单击“复位”按钮,各寄存器恢复为初始状态,时间从0开始,如图
3)单击“单步”按钮,程序运行至主函数的程序入口处,所用时间是422.09μs,如图
4)单击“单步”按钮,程序执行到下一步,所用时间是423.18μs,程序从上一步运行到这里,所用时间为1.09μs,如图
5)单击“单步”按钮,程序执行下一步,所用时间是424.26μs。程序从上一步运行到这里,所用时间同样为1.08μs,如图
6)多次单击“单步”按钮,程序执行至延时函数之后,所用时间变为441523.44μs,据此我们可以大致推断出延时函数的延时时间为441ms。更改延时函数的入口参数,多次使用软件调试的方法,可以将延时函数的延时时间精确地调整为500ms,如图
4. 使用断点调试
为了便于调试,我们通常会**在程序里设置一个或多个断点(Breakpoint),程序运行至断点处会停止,再次启动时程序会从断点处继续运行。**设置断点的方法有几种,最简单的是双击程序行,当程序行的前面出现红色的方块形图标时,断点即设置完成。再次在该程序行上双击鼠标,可以取消该断点,断点的设置和使用方法如下:
1)在要设置断点的地方双击鼠标,就可以在此处设置断点(红色方块)可以在程序行前点击鼠标 右键
,在出现的菜单中选择“插入/删除断点”项来设置断点
,如图
2)单击“运行”按钮,让程序全速运行,当程序运行至断点处时会自动停止。
3)再次单击“运行”按钮,程序执行完后,又回到断点处停止。
4)在已经设置了断点的程序行上,再次在鼠标右键菜单中,选择“插入/删除断点”项来取消断点,或选择“有效/禁止断点项”来使能或失能断点,同样的功能也可以在“调试”菜单中找到,如图
5. 使用监视窗口调试
在调试的过程中,可以使用观察窗口来查看寄存器的状态、时间值、变量值等。打开观察窗口的方法可以使用调试工具栏上的相关按钮,也可以在“视图”和“外围设备”菜单中打开。使用监视窗口进行调试的方法如下:
6. 调试按钮的功能
在调试工具栏上,有四个按钮从外观上看有着相似之处,它们分别为:“单步”“跟踪”“运行到退出”和“运行到光标行”按钮。
1.“单步”按钮
这个按钮的英文名字为“step over”,意思就是单步运行完一条指令的意思,如果待运行的语句是调用子程序的语句,使用“单步”按钮将全速运行完该子程序,并停在下一条指令处。也就是说,使用“单步”按钮,执行到调用子程序语句时,也只是用一步就执行完成,程序指针指向下一条语句上。
2.“跟踪”按钮
“跟踪”按钮在英文名称是“step into”,意思为单步跟踪运行一条指令,如果待运行的语句是调用子程序的语句,使用“跟踪”按钮将会跟踪进入子程序的内部。
3.“运行到退出”按钮
“运行到退出”按钮英文名称是“step out”,意思是“单步全速运行并跳出子程序”。
如果当前运行的是调用子程序的语句,使用“单步全速运行并跳出子程序”按钮将会全速完成子程序的运行,停在调用子程序语句的下面一行上。
例如:当程序指针运行至延时函数内部时,按下“运行到退出”按钮,程序会立即运行完延时函数,跳转到主程序中,并指向调用“delay_ms(500); ”语句的下面一行,如图。
4.“运行到光标行”按钮
在程序调试时,我们将光标放置在我们想让程序到达的地方,点击“运行到光标行”按钮,程序全会全速运行到光标所在位置,并且停留在这一行上,如图。
参考资料
- [1] 《迷人的8051单片机》