打印

关于程序运行的时间问题

[复制链接]
3665|24
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
就是我们在用c语言写程序时,比如说你写一个if 或者for什么的,这里的判断需要时间么?具体一点儿if(i<5){i++;}运行下来需呀多少时间,与我单片机的晶振有关系还是什么有关系,写一个delay函数,就是如果用for什么也不做的话写,如果不用示波器测什么的只是计算能准么?要是知道晶振频率的话?看看图片这段程序,如果我用的是1M的晶振,是延时1us么?

5VRF@__HTFX][AXG7_FY8$I.jpg (8.91 KB )

5VRF@__HTFX][AXG7_FY8$I.jpg

相关帖子

沙发
始于16|  楼主 | 2013-7-28 12:00 | 只看该作者
还有如果我要是把delay的for里面的程序写成检测程序或者别的什么的运行的程序时间能准么?

使用特权

评论回复
板凳
liuzhongkai123| | 2013-7-28 14:16 | 只看该作者
可以实现粗略的延时,精确的不行,要精确需要定时器实现。与你的晶振是有关系的,晶振影响你的机器周期是多少,可以软件仿真看一下你的程序运行时间,两个断点测试,然后仔细调整N 的大小

使用特权

评论回复
评分
参与人数 1威望 +3 收起 理由
始于16 + 3
地板
sedatefire| | 2013-7-28 16:49 | 只看该作者
中断恰好进到for里面,会有较大的误差
不同的编译器,不同的程序优化级别,时间都会有影响。

使用特权

评论回复
5
始于16|  楼主 | 2013-7-28 17:12 | 只看该作者
liuzhongkai123 发表于 2013-7-28 14:16
可以实现粗略的延时,精确的不行,要精确需要定时器实现。与你的晶振是有关系的,晶振影响你的机器周期是多 ...

所谓的软件仿真是不是也是示波器一类的用protues之类的看看结果?如果调整n调对了这个值就准了吗?

使用特权

评论回复
6
始于16|  楼主 | 2013-7-28 17:15 | 只看该作者
sedatefire 发表于 2013-7-28 16:49
中断恰好进到for里面,会有较大的误差
不同的编译器,不同的程序优化级别,时间都会有影响。
...

谢谢了,我也想问问是芯片处理问题的计算能力计算时间比如做一个+或-运算时间一定?还是也不一定准?

使用特权

评论回复
7
sedatefire| | 2013-7-28 18:16 | 只看该作者
始于16 发表于 2013-7-28 17:15
谢谢了,我也想问问是芯片处理问题的计算能力计算时间比如做一个+或-运算时间一定?还是也不一定准? ...

不是很明白你想问什么,
反正,一般情况下,如果要精确的延时
1. ns级别的,关中断,nop指令累积起来即可
2. us级别的,关中断,指令--,++都行,每个系统都要示波器去测量过。
3. ms级别的,建议用定时中断。

使用特权

评论回复
8
sedatefire| | 2013-7-28 18:16 | 只看该作者
在延时指令开始和结束处,去翻转一个io,用示波器去量。

使用特权

评论回复
9
worldsing| | 2013-7-28 22:28 | 只看该作者
关中断不好吧?

使用特权

评论回复
10
给我点怒气110| | 2013-7-28 23:36 | 只看该作者
新手路过,学习

使用特权

评论回复
11
始于16|  楼主 | 2013-7-28 23:55 | 只看该作者
sedatefire 发表于 2013-7-28 18:16
不是很明白你想问什么,
反正,一般情况下,如果要精确的延时
1. ns级别的,关中断,nop指令累积起来即可 ...

谢谢版主了,能给一段你写的比较好的ns,us,ms程序吗?就是封装的.c延时程序,想学习一下

使用特权

评论回复
12
始于16|  楼主 | 2013-7-28 23:57 | 只看该作者
sedatefire 发表于 2013-7-28 18:16
在延时指令开始和结束处,去翻转一个io,用示波器去量。

谢谢了,明白了

使用特权

评论回复
13
ccxlslr| | 2013-7-29 09:08 | 只看该作者
说说你是干什么的,什么背景,或许大家才能给你最好的建议。
这是个比较复杂的问题,很难系统性的说明白。
而且稍微明白的人,不会有你这样的想法。说白了,你的想法什么的很白痴。

使用特权

评论回复
14
通宵敲代码| | 2013-7-29 10:47 | 只看该作者
我也想多问一句,用定时器的时候,定时器的复位、设置、装初值等操作会不会造成定时器的延迟,影响精确度啊。

如果是时钟一类的,日积月累的,误差会积累的,用时钟芯片的话,对芯片的读存取操作,会不会也能引起误差呢?

使用特权

评论回复
15
叶伤| | 2013-7-29 14:57 | 只看该作者
通宵敲代码 发表于 2013-7-29 10:47  我也想多问一句,用定时器的时候,定时器的复位、设置、装初值等操作会不会造成定时器的延迟,影响精确度啊 ...

申请中断到进入中断服务程序至少需要3个机器周期时间。还受很多东西影响,比如正在执行多周期指令、正在执行同级或高级中断服务程序。很明显,定时器精确度也不咋地。短时间看不出,但日久生情,会多出一些^ω^

时钟芯片(DS1302)主要由寄存器、控制寄存器、震荡器、实时时钟以及RAM组成。读写时是操作寄存器,不会影响到时钟,一般读写的时间也很短。不过影响到精度的东西很多,晶振、温度都会影响到,做出来的一天差2秒就算不错了。要想稳定必须保证基准准确,这条件一般只能是在实验室存在。

使用特权

评论回复
16
通宵敲代码| | 2013-7-29 15:17 | 只看该作者
叶伤 发表于 2013-7-29 14:57
申请中断到进入中断服务程序至少需要3个机器周期时间。还受很多东西影响,比如正在执行多周期指令、正在 ...

恩,有道理,看来程序也经常不守时啊。

使用特权

评论回复
17
outstanding| | 2013-7-29 15:40 | 只看该作者
仿真不是可以看出么?

使用特权

评论回复
18
wangflw| | 2013-7-29 16:24 | 只看该作者
假如你一个指令周期是1US,那么延迟500ms的软件如下。(以这个为模板,其他的延时时间都不在话下了)
  void delay500ms(void)
  {
  unsigned char i,j,k;
  for(i=15;i>0;i--)
  for(j=202;j>0;j--)
  for(k=81;k>0;k--);
  }
  计算分析:
  程序共有三层循环
  一层循环n:R5*2 = 81*2 = 162us DJNZ 2us
  二层循环m:R6*(n+3) = 202*165 = 33330us DJNZ 2us + R5赋值 1us = 3us
  三层循环: R7*(m+3) = 15*33333 = 499995us DJNZ 2us + R6赋值 1us = 3us
  循环外: 5us 子程序调用 2us + 子程序返回 2us + R7赋值 1us = 5us
  延时总时间 = 三层循环 + 循环外 = 499995+5 = 500000us =500ms
  计算公式:延时时间={[(2*R5+3)*R6+3]*R7+5}*指令周期

使用特权

评论回复
19
wangflw| | 2013-7-29 16:26 | 只看该作者
其实你反汇编一下C代码,可以分析的很清楚。

使用特权

评论回复
20
始于16|  楼主 | 2013-7-29 16:50 | 只看该作者
ccxlslr 发表于 2013-7-29 09:08
说说你是干什么的,什么背景,或许大家才能给你最好的建议。
这是个比较复杂的问题,很难系统性的说明白。
...

这个,貌似是这样,也不是想有什么用,只是突然发现了问题,学生一枚,用atmega16开始学的单片机,大概吧,就这情况

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

9

主题

58

帖子

0

粉丝