如何解析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;
}
}
看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注亿速云行业资讯频道,感谢您对亿速云的支持。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。