• 已解决 73482 个问题
  • 已帮助 5993 位优秀工程师

关于延时求解?看不懂一位大侠的解释

wanyanfei1984 2018-08-10 浏览量:881
void Delay10ms(void)   //误差 0us
{
    unsigned char abc;
    for(c=1;c>0;c--)
        for(b=38;b>0;b--)
            for(a=130;a>0;a--);
}
计算分析:

程序共有三层循环

一层循环n:R5*2 = 130*2 = 260us DJNZ 2us                                                               ​这里130*2是干啥? 后面DJNZ啥意思?

二层循环m:R6*(n+3) = 38*263 = 9994us DJNZ 2us + R5赋值 1us = 3us                    这里(n+3)啥意思?DJINZ后面的什么意思?

三层循环: R7*(m+3) = 1*9997 = 9997us DJNZ 2us + R6赋值 1us = 3us                     

循环外: 5us 子程序调用 2us + 子程序返回 2us + R7赋值 1us = 5us                                这里面的都是干啥的?

延时总时间 = 三层循环 + 循环外 = 9997+5 = 10002us =10.002ms

计算公式:延时时间=[(2*R5+3)*R6+3]*R7+5

//误差 2us
0 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
最佳答案
  • 这个其实就是根据汇编来推算延时时间的.

    每一条汇编指令执行的时间是确定的.因此就可以根据指令的数量来精确定时.

    • 发布于 2018-08-10
    • 举报
    • 评论 0
    • 1
    • 0

其他答案 数量:12
  • C语言这样的延时,是不准确的,想要准确的延时,可以用定时器,滴答时钟来做。


    C语言,在编译的时候,会由编译器转化为汇编语言。汇编语言是可以精确指令的执行时间。

    但是由于编译器的版本,优化方式,可能就造成延时不一样。

    • 发布于2018-08-10
    • 举报
    • 评论 0
    • 1
    • 0

  • 这里面的语句是为了保证整个处理过程总时间(加上调用)更接近10ms的特殊处理,所谓的误差0us是不可能的。

    注释部分是解释为什么有这样的设定,里面的2us之类是单个过程处理的时间(根据编译后指令和单条指令需要时间计算出来的)

    • 发布于2018-08-10
    • 举报
    • 评论 0
    • 1
    • 0

  • 计算分析部分,是拿汇编代码分析的,汇编代码和分析对照看,就明白了
    • 发布于2018-08-11
    • 举报
    • 评论 0
    • 1
    • 0

  • 这个是C语言的阻塞式延时,这个和你的操作方式有关,如果要精确定时,直接使用定时器来操作
    • 发布于2018-08-11
    • 举报
    • 评论 0
    • 1
    • 0

  • 就是计算一条指令有多少cpu时间 然后计算有多少循环
    • 发布于2018-08-11
    • 举报
    • 评论 0
    • 1
    • 0

  • 这种是精准的延时计算方法,它将程序跳转执行时间都算进去了
    • 发布于2018-08-13
    • 举报
    • 评论 0
    • 1
    • 0

  • 最好是要用定时器来进行延时,你这样的阻塞式延时会导致系统不能及时响应
    • 发布于2018-08-15
    • 举报
    • 评论 0
    • 0
    • 0

  • 汇编的延时很多都是不精准的,推荐用定时器来操作
    • 发布于2018-08-17
    • 举报
    • 评论 0
    • 0
    • 0

  • 延时不要这样操作,直接用定时器来定时比较好
    • 发布于2018-08-27
    • 举报
    • 评论 0
    • 0
    • 0

  • 这个是三层循环,总的延时是三层循环次数的乘积。
    • 发布于2018-08-31
    • 举报
    • 评论 0
    • 0
    • 0

  • 这里的注释是在解释这个精确延时是如何得到的

    每一条C语言都对应着汇编指令

    而汇编指令的运行时间是已知的,单位是机器周期(1/主频)

    注释里的公示就是计算全部循环的机器指令周期  最后乘以周期的时间得到精确延时

    • 发布于2018-09-09
    • 举报
    • 评论 0
    • 0
    • 0

相关问题

问题达人换一批

关于延时求解?看不懂一位大侠的解释