6318|17

88

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

for 或者 while循环的用于定时的疑问! [复制链接]

假设我要在驱动中延时0.1MS用于控制硬件,又不想动用定时器。在单片机中的做法,写个for 或者 while循环堵在那里,什么
也不做。昨天我试着在驱动里面也这么做发现没有起到延时作用,貌似这种代码一点时间也没有耗,直接跳过了,这是怎么回事?
代码如下:
v_pIOPregs->rGPFDAT |=(0x1<< 7);//for test
  for(i=0;i<40;i++)
        {for(j=0;j<1000;j++);}
v_pIOPregs->rGPFDAT &=~(0x1<< 7);//for test
  或者
v_pIOPregs->rGPFDAT |=(0x1<< 7);//for test
  DWORD delay=40000;
        while(delay!=0)
          {delay--;}
v_pIOPregs->rGPFDAT &=~(0x1<< 7);//for test
400M的系统时钟,按理有上百us的延时,通过示波器看高电平的时间中有大约0.2us。 我想会不会是WINCE的编译器太厉害,发现代码什么都没做,就自动给优化掉了。

用Sleep(1)可以延时1ms,但是时间太长了,不能接受。该怎么办好呢?

最新回复

因该就是这样了。结贴!  详情 回复 发表于 2009-3-17 17:28
点赞 关注

回复
举报

61

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
楼主,wince是操作系统,具有多任务性。

使用这些延时是不行的。因为很多任务都在执行。

sleep用于长延时不错的

像你的要求用ARM的定时器就可以解决了。

 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
400M的CPU已经很快了, 你的这循环变量都只是在寄存器里,当然非常快.
试着在把delay变量的定义前加volatile, 这样你会明显的看到延时的.
 
 
 

回复

87

帖子

0

TA的资源

一粒金砂(初级)

4
 
时间太短,测试看不出来
 
 
 

回复

86

帖子

0

TA的资源

一粒金砂(初级)

5
 
引用 3 楼 xqhrs232 的回复:
时间太短,测试看不出来

示波器可以看到NS级的。40000 和400M比应该是万分之一,除去流水线。因该还是100us级的。
我把参数改成8000000。结果还是一样。所以不是定时太短的问题!
我加volatile试试!
 
 
 

回复

90

帖子

0

TA的资源

一粒金砂(初级)

6
 
引用 1 楼 gooogleman 的回复:
楼主,wince是操作系统,具有多任务性。

使用这些延时是不行的。因为很多任务都在执行。

sleep用于长延时不错的

像你的要求用ARM的定时器就可以解决了。

用定时器的地方太多,要省着用的。本来可以几个驱动共用定时器,但是刚入门,不敢这样用。怕到时乱了!
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

7
 
引用 1 楼 gooogleman 的回复:
楼主,wince是操作系统,具有多任务性。

使用这些延时是不行的。因为很多任务都在执行。

sleep用于长延时不错的

像你的要求用ARM的定时器就可以解决了。

多任务性一直没弄明白,在想操作系统总不会在你专心做某一个循环的时候把任务打断吧。时间片轮循是MS级的,我的
驱动线程三五个MS就跑完一个循环,这么短时间需要调度吗?那样的话,我回头加一些进程同步的机制。
 
 
 

回复

59

帖子

0

TA的资源

一粒金砂(初级)

8
 
我觉得还是定时器为好。

因为ARM9有cache和MMU等特殊硬件,会造成一条指令的执行时间具有不可预测性。
清理cache和不清理cache的执行时间有较大差别的。所以要精确定时还是不要用这些为好。
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

9
 
引用 7 楼 gooogleman 的回复:
我觉得还是定时器为好。

因为ARM9有cache和MMU等特殊硬件,会造成一条指令的执行时间具有不可预测性。
清理cache和不清理cache的执行时间有较大差别的。所以要精确定时还是不要用这些为好。

确实有很多不确定性,回头我根据功能情况再权衡一下!
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

10
 
感觉被我言中。在代码里面加了条读I/O 口的指令(这种指令无论如何他是不能优化掉的,因为它不知道结果)。定时效果出来了,有大约5MS。不怎么准,所以设定好参数后用示波器看看,不行再调。代码如下:
v_pIOPregs->rGPFDAT |=(0x1 < < 7);//for test
for(i=0;i<40000;i++)
                {
                  m=v_pIOPregs->rGPFDAT;
                }
v_pIOPregs->rGPFDAT &=~(0x1 < < 7);//for test

 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

11
 
感觉被我言中。在代码里面加了条读I/O 口的指令(这种指令无论如何他是不能优化掉的,因为它不知道结果)。定时效果出来了,有大约5MS。不怎么准,所以设定好参数后用示波器看看,不行再调。代码如下:
v_pIOPregs->rGPFDAT |=(0x1 < < 7);//for test
for(i=0;i<40000;i++)
                {
                  m=v_pIOPregs->rGPFDAT;
                }
v_pIOPregs->rGPFDAT &=~(0x1 < < 7);//for test

 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

12
 
你最上的代码, 你简单的定义一个变量, 并且用在循环中, 翻译成汇编代码就无非就是不断的对一个arm寄存器进行加法操作. 因为优化后不会在循环中每次都去Ram中取这个变量的,这样的话, 执行速度就相当的快了.

而你的v_pIOPregs, 肯定会有volatile的关键字, 这个关键字保证程序无论在哪里对它的访问时,都会重新从它的地址取值.注意,IO访问周期才长!

记得以前我也发过:
void static Delay(int cnt)
{
    volatile int i;
    for(;cnt>0;cnt--)
               for(i=0;i<133;i++);
}
这样的一次delay是110多个us, arm9, 400MHZCPU, RAM为HCLK(133MHZ). 参考一下吧.
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

13
 
引用 11 楼 eagle1597 的回复:
void static Delay(int cnt)
{
    volatile int i;
    for(;cnt>0;cnt--)
      for(i=0;i <133;i++);
}


哈哈,加个volatile 强迫刷新/清除 cache,这样就会使速度降下来。

很不错。学习了。
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

14
 
引用 11 楼 eagle1597 的回复:
你最上的代码, 你简单的定义一个变量, 并且用在循环中, 翻译成汇编代码就无非就是不断的对一个arm寄存器进行加法操作. 因为优化后不会在循环中每次都去Ram中取这个变量的,这样的话, 执行速度就相当的快了.

而你的v_pIOPregs, 肯定会有volatile的关键字, 这个关键字保证程序无论在哪里对它的访问时,都会重新从它的地址取值.注意,IO访问周期才长!

记得以前我也发过:
void static Delay(int cnt)
{
    volatile int …

恩,我试试!
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

15
 
试验证明,eagle1597说的是对的。网上查了一下,volatile 在C语言里面还是蛮常用的,谢谢提醒。

volatile提醒编译器它后面所定义的变量随时都有可能改变,因此编译后的程序每次需要存储或读取这个变量的时候,
都会直接从变量地址中读取数据。就是防编译器优化的。
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

16
 
关注
 
 
 

回复

89

帖子

0

TA的资源

一粒金砂(初级)

17
 
up下``
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

18
 
因该就是这样了。结贴!
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表