智能车制作

标题: 高手进,程序运行时间的计算!一个程序员的必须素质... [打印本页]

作者: 尕玍紿    时间: 2013-12-17 10:29
标题: 高手进,程序运行时间的计算!一个程序员的必须素质...
出来实习了,老程序员说:“做嵌入式开发,对时间的掌控十分重要,必须清楚段程序所耗费的时间”。
所以,就来这开个讨论区,大家来讨论讨论,怎么计算一段程序所耗费的时间?
我的思路:
1.程序开头加启动计时,程序结束加停止计时,查看计数寄存器,再换算出时间。
  (优点准确。缺点:麻烦,要配置定时器,又要计算,一大堆琐碎事,一漏点什么就出错了,且相对较长时间的计时就更烦了。)
2.程序开头、结尾对一个引脚取反,测该脚频率,从而算出时间
  (优点:简单、快捷。 缺点:要示波器,我没这器材!找了个基于声卡的虚拟示波器,结果限制太大,不能测高频率的)
3.用机器周期计算,找出程序汇编语言对应的代码量,然后乘以一条语句所需时间即可。
  (这点我不太会,对汇编不太熟悉,所以程序所对应的汇编代码段也不大清楚,所以这个代码量不会算。另外一条语句所需时间也不大确定:懂的帮我看下这样对不对:(我的系统频率是超频到211MHz)所以一条汇编所需时间是:((1/211)*12)us(一个机器周期等于12个PLL脉冲)

作者: 野火    时间: 2013-12-17 10:37
必须的 ,必要的时候,空间换时间……
作者: 龙猫    时间: 2013-12-17 10:38
机器周期等于12个PLL脉冲这个怎么得出来的啊,时间计算我也有点疑惑
作者: 尕玍紿    时间: 2013-12-17 10:41
野火 发表于 2013-12-17 10:37
必须的 ,必要的时候,空间换时间……

火爷指点下呗...
第三点,具体该怎么做啊?怎么通过指令计算出时间

作者: 尕玍紿    时间: 2013-12-17 10:44
龙猫 发表于 2013-12-17 10:38
机器周期等于12个PLL脉冲这个怎么得出来的啊,时间计算我也有点疑惑

额...我说了不大确定的。
印象中是这样的:
指令分:单周期指令、双周期指令、多周期指令
单周期指令运行需要一个机器周期。(现在大多都是单周期指令,其它的约等于就好了。)
而一个机器周期就是12个PLL脉冲。至于为什么?我只能说,机器周期就是这么定义的:12个脉冲为一个机器周期。

不保证我说的是对的,四年前的记忆,也不知道有没有记错!

作者: 野火    时间: 2013-12-17 10:51
尕玍紿 发表于 2013-12-17 10:41
火爷指点下呗...
第三点,具体该怎么做啊?怎么通过指令计算出时间

这种 算 指令 的方法,仅仅 适合 代码非常小的情况下,看汇编代码,查表看 对应的时钟周期,这活很累的,除非你对 汇编很熟悉。

如果是 K60 ,用的是 Coertx-M4 内核,就找找 这内核的 数据手册,汇编指令的 说明文档,会有时间说明。

不过 多级流水线 的 单片机,运算时间 靠 这方法,非常吃亏。

作者: 龙猫    时间: 2013-12-17 10:52
尕玍紿 发表于 2013-12-17 10:44
额...我说了不大确定的。
印象中是这样的:
指令分:单周期指令、双周期指令、多周期指令

这个是51的说,arm等单片机都有流水线结构,一个时钟可能就能执行一条语句。

作者: 尕玍紿    时间: 2013-12-17 11:10
野火 发表于 2013-12-17 10:51
这种 算 指令 的方法,仅仅 适合 代码非常小的情况下,看汇编代码,查表看 对应的时钟周期,这活很累的, ...

这么麻烦...怪不得我算出来的结果这么怪,压根不正确。
火爷 能不能给点经验算法:
比如说,一条普通的C语句所需时间是多少?就针对K60来说。
我现在主要是算 采集图像的时间,所以所涉及的语句 无非就是 引脚赋值,读取引脚值。
for(i=0;i<ROW;i++)
{
      for(j=0;j<LINE;j++)
      {
           //1.读取Y值,即灰度值
            FIFO_RD_L(); ;
            Image_Data[j] = GPIO_GET_8bit(PORTD,0);//读取图像数据PORTD0-PORTD7
            IFO_RD_H();  
            //2.读取U或V值,这里直接舍弃
            FIFO_RD_L(); ;
            FIFO_RD_H();
      }
}


作者: 野火    时间: 2013-12-17 11:16
尕玍紿 发表于 2013-12-17 11:10
这么麻烦...怪不得我算出来的结果这么怪,压根不正确。
火爷 能不能给点经验算法:
比如说,一条普通的 ...

直接 用 计时器 测吧 ! 参考我们的程序,可以用 pit 和 lptmr 来测。(PIT 比较准)

作者: 吢冇紷蒠    时间: 2013-12-17 11:35
菜鸟飘过
作者: wolflsh    时间: 2013-12-17 11:58
本帖最后由 wolflsh 于 2013-12-17 12:00 编辑

好吧。。这个可以有
作者: yandld    时间: 2013-12-17 15:41
用硬件定时测,或者基于硬件计数器的 软件Timer. systick lptmr ftm pit 都可以
作者: 我爱小kb    时间: 2013-12-17 18:33
一个机器周期=12个震荡周期是经典51的东西。51好像是cisc结构(复杂指令集)的单片机。我前几天看的avr单片机用的risc结构(精简指令集)每条指令只要一个时钟周期(貌似就是振荡周期)。k60我只能说估计也是精简指令集的(没看手册),所以肯定不是1/12,至于精确计算我这几天也头疼,一直模拟不正确,也没有示波器用来看求那哪位大神指教指教
作者: 戥家三少    时间: 2013-12-17 18:54
请看《数据结构与算法分析——C语言描述》的第二章,中间有一节就是讲述程序计算时间的问题
作者: yy_tmbh    时间: 2013-12-17 20:15

作者: 若要走    时间: 2013-12-18 09:20

作者: 尕玍紿    时间: 2013-12-18 15:40
我爱小kb 发表于 2013-12-17 18:33
一个机器周期=12个震荡周期是经典51的东西。51好像是cisc结构(复杂指令集)的单片机。我前几天看的avr单片 ...

示波器的话,下个虚拟示波器咯,不过只能测2MHz以内的信号。
直接百度:声卡虚拟示波器就好了。然后自己用耳机线做条信号线就好了,我就是这样的...

作者: 我爱小kb    时间: 2013-12-19 22:39
尕玍紿 发表于 2013-12-18 15:40
示波器的话,下个虚拟示波器咯,不过只能测2MHz以内的信号。
直接百度:声卡虚拟示波器就好了。然后自己 ...

求个详细点的,没接触过这个,2Mhz够我用了。耳机线是插到电脑的麦克风输入口吗?会不会万一电压电流过大把电脑烧了??或者该怎么弄?其他的我先百度看看
作者: 尕玍紿    时间: 2013-12-22 15:07
我爱小kb 发表于 2013-12-19 22:39
求个详细点的,没接触过这个,2Mhz够我用了。耳机线是插到电脑的麦克风输入口吗?会不会万一电压电流过大 ...

[attach]53735[/attach]
我百度下的,你看看适不适合吧。解压就能用了!
耳机线直接插到电脑“麦克风/话筒”输入口(粉红色的)就行了
至于对电脑伤害方面,只要你输入的东西有保证,那就没问题了,当然你一不小心给它输入个大电流的信号那肯定是不行 的!用来测MCU输出的PWM的信号那是没问题的...

作者: 我爱小kb    时间: 2013-12-23 10:51
尕玍紿 发表于 2013-12-22 15:07
我百度下的,你看看适不适合吧。解压就能用了!
耳机线直接插到电脑“麦克风/话筒”输入口(粉红色的) ...

嗯嗯太谢谢你啦,我也查了,可还是不明白那个44100Hz和你说的最高2MHz是什么关系?

作者: 尕玍紿    时间: 2013-12-23 15:36
我爱小kb 发表于 2013-12-23 10:51
嗯嗯太谢谢你啦,我也查了,可还是不明白那个44100Hz和你说的最高2MHz是什么关系?

上限可能会有所不同吧...
由自己电脑声卡的采集频率决定的。

作者: 我爱小kb    时间: 2013-12-23 21:38
尕玍紿 发表于 2013-12-23 15:36
上限可能会有所不同吧...
由自己电脑声卡的采集频率决定的。

貌似现在电脑标配频率是44.1KHZ,和2兆差几十倍呢,你的两兆赫兹是你用的吗?输入还是输出?我感觉我也只要输入能达到兆级别就够用了。




欢迎光临 智能车制作 (http://dns.znczz.com/) Powered by Discuz! X3.2