wince6.0 能否实现微秒级的定时器

时间:2022-10-19 08:54:52
最近在做一个应用程序时,需要利用IO引脚提供一个2KHZ的频率,通常使用的定时器不能满足需求,查阅了不少资料都没有看到合适的解决方法,不知道各位大牛有没有什么好的解决方法??

10 个解决方案

#1


mark

#2


应用级,很难实现

#3


参考下//WINCE 微秒级延时函数 

void delay_us(int n)


  LARGE_INTEGER litmp; 
  LONGLONG QPart1,QPart2; 
  double dfMinus, dfFreq, dfTim; 

  if(QueryPerformanceFrequency(&litmp)==FALSE) 
  { 
       MessageBox(NULL,TEXT("Error:QueryPerformanceFrequency"),TEXT("Error"),MB_OK); 
       return;

   } 

   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); 



//WINCE毫秒级延时函数

void   delay_ms(DWORD   tmp_time)   
{   
 DWORD   start;   
 DWORD   time_i=0;   
 start=GetTickCount(); 
  
 while(time_i<=tmp_time)   
  {   
     time_i=GetTickCount()-start;   
  }   

}

#4


在MSDN上摘录了一段话:
Remarks
If the hardware does not support a high frequency counter, QueryPerformanceFrequency will return 1000 because the API defaults to a milliseconds GetTickCount implementation.


不幸的是我的系统返回了1000.

感谢你的回帖,再给其他高手一些机会,呵呵!

#5


完全可以。用PWM定时器。
不过要在ISR中来做。

#6


个人觉得,微秒级的定时循环写成这样好点: 
do  
  {  
  QueryPerformanceCounter(&litmp);  
  QPart2=litmp.QuadPart;  
  dfMinus=(double)(QPart2-QPart1);  
  dfTim=dfMinus;  

  }while(dfTim < n);  

#7


请教5楼,能否详细点说

#8


引用 6 楼 phxian 的回复:
个人觉得,微秒级的定时循环写成这样好点: 
do  
  {  
  QueryPerformanceCounter(&amp;litmp);  
  QPart2=litmp.QuadPart;  
  dfMinus=(double)(QPart2-QPart1);  
  dfTim=dfMinus;  

  }while(dfTim < n);

建议用硬件定时中断来实现

#9


弱问循环来做时钟,Cpu还能做其他事情吗?
引用 3 楼  的回复:
参考下//WINCE 微秒级延时函数 

void delay_us(int n)


  LARGE_INTEGER litmp; 
  LONGLONG QPart1,QPart2; 
  double dfMinus, dfFreq, dfTim; 

  if(QueryPerformanceFrequency(&amp;litmp)==FALSE) 
  { 
……

#10


引用 3 楼 wswwxk 的回复:
参考下//WINCE 微秒级延时函数 

void delay_us(int n)


  LARGE_INTEGER litmp; 
  LONGLONG QPart1,QPart2; 
  double dfMinus, dfFreq, dfTim; 

  if(QueryPerformanceFrequency(&litmp)==FALSE) 
  { 
       MessageBox(NULL,TEXT("Error:QueryPerformanceFrequency"),TEXT("Error"),MB_OK); 
       return;

   } 

   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); 



//WINCE毫秒级延时函数

void   delay_ms(DWORD   tmp_time)   
{   
 DWORD   start;   
 DWORD   time_i=0;   
 start=GetTickCount(); 
  
 while(time_i<=tmp_time)   
  {   
     time_i=GetTickCount()-start;   
  }   

}
我试啦,能用,时间也挺准的。

#1


mark

#2


应用级,很难实现

#3


参考下//WINCE 微秒级延时函数 

void delay_us(int n)


  LARGE_INTEGER litmp; 
  LONGLONG QPart1,QPart2; 
  double dfMinus, dfFreq, dfTim; 

  if(QueryPerformanceFrequency(&litmp)==FALSE) 
  { 
       MessageBox(NULL,TEXT("Error:QueryPerformanceFrequency"),TEXT("Error"),MB_OK); 
       return;

   } 

   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); 



//WINCE毫秒级延时函数

void   delay_ms(DWORD   tmp_time)   
{   
 DWORD   start;   
 DWORD   time_i=0;   
 start=GetTickCount(); 
  
 while(time_i<=tmp_time)   
  {   
     time_i=GetTickCount()-start;   
  }   

}

#4


在MSDN上摘录了一段话:
Remarks
If the hardware does not support a high frequency counter, QueryPerformanceFrequency will return 1000 because the API defaults to a milliseconds GetTickCount implementation.


不幸的是我的系统返回了1000.

感谢你的回帖,再给其他高手一些机会,呵呵!

#5


完全可以。用PWM定时器。
不过要在ISR中来做。

#6


个人觉得,微秒级的定时循环写成这样好点: 
do  
  {  
  QueryPerformanceCounter(&litmp);  
  QPart2=litmp.QuadPart;  
  dfMinus=(double)(QPart2-QPart1);  
  dfTim=dfMinus;  

  }while(dfTim < n);  

#7


请教5楼,能否详细点说

#8


引用 6 楼 phxian 的回复:
个人觉得,微秒级的定时循环写成这样好点: 
do  
  {  
  QueryPerformanceCounter(&amp;litmp);  
  QPart2=litmp.QuadPart;  
  dfMinus=(double)(QPart2-QPart1);  
  dfTim=dfMinus;  

  }while(dfTim < n);

建议用硬件定时中断来实现

#9


弱问循环来做时钟,Cpu还能做其他事情吗?
引用 3 楼  的回复:
参考下//WINCE 微秒级延时函数 

void delay_us(int n)


  LARGE_INTEGER litmp; 
  LONGLONG QPart1,QPart2; 
  double dfMinus, dfFreq, dfTim; 

  if(QueryPerformanceFrequency(&amp;litmp)==FALSE) 
  { 
……

#10


引用 3 楼 wswwxk 的回复:
参考下//WINCE 微秒级延时函数 

void delay_us(int n)


  LARGE_INTEGER litmp; 
  LONGLONG QPart1,QPart2; 
  double dfMinus, dfFreq, dfTim; 

  if(QueryPerformanceFrequency(&litmp)==FALSE) 
  { 
       MessageBox(NULL,TEXT("Error:QueryPerformanceFrequency"),TEXT("Error"),MB_OK); 
       return;

   } 

   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); 



//WINCE毫秒级延时函数

void   delay_ms(DWORD   tmp_time)   
{   
 DWORD   start;   
 DWORD   time_i=0;   
 start=GetTickCount(); 
  
 while(time_i<=tmp_time)   
  {   
     time_i=GetTickCount()-start;   
  }   

}
我试啦,能用,时间也挺准的。