none
如何在EVC中编写延时程序,希望是微秒的 RRS feed

答案

  • DWORD GetTickCount(void); 是能够得到微秒级的,

    ms-help://MS.WindowsCE.500/wcecoreos5/html/wce50lrfGetTickCount.htm

     

    2008年5月7日 10:21
    版主

全部回复

  • DWORD GetTickCount(void); 是能够得到微秒级的,

    ms-help://MS.WindowsCE.500/wcecoreos5/html/wce50lrfGetTickCount.htm

     

    2008年5月7日 10:21
    版主
  • 对wince准实时系统来说,微秒级的延时,我觉得有点不现实,实际执行中由于操作系统的关系,我认为其延时一定是毫秒级的(CPU时间片的分配也是这个级别上的)。对底层不是很熟,仅代表我个人意见。

    2008年5月8日 8:55
    版主
  •  黄文中 写:

    DWORD GetTickCount(void); 是能够得到微秒级的,

    ms-help://MS.WindowsCE.500/wcecoreos5/html/wce50lrfGetTickCount.htm

     

    如果OEM没有专门做相关硬件支持的话,这个函数只会返回到毫秒~




    2008年5月8日 10:41
    版主
  •  叶帆 写:

    对wince准实时系统来说,微秒级的延时,我觉得有点不现实,实际执行中由于操作系统的关系,我认为其延时一定是毫秒级的(CPU时间片的分配也是这个级别上的)。对底层不是很熟,仅代表我个人意见。




    对OEM来说,他们必须考虑更高(相比毫秒)精度的定时器是否真的有必要,尤其是在CPU的时间片为几十微妙到数百微妙级的时候。如果你有必要在应用层来解决微妙级精度的延时,基本不用考虑有通用的解决方案了。。
    要检查可应用的机器的时间刻度到底达到什么程度请使用:
    QueryPerformanceCounter和 QueryPerformanceFrequency
    (相信在大多数设备中会返回1000(hz),即精度为毫秒)

    Regards,

    Freesc

    2008年5月8日 11:21
    版主
  • 谢谢大家的解答。万分感谢。

    后来我用以下程序:

    void Delay_n_us(int n){

     LARGE_INTEGER litmp;
     LONGLONG QPart1,QPart2;
     double dfMinus, dfFreq, dfTim;
     QueryPerformanceFrequency(&litmp);
     dfFreq = (double)litmp.QuadPart;
     QueryPerformanceCounter(&litmp);
     QPart1 = litmp.QuadPart;
     do
     {
     QueryPerformanceCounter(&litmp);
     QPart2=litmp.QuadPart;
     dfMinus=(double)(QPart2-QPart1);
     dfTim=dfMinus/dfFreq;
     }while(dfTim <0.000001*n); 

    }

    通过

    for(i=0;i<60;i++)

    {

    for(j=0;j<1000;j++)

    Delay_n_us(1000);

    }

    测试,大概可以得到1S的延时。

     

     

    其实,以上的延时我是用于我自己做的一个驱动。

    我现在做的流驱动是这样子的,仅仅是往GPIO口送数据(WriteFile)或者读数据(ReadFile)。至于AD采集的时序控制都是在应用层(EVC)实现。

    这种做法的后果是,速度很慢,完成2000多个模拟电压的采集居然要近1分钟。我想过是否要将2084个数据采集的任务在驱动的ReadFile一次完成。这样子就需要将时序控制都在在该函数中。

    我就有两个问题再跟大家请教:

    1、将所有任务放在驱程,试图调用一次函数放回数据组首地址的做法科学吗?

    2、那么,在底层驱动中要实现微秒的延时(WINCE),如何实现。

     

    谢谢大家的不吝赐教!

    2008年5月8日 15:53