打印
[STM32F1]

for循环延时的疑问

[复制链接]
616|34
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
chuxh|  楼主 | 2021-1-4 19:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
写芯片驱动时序时,使用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--);
   }
}

使用特权

评论回复
沙发
stly| | 2021-1-4 19:43 | 只看该作者

运行过程可能被其他时序打乱

使用特权

评论回复
板凳
pengf| | 2021-1-4 19:47 | 只看该作者
而且本身就是不精确延时

使用特权

评论回复
地板
supernan| | 2021-1-4 19:51 | 只看该作者
第一  你该测试1000ms延时,以此时的延时为准

使用特权

评论回复
5
supernan| | 2021-1-4 19:55 | 只看该作者
第二  测试延时的时候你要关中断

使用特权

评论回复
6
houcs| | 2021-1-4 20:00 | 只看该作者

void delay_us(u32 nTime)
{
    u32 i,j;
    for(i=0;i<nTime;i++)
   {
       for(j=6;j>0;j--);
   }
}

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

使用特权

评论回复
7
chuxh|  楼主 | 2021-1-4 20:06 | 只看该作者
是的,这种延时有可能会被中断打乱的,不精确。

使用特权

评论回复
8
yinxiangh| | 2021-1-4 20:10 | 只看该作者
以1000ms延时为基准,能分析一下为什么么?

使用特权

评论回复
9
chuxh|  楼主 | 2021-1-4 20:14 | 只看该作者
我测试1us没有关中断,实际用的时候也不可能关掉中断延时吧?

使用特权

评论回复
10
lium| | 2021-1-4 20:17 | 只看该作者
用置高置低电平测试出来的?

使用特权

评论回复
11
llia| | 2021-1-4 20:20 | 只看该作者
怀疑是置电平语句占了一定的时间

使用特权

评论回复
12
zhuww| | 2021-1-4 20:24 | 只看该作者
嗯,导致for延时不足1us

使用特权

评论回复
13
happy_10| | 2021-1-4 20:30 | 只看该作者
然后调用delay_us(1000)时误差就被放大了。

使用特权

评论回复
14
chuxh|  楼主 | 2021-1-4 20:33 | 只看该作者
我是用置高置低电平测试出来的,现在我怀疑是置电平语句占了一定的时间,导致for延时不足1us,然后调用delay_us(1000)时误差就被放大了。

使用特权

评论回复
15
juventus9554| | 2021-1-4 20:37 | 只看该作者
主要是进出函数,需要一定的时间,10次循环也是进出一次函数,100次循环也是进出一次函数

使用特权

评论回复
16
supernan| | 2021-1-4 20:41 | 只看该作者
你第一次测得时间剔除进出函数的时间,才是循环体真正的执行时间。

使用特权

评论回复
17
pangb| | 2021-1-4 20:44 | 只看该作者
楼上正解,入栈出栈及跳转要时间,但这个时间并不随你的延时时间变化而变化。

使用特权

评论回复
18
kangzj| | 2021-1-4 20:52 | 只看该作者

这种延时函数,在延时时间很短时,进出函数的指令会占很大比例,时间长的时候,进出函数的时间还是固定的,但是比例就小很多了。

使用特权

评论回复
19
llia| | 2021-1-4 20:56 | 只看该作者
你示波器所测的1.04US是(进出delay函数时间+IO输出函数时间+你想要的for(+1))的时间总和,实际for语句+1的时间应该等于1/晶振频率,而你示波器测的delay(100)同样是(进出delay函数时间+IO输出函数时间+你想要的for(+100))的时间总和,而并不是1.04*100us。  

使用特权

评论回复
20
langgq| | 2021-1-4 20:59 | 只看该作者
还有,如果你需要精准的延时,请用定时器。如果你的产品对实时性要求很高,也不要用delay软件延时

使用特权

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

本版积分规则

936

主题

11296

帖子

2

粉丝