标题: 单片机执行C语言时间计算 [打印本页]

作者: 蓝野    时间: 2017-9-29 15:32
标题: 单片机执行C语言时间计算
1T模式,16M赫兹的单片机,在c语言编程做延时运算,使用do while结构void Delay200ms()                //@16MHz{
        unsigned char i, j, k;

        i = 13;
        j = 41;
        k = 198;
        do
        {
                do
                {
                        while (--k);
                } while (--j);
        } while (--i);
}
这个时间是怎么推算出来的呀?





作者: luoluoluo136    时间: 2017-9-29 16:32
根据运行一个指令的时间,然后计算这个程序运行了多少个指令。如果你用的是STC的单片机的话,它的那个下载工具里面有自动帮你计算的工具。
作者: dzbj    时间: 2017-9-29 19:26
在c下写这种延时 设定好运行频率用c仿真 看经过多少时间 估计出来的 在c下全c的语句很难精确计算时间 不知道c怎么编译
作者: zl2168    时间: 2017-9-29 21:48
keil  c中,系统特殊寄存器组“Sys”中有一项“sec”和“states”,可查看程序执行时间和运行周期数。例如,执行到延时子程序时,记录进入该子程序的sec值,然后按过程单步键,快速执行该子程序完毕,再读取sec值,两者之差,即为该子程序执行时间。也可根据周期数states与图2-8中设置的晶振频率计算程序运行时间。以上摘自张志良编著《80C51单片机实用教程——基于Keil C和Proteus》高等教育出版社ISBN 978-7-04-044532-9, 用于学习51单片机原理,程序(双解c和汇编)语句条条有注解,便于阅读理解,便于自学。
作者: 蓝野    时间: 2017-9-29 22:07
luoluoluo136 发表于 2017-9-29 16:32
根据运行一个指令的时间,然后计算这个程序运行了多少个指令。如果你用的是STC的单片机的话,它的那个下载 ...

“根据运行一个指令的时间,然后计算这个程序运行了多少个指令。“这个我能理解;关键是指令语言是相对汇编而言,而不同结构的C语言反汇编会有不同的指令语句,那么我的问题就变成了:是否有一种直接的规则针对不同的C语言结构对应出相应的执行时间?
作者: 蓝野    时间: 2017-9-29 22:10
luoluoluo136 发表于 2017-9-29 16:32
根据运行一个指令的时间,然后计算这个程序运行了多少个指令。如果你用的是STC的单片机的话,它的那个下载 ...

还有一个问题,关于你的第二个回答,这是STC芯片。这是一个已经存在的时间延时函数,假如我要用此芯片延时300us,该怎么进行修改,就在此模式下,就是说怎么计算?

作者: 蓝野    时间: 2017-9-29 22:12
dzbj 发表于 2017-9-29 19:26
在c下写这种延时 设定好运行频率用c仿真 看经过多少时间 估计出来的 在c下全c的语句很难精确计算时间 不知 ...

这个其实在调试的时候,可以通过反汇编可以看到执行的时间,关键是怎么设计延时,假如我要延时300us该怎么搞?


作者: yzwzfyz    时间: 2017-9-30 00:40
简单,编译器生成汇编后,就能看出来了。这样就可以增删了。
作者: 爱吃饺子    时间: 2017-9-30 01:42
有个调试的功能  keil  里面     可以看到花了多少时间
作者: HC6800-ES-V2.0    时间: 2017-9-30 08:33
这是个很专业的问题,我回答不了,但我知道怎么去找答案!
STC的下载软件,功能是很强大的,其中就有这个延时函数的自动生成功能。
在软件右上角,有很多功能的页面,其中就有“软件延时计算器”,我截个图,你自己看看。
当然,如果你是想自己掌握这个时间,那我就帮不了你了。

1.jpg (26.99 KB, 下载次数: 83)

1.jpg

作者: jiajuntao    时间: 2017-9-30 11:48
反编码,能够得到时间值;
作者: angmall    时间: 2017-10-1 13:02

  1. void Delay300us()                //@16.000MHz
  2. {
  3.         unsigned char i, j;

  4.         i = 5;
  5.         j = 168;
  6.         do
  7.         {
  8.                 while (--j);
  9.         } while (--i);
  10. }
复制代码


  1. DELAY300US:                        ;@16.000MHz
  2.         NOP
  3.         PUSH 30H
  4.         PUSH 31H
  5.         MOV 30H,#4
  6.         MOV 31H,#183
  7. NEXT:
  8.         DJNZ 31H,NEXT
  9.         DJNZ 30H,NEXT
  10.         POP 31H
  11.         POP 30H
  12.         RET
复制代码

作者: 924    时间: 2017-10-10 15:30
void Delay300us()                //@16.000MHz




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1