5219|1

23

帖子

3

TA的资源

一粒金砂(中级)

楼主
 

软件延时:for循环中使用不同的参数,延时有很大的差异 [复制链接]

while(1)
    {
     GPIO_SetBits(GPIOG, GPIO_Pin_1);

      //延时1ms的程序
         for(count =0 ; count < 6; count++)
    {
            for(i = 0; i < 1000; i++);
    }
      
    //SET TO LOW
    GPIO_ResetBits(GPIOG, GPIO_Pin_1);
   
    //延时1ms的程序
         for(count =0 ; count < 6; count++)
    {
        for(i = 0; i < 1000; i++);
    }
}






while(1)
    {
      GPIO_SetBits(GPIOG, GPIO_Pin_1);
      //延时1ms的程序
         for(count =0 ; count < 1; count++)
    {
            for(i = 0; i < 6000; i++);
    }
       GPIO_ResetBits(GPIOG, GPIO_Pin_1);
    //延时1ms的程序
         for(count =0 ; count <1; count++)
    {
        for(i = 0; i < 6000; i++);
    }

  }
只是修改了一下参数,G1脚高电平持续的时间,变化很大,这是什么原因呢?

1jpg.jpg (525.61 KB, 下载次数: 0)

示波器观察G1脚的电平

示波器观察G1脚的电平

2.jpg (537.19 KB, 下载次数: 0)

示波器观察G1脚的电平

示波器观察G1脚的电平
此帖出自stm32/stm8论坛

最新回复

         for(count =0 ; count < 6; count++)     {         for(i = 0; i < 1000; i++);     } 和          for(count =0 ; count < 1; count++)     {         for(i = 0; i < 6000; i++);     } 它们判断的所执行的时间是不一样的,不是简单的6*1000*指令周期或则1*6000*指令周期,两种写法在翻译成汇编之后的代码是不一样多的。 对于这两个来说,内层for循环执行一次所需要的时间是一样的,但是,因为外层for循环的次数不同,那么从内层跳到外层判断的次数就不同,第一个为7次,第二个为2次,(应该是这样,表示不是这个专业的,C不怎么好)就是因为这个,在跳转的时候,跳转一次所用的时间并不是一个指令周期的时间,假设为X,那么真正的时间或许应该是6*(1000+X)+X,1*(6000+X )+X,这里只能说或许是这样,具体是啥样,我还是不清楚,或许你用不同的编译器编译出来它们还有差别,更有甚者我在学51的时候,同样的for循环嵌套使用,前后两次编译出来得到的结果不一样。建议哈,要求不高的定时函数,可以用for写,最好是不要嵌套,如果实在不够,可以多调用几次嘛,while也行啊。要求高的还是用定时器写,准确,还不容易跑飞。有些函数,别人写好的,里面的参数还是不要改得好,自己写,有助于自己学习。  详情 回复 发表于 2015-5-13 17:38
点赞 关注
 

回复
举报

27

帖子

1

TA的资源

一粒金砂(中级)

沙发
 
         for(count =0 ; count < 6; count++)
    {
        for(i = 0; i < 1000; i++);
    }

         for(count =0 ; count < 1; count++)
    {
        for(i = 0; i < 6000; i++);
    }
它们判断的所执行的时间是不一样的,不是简单的6*1000*指令周期或则1*6000*指令周期,两种写法在翻译成汇编之后的代码是不一样多的。
对于这两个来说,内层for循环执行一次所需要的时间是一样的,但是,因为外层for循环的次数不同,那么从内层跳到外层判断的次数就不同,第一个为7次,第二个为2次,(应该是这样,表示不是这个专业的,C不怎么好)就是因为这个,在跳转的时候,跳转一次所用的时间并不是一个指令周期的时间,假设为X,那么真正的时间或许应该是6*(1000+X)+X,1*(6000+X )+X,这里只能说或许是这样,具体是啥样,我还是不清楚,或许你用不同的编译器编译出来它们还有差别,更有甚者我在学51的时候,同样的for循环嵌套使用,前后两次编译出来得到的结果不一样。建议哈,要求不高的定时函数,可以用for写,最好是不要嵌套,如果实在不够,可以多调用几次嘛,while也行啊。要求高的还是用定时器写,准确,还不容易跑飞。有些函数,别人写好的,里面的参数还是不要改得好,自己写,有助于自己学习。
此帖出自stm32/stm8论坛

赞赏

1

查看全部赞赏

 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表