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 发表于 1天前

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

    回答点赞:   wanyanfei1984 举报 评论 1

我来回答

试用推荐

正点原子阿波罗STM32F767开发板

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

距离结束时间:

推荐达人 更多>

  • 王奕 向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 电源技术

完成答题
赶快去开启您的宝箱吧
了解详情