您的位置  > 互联网

调用f并执行到i=2时出现问题

稍后您可以看到,调用 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。

本文为原创,首次发表,请勿用于商业用途!