智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 5390|回复: 21
打印 上一主题 下一主题

高手进,程序运行时间的计算!一个程序员的必须素质...

  [复制链接]

50

主题

198

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1393
威望
690
贡献
439
兑换币
386
注册时间
2013-3-6
在线时间
132 小时
毕业学校
北京师范大学珠海分校
跳转到指定楼层
1#
发表于 2013-12-17 10:29:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
出来实习了,老程序员说:“做嵌入式开发,对时间的掌控十分重要,必须清楚段程序所耗费的时间”。
所以,就来这开个讨论区,大家来讨论讨论,怎么计算一段程序所耗费的时间?
我的思路:
1.程序开头加启动计时,程序结束加停止计时,查看计数寄存器,再换算出时间。
  (优点准确。缺点:麻烦,要配置定时器,又要计算,一大堆琐碎事,一漏点什么就出错了,且相对较长时间的计时就更烦了。)
2.程序开头、结尾对一个引脚取反,测该脚频率,从而算出时间
  (优点:简单、快捷。 缺点:要示波器,我没这器材!找了个基于声卡的虚拟示波器,结果限制太大,不能测高频率的)
3.用机器周期计算,找出程序汇编语言对应的代码量,然后乘以一条语句所需时间即可。
  (这点我不太会,对汇编不太熟悉,所以程序所对应的汇编代码段也不大清楚,所以这个代码量不会算。另外一条语句所需时间也不大确定:懂的帮我看下这样对不对:(我的系统频率是超频到211MHz)所以一条汇编所需时间是:((1/211)*12)us(一个机器周期等于12个PLL脉冲)

22

主题

1613

帖子

1

精华

跨届大侠

Rank: 10Rank: 10Rank: 10

积分
6784
QQ
威望
2910
贡献
1540
兑换币
1579
注册时间
2012-3-17
在线时间
1167 小时
2#
发表于 2013-12-17 10:37:56 | 只看该作者
必须的 ,必要的时候,空间换时间……
回复 支持 反对

使用道具 举报

0

主题

88

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2882
威望
1401
贡献
887
兑换币
573
注册时间
2012-3-27
在线时间
297 小时
3#
发表于 2013-12-17 10:38:04 | 只看该作者
机器周期等于12个PLL脉冲这个怎么得出来的啊,时间计算我也有点疑惑
回复 支持 反对

使用道具 举报

50

主题

198

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1393
威望
690
贡献
439
兑换币
386
注册时间
2013-3-6
在线时间
132 小时
毕业学校
北京师范大学珠海分校
4#
 楼主| 发表于 2013-12-17 10:41:05 | 只看该作者
野火 发表于 2013-12-17 10:37
必须的 ,必要的时候,空间换时间……

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

使用道具 举报

50

主题

198

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1393
威望
690
贡献
439
兑换币
386
注册时间
2013-3-6
在线时间
132 小时
毕业学校
北京师范大学珠海分校
5#
 楼主| 发表于 2013-12-17 10:44:56 | 只看该作者
龙猫 发表于 2013-12-17 10:38
机器周期等于12个PLL脉冲这个怎么得出来的啊,时间计算我也有点疑惑

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

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

使用道具 举报

22

主题

1613

帖子

1

精华

跨届大侠

Rank: 10Rank: 10Rank: 10

积分
6784
QQ
威望
2910
贡献
1540
兑换币
1579
注册时间
2012-3-17
在线时间
1167 小时
6#
发表于 2013-12-17 10:51:25 | 只看该作者
尕玍紿 发表于 2013-12-17 10:41
火爷指点下呗...
第三点,具体该怎么做啊?怎么通过指令计算出时间

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

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

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

使用道具 举报

0

主题

88

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2882
威望
1401
贡献
887
兑换币
573
注册时间
2012-3-27
在线时间
297 小时
7#
发表于 2013-12-17 10:52:31 | 只看该作者
尕玍紿 发表于 2013-12-17 10:44
额...我说了不大确定的。
印象中是这样的:
指令分:单周期指令、双周期指令、多周期指令

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

使用道具 举报

50

主题

198

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1393
威望
690
贡献
439
兑换币
386
注册时间
2013-3-6
在线时间
132 小时
毕业学校
北京师范大学珠海分校
8#
 楼主| 发表于 2013-12-17 11:10:38 | 只看该作者
野火 发表于 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();
      }
}

回复 支持 反对

使用道具 举报

22

主题

1613

帖子

1

精华

跨届大侠

Rank: 10Rank: 10Rank: 10

积分
6784
QQ
威望
2910
贡献
1540
兑换币
1579
注册时间
2012-3-17
在线时间
1167 小时
9#
发表于 2013-12-17 11:16:36 | 只看该作者
尕玍紿 发表于 2013-12-17 11:10
这么麻烦...怪不得我算出来的结果这么怪,压根不正确。
火爷 能不能给点经验算法:
比如说,一条普通的 ...

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

使用道具 举报

30

主题

585

帖子

1

精华

等待验证会员

积分
-8838
威望
-9931
贡献
77
兑换币
46
注册时间
2012-6-23
在线时间
508 小时
10#
发表于 2013-12-17 11:35:06 | 只看该作者
菜鸟飘过
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-11-5 21:54 , Processed in 0.212429 second(s), 31 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表