打印
[STM32F1]

关于for循环延时的疑问

[复制链接]
2997|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
qsj19921012|  楼主 | 2019-2-18 21:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
今天写芯片驱动时序时,使用for循环语句进行简单的延时,代码如下。用示波器测试了过该函数延时为1.04us。当调用delay_us(10)的时候,示波器测试为7us多,delay_us(100)才70us多。研究了很久不知所以然,按道理说delay_us(100)应该大于100us才对啊,为什么反而还小呢?
void delay_us(u32 nTime)
{
    u32 i,j;
    for(i=0;i<nTime;i++)
   {
       for(j=6;j>0;j--);
   }
}
沙发
二九结狐六体| | 2019-2-19 08:02 | 只看该作者
这个的话,就不清楚喽!

使用特权

评论回复
板凳
狼烟客| | 2019-2-19 13:37 | 只看该作者
运行过程可能被其他时序打乱,而且本身就是不精确延时

使用特权

评论回复
地板
kingkits| | 2019-2-19 15:35 | 只看该作者
第一  你该测试1000ms延时,以此时的延时为准
第二  测试延时的时候你要关中断

使用特权

评论回复
5
liuxiang5119| | 2019-2-19 16:19 | 只看该作者
void delay_us(u32 nTime)
{
    u32 i,j;
    for(i=0;i<nTime;i++)
   {
       for(j=6;j>0;j--);
   }
}

没理解你那个1.04us  是怎么测出来的  

使用特权

评论回复
6
qsj19921012|  楼主 | 2019-2-19 21:23 | 只看该作者
狼烟客 发表于 2019-2-19 13:37
运行过程可能被其他时序打乱,而且本身就是不精确延时

是的,这种延时有可能会被中断打乱的,不精确。

使用特权

评论回复
7
qsj19921012|  楼主 | 2019-2-19 21:30 | 只看该作者
kingkits 发表于 2019-2-19 15:35
第一  你该测试1000ms延时,以此时的延时为准
第二  测试延时的时候你要关中断
...

以1000ms延时为基准,能分析一下为什么么?我测试1us没有关中断,实际用的时候也不可能关掉中断延时吧?因为我是用置高置低电平测试出来的,现在我怀疑是置电平语句占了一定的时间,导致for延时不足1us,然后调用delay_us(1000)时误差就被放大了。

使用特权

评论回复
8
qsj19921012|  楼主 | 2019-2-19 21:31 | 只看该作者
liuxiang5119 发表于 2019-2-19 16:19
void delay_us(u32 nTime)
{
    u32 i,j;

我是用置高置低电平测试出来的,现在我怀疑是置电平语句占了一定的时间,导致for延时不足1us,然后调用delay_us(1000)时误差就被放大了。

使用特权

评论回复
9
admvip| | 2019-2-19 22:04 | 只看该作者
qsj19921012 发表于 2019-2-19 21:31
我是用置高置低电平测试出来的,现在我怀疑是置电平语句占了一定的时间,导致for延时不足1us,然后调用de ...

主要是进出函数,需要一定的时间,10次循环也是进出一次函数,100次循环也是进出一次函数,你第一次测得时间剔除进出函数的时间,才是循环体真正的执行时间。

使用特权

评论回复
10
desertsailor| | 2019-2-19 22:28 | 只看该作者
楼上正解,入栈出栈及跳转要时间,但这个时间并不随你的延时时间变化而变化。

使用特权

评论回复
11
qsj19921012|  楼主 | 2019-2-20 17:36 | 只看该作者
admvip 发表于 2019-2-19 22:04
主要是进出函数,需要一定的时间,10次循环也是进出一次函数,100次循环也是进出一次函数,你第一次测得 ...

明白了,多谢了。

使用特权

评论回复
12
qsj19921012|  楼主 | 2019-2-20 17:38 | 只看该作者
desertsailor 发表于 2019-2-19 22:28
楼上正解,入栈出栈及跳转要时间,但这个时间并不随你的延时时间变化而变化。 ...

以前没有关注过这个问题,现在明白了,谢谢指教。

使用特权

评论回复
13
kiklkmkj| | 2019-2-20 18:46 | 只看该作者
这种延时函数,在延时时间很短时,进出函数的指令会占很大比例,时间长的时候,进出函数的时间还是固定的,但是比例就小很多了。

使用特权

评论回复
14
yediezeus| | 2019-2-21 08:39 | 只看该作者

使用特权

评论回复
15
chenyong123| | 2019-2-21 13:55 | 只看该作者
你示波器所测的1.04US是(进出delay函数时间+IO输出函数时间+你想要的for(+1))的时间总和,实际for语句+1的时间应该等于1/晶振频率,而你示波器测的delay(100)同样是(进出delay函数时间+IO输出函数时间+你想要的for(+100))的时间总和,而并不是1.04*100us。     还有,如果你需要精准的延时,请用定时器。如果你的产品对实时性要求很高,也不要用delay软件延时,因为实时性较高场合一般都要求程序周期为20MS以下。如果你的程序很大,你使用delay软件延时过多,就相当于程序执行效率很低,一直在跑着玩儿。

使用特权

评论回复
16
heimaojingzhang| | 2019-3-6 10:58 | 只看该作者
系统的和咱们自己写的不太一样

使用特权

评论回复
17
keaibukelian| | 2019-3-6 11:31 | 只看该作者
这个涉及到机器指令了吧

使用特权

评论回复
18
labasi| | 2019-3-6 11:35 | 只看该作者
更深层次的问题

使用特权

评论回复
19
paotangsan| | 2019-3-6 11:48 | 只看该作者
机器指令的直行周期

使用特权

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

本版积分规则

3

主题

28

帖子

1

粉丝