稍后您可以看到,调用 f(3) 时也会出现相同的情况,因此我们在定位 1/i 时遇到了问题。 我们知道 1/i 的类型取决于 i。 如果i定义为整数,那么1/i的结果一定是,而且这里i必须是整数,不能修改为浮点类型。 因此,如果结果是浮点类型,则只能将1修改为浮点类型。 所以把1改成1.0。
重新编译并运行。 结果如图5所示,程序输出正确。
图5:修改后的程序运行结果
上面的程序还有一个调试技巧。 将f()函数的内部代码放在main函数中进行调试。 程序正常后,写入函数。 这也是一个非常实用的编程技巧!
2. 逐进程执行
点击“调试”菜单下的“逐进程”,或者按F10键,进入逐进程调试模式! 看下面的视频可以看出,单步执行的过程并没有进入子函数f的内部,而是将函数作为一条语句来执行。 由此我们也可以看到调用函数返回的结果。
3、断点
在调试过程中,当某条语句需要暂停时,可以使用断点功能。 单击要设置断点的行,然后按 F9 键设置断点。 如果已经设置了断点,则在该行按 F9。 键取消断点。
断点可以分为两类:条件断点和无限制断点。 这个功能在嵌入式开发中非常有用。 以下程序使 LED 亮起一秒钟,关闭一秒钟,然后闪烁。 使用计时器是一种方法,但有点复杂。 延迟可以通过程序来实现。 该程序更容易使用,设计也相对简单。 如何准确使用该程序? 我们利用断点功能来实现精确计时。
//----------------------------------------------------------------- // 名称: 闪烁的LED //----------------------------------------------------------------- // 说明: LED按设定的时间间隔闪烁 // //----------------------------------------------------------------- #include#define UC unsigned char #define UI unsigned int #define UL unsigned long sbit LED = P0^0; //LED连接在P2.0引脚 //----------------------------------------------------------------- // 延时函数 //----------------------------------------------------------------- void delay_ms(UL x) { UC t; while(x--) { for(t=0;t<125t++) { ; } } } //----------------------------------------------------------------- // 主程序 //----------------------------------------------------------------- void main() { while(1) { LED=~LED; delay_ms(1000); } }
(UL x)是1毫秒延迟程序。 要实现精确计时,需要调整虚函数的循环次数,即t的值。 调试方法如下。
1.开始调试
首先启动keil C调试,见图6。调试前,单片机的晶振必须配置为12MHz。 如果使用其他晶振,则需根据实际情况进行配置。
图6:开始调试
2.设置断点
将光标移动到图中位置,按F9设置断点,如图
图 7:设置断点
3.对函数执行单步并记录运行时间T1
按F11单步到(1000),见图8,记录运行时间T1=0。 秒。
图8:函数开始运行之前的时间
4、执行函数(1000)并记录运行结束时间T2
按F5继续执行到断点处,见图9
图 9:到断点的执行时间
T1=1。 第二,
5.计算误差并调整t值,直至满足要求。
T2-T1=1.-0.=1.秒
调用 (1000) 应精确到 1 秒。 可见时间实在是太长了。 我们将函数中的t值调整为120,再次重复之前的调试过程。 结果 T2-T1 值为 1,误差为 0。
可见时间实在是太长了。 我们将函数中的t值调整为119,并重复前面的调试过程。 所得 T2-T1 值为
0.,错误-0.,
因此,t值119是最准确的,120也可以接受。 不过,你要知道119太小,120又太大。 可根据具体情况使用。 通常我们用120。
本文为原创,首次发表,请勿用于商业用途!