单片机Keil软件仿真与调试技巧
5.调试程序
源程序编译通过,表明语法正确,却并不能保证该程序能够正确运行。还需要对其逻辑功能进行调试。Keil软件具有很强的软件仿真功能。
鼠标左击主菜单Debug一>Sta№top DebugSession子菜单或调试/编辑模式切换按钮。进入调试程序工作模式,软件窗口如图5所示。重复点击该按钮可以实现在编辑模式和调试模式之间进行切换。
图5程序调试运行。
调试程序时的程序运行控制按钮从左到右依次为复位、连续运行,暂停、单步、过程单步、执行完当前子程序、运行到光标当前行。复位按钮模拟芯片的复位,它将使程序回到最开头处执行。当程序处于停止状态时复位才有效,程序处于运行状态时停止按钮才有效。
①为了方便观察程序调试过程中各变量和RAM单元的中间结果。点击主菜单View一>WatchCall Stack Window和View一>Memory Window打开观察变量窗13和存储器窗1:3进行显示。由于本例还要观察P1 13的输出变化,可以点击主菜单Peripherals一>I/O-Ports一>Port 1打开I/O 13 P1的观察窗13.
②程序调试。
程序可以单步执行或连续执行。连续执行是指一条指令执行完后接着连续立即执行下一条,中间不停止。这样程序执行的速度很快。可以看到程序执行的总体效果。即最终结果是正确或错误。但如果程序有错,则难以确认具体出错地方。例如本例中点击连续运行按钮后。P1口输出01H后便始终保持不变。这显然与花样彩灯程序的循环显示要求不符。程序运行出错,如图6所示。
图6程序调试时的连续运行。
单步执行指每执行完一条指令后即停止。等待命令执行下一行程序,此时可以观察该条指令执行后得到的实际结果。对比分析是否与预期结果一致。
借此可以找到程序中的错误原因所在。这种方式的缺点是需要时间长,排查错误效率很低。尤其当程序很大时。
因此,对于用户确认没有错误的程序段可以采用连续运行。对怀疑出错或容易出错的地方则单步执行。对比排查错误。这样调试的效率将会高一些。
本例通过单步执行。发现程序运行过程中循环变量R3的值总在250和249之间变化,而且R1、R2、R7均始终无变化,如图7所示。对比程序分析,发现出现了死循环。原因在于第1条DJNZR3,DEL2的转移目的地址为DEL2,应该改为DEL3.
图7程序调试时的连续运行。
回到编辑状态,修改为DJNZ R3,DEL3,编译后再次进入调试工作模式时,发现故障已经排除。
评论