Wince的时间精度问题

GetSystemTime()或GetLocalTime(),在wince最多精确到秒级的精度, 那是因为在嵌入式系统里面,系统的时间是由RTC(一般是在CPU内部的一个硬件逻辑)来保持的,它是以秒为单位,每过一秒就自加1来计时.所以它的精确 范围只能到秒.这点你可以在很多BSP的KERNEL里查看OEMGetRealTime()函数的实现就知道了. 当你调用API:GetSystemTime()或GetLocalTime()时,KERNEL会调用OEMGetRealTime()函数来返回给你 结果.而在OEMGetRealTime()里面,基于上述的原因,把ms=0.所以你只能得到秒级的精确度.
  我不清楚PC上是怎么实现这个函数的,但肯定是和硬件相关的
  一 般的CPU还会有一部分叫OSTimer的逻辑功能,它能够提供类似RTC,但是是毫秒精度的计时.在WINCE里,KERNEL有一个CurMSec变 量,这个变量时以毫秒为单位,来保存系统从启动到现在运行了多长时间.实际上CurMSec这个变量是靠OSTIMER来计算的.当你调用 GetTickCount()时,系统会把CurMSec的值返回给你,你可以通过在做某次动作的前后各调用GetTickCount()获得一个时间 差,就是你执行这次动作消耗的时间, 它是毫秒精度的.
  WINCE 微秒、毫秒级延时函数
  //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);
  }
  //毫秒级的延时函数
  void delay_ms(DWORD tmp_time)
  {
  DWORD start;
  DWORD time_i=0;
  start=GetTickCount();
  while(time_i<=tmp_time)
  {
  time_i=GetTickCount()-start;
  }
  }

转载于:https://my.oschina.net/sinlinx/blog/288632

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值