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

最佳答案

  • Andrewz 发表于2018-08-10

    这个其实就是根据汇编来推算延时时间的.

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

    回答点赞:   wanyanfei1984 举报 评论 1

其他答案

  • 向悫 发表于 2018-08-10 云汉达人

    C语言这样的延时,是不准确的,想要准确的延时,可以用定时器,滴答时钟来做。


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

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

    回答点赞:   wanyanfei1984 举报 评论 1

  • xdsnet 发表于 2018-08-10

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

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

    回答点赞:   wanyanfei1984 举报 评论 1

  • robe_zhang 发表于 2018-08-11

    计算分析部分,是拿汇编代码分析的,汇编代码和分析对照看,就明白了

    回答点赞:   wanyanfei1984 举报 评论 1

  • 勇哥来巡山 发表于 2018-08-11

    这个是C语言的阻塞式延时,这个和你的操作方式有关,如果要精确定时,直接使用定时器来操作

    回答点赞:   wanyanfei1984 举报 评论 1

  • lichangle 发表于 2018-08-11

    就是计算一条指令有多少cpu时间 然后计算有多少循环

    回答点赞:   wanyanfei1984 举报 评论 1

  • chen0000009 发表于 2018-08-13

    这种是精准的延时计算方法,它将程序跳转执行时间都算进去了

    回答点赞:   wanyanfei1984 举报 评论 1

  • 喵不是好兔纸 发表于 2018-08-15

    最好是要用定时器来进行延时,你这样的阻塞式延时会导致系统不能及时响应

    举报 评论 0

  • bigCQ 发表于 2018-08-17

    汇编的延时很多都是不精准的,推荐用定时器来操作

    举报 评论 0

  • 菜鸟冷虎 发表于 2018-08-27

    延时不要这样操作,直接用定时器来定时比较好

    举报 评论 0

  • yhj416606438 发表于 2018-08-28

    这个延时不准,最好用定时器来延时

    举报 评论 0

  • drepa 发表于 2018-08-31

    这个是三层循环,总的延时是三层循环次数的乘积。

    举报 评论 0

  • 哇咔YG 发表于 2018-09-09

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

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

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

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

    举报 评论 0

我来回答

试用推荐

正点原子阿波罗STM32F767开发板

产品总数:3个  申请人数:133

距离结束时间:

推荐达人 更多>

  • 王奕 向ta提问

    Eagleson

    在学习FPGA的道路上 我们一起成长吧!

    在行: FPGA/CPLD

  • 靳飞 向ta提问

    汉云

    在路上的Linuxer

    在行: DSP技术 Linux 系统 STM32讨论区 PIC单片机 PCB技术/设计/定制

  • Angel Cherry 向ta提问

    MOP

    用愛和熱忱寫好每一行Code

    在行: FPGA/CPLD Linux 系统 热门单片机

  • 徐珂靖 向ta提问

    xukejing

    Linux系统 、热门开发板

    在行: Linux 系统

  • 袁建明 向ta提问

    河北博联科技有限公司 研发部经理

    日知其所亡

    在行: Linux 系统 灵动微MCU 电源技术

完成答题
赶快去开启您的宝箱吧
问答积分兑换板卡