Keil是业界公认的开发51单片机C语言的有用工具,它的软件仿真功能可以在程序开发过程中模拟程序在芯片运行时的各种状态和功能,使得大部分功能程序所存在的问题在软件编写调试时就能及时发现,从而避免了程序烧录到芯片后在电路上运行时才被发现。本文介绍如何在Keil中计算单片机程序的执行时间。
如图1所示,我们要计算其中的for(b=0;b<50000;b++)这个循环语句运行所花的时间。通常同一段程序使用不同的晶体振荡器,所以程序执行要花的时间也不同,晶体振荡器的频率越高花的时间越短。假设电路中所用的晶体振荡器为12M,要使用Keil计算程序执行时间,先要设置一下项目中所使用的晶体振荡器频率,方法如图2、图3所示。



设置好后,在要计算时间的程序段前后设两个断点,然后运行程序,开始软件仿真。按图4中标识的1和2分别打开汇编代码和程序效率评估窗口。Keil在编译C代码的同时也会生成用于方便调试的汇编和机器代码,可以用Disassembly窗口查看。

从图5中可以看到,程序运行到第一个断点,即所要计算的程序段的开始处,用了389μs。运行到第二个断点用了1.850425秒,见图6。


用结束处的时间减去开始时间就得到要算程序段所用的时间1.850036秒。用这个方法可以仿真出任何频率下的任何指令或程序运行所需要的时间。代码的运行时间也可以通过左边工具栏中的“SEC”来查看(见图7),效果和效率评估窗口是一样的,只是全速运行时数字不会变化。有一些初学者会以为for、while等语句只占用一两个机器周期,有N次循环就要用N个机器周期,其实不然。从Keil的编译窗口可以看到这些C语句被编译时所需要的机器周期,例如一个for循环通常会用掉8个或更多的周期。

文/温正伟