windows下实现微秒级的延时

最近正在做一个嵌入式系统,是基于windows ce的,外接硬件的时序要微秒级的延时.

1.微秒级的延时肯定不能基于消息(SetTimer函数),因为一出现消息堵塞等就会影响精
度,而且setTimer单位才是毫秒.实际响应时间可能要到55毫秒左右.

2.微秒级的延时也不能不能基于中断,VxD最快的时钟服务程序Set_Global_Time_Out函数
才能保证1毫秒的精度.其他挂接int 8H中断处理函数等,只能保证55ms的精度.(有时还不
能)

3.因此可以想到汇编下的那种基于循环执行语句的那种延时.但汇编那种代码不通用,跟
cpu的频率有关.

所以可以用windows下的几个函数来写出通用代
码.GetTickCout,timeGetTime,QueryPerformanceCounter.
1)GetTickCout响应只能保证55ms的精度
2)timeGetTime只能保证1ms的精度
3)而QueryPerformanceCounter函数不依赖计算中断的次数,而是靠读取别的硬件时钟来
实现的,可以有0.8微秒的精度.这个系统不支持windows 95以下的系统,不过这些系统应
该没人用了吧.呵呵.

下面是示例代码:
//LARGE_INTEGER类型类似一个64位的整型,是一个union,里面是LongLong类型和两个
long组成的结构体的union.
//QueryPerformanceFrequency函数得到你的计算机里高精度计时器每秒计时多少次,
//参数LARGE_INTEGER,返回false表示你的当前计算机硬件不支持高精度计时器.
//QueryPerformanceCounter函数得到当前计时器记了多少次.类似与GetTickCout.
#include
#include
using namespace std;



void main(){

int delayTime = 20; //微秒级的延时.

LARGE_INTEGER m_liPerfFreq={0};

    if (!QueryPerformanceFrequency(&m_liPerfFreq))
{
cout <<"你的当前计算机硬件不支持高精度计时器"< return;
}
    
    LARGE_INTEGER m_liPerfStart={0};
    QueryPerformanceCounter(&m_liPerfStart);


LARGE_INTEGER liPerfNow={0};
for(;;)
{

QueryPerformanceCounter(&liPerfNow);
double time=( ((liPerfNow.QuadPart -
m_liPerfStart.QuadPart)*1000000)/(double)m_liPerfFreq.QuadPart);
if (time >= delayTime)
break;

}
cout.precision(40);
cout << "开始" <<(double)m_liPerfStart.QuadPart < cout << "结束" <<(double)liPerfNow.QuadPart < cout<<"时间精度"<<(1/(double)m_liPerfFreq.QuadPart)*1000000<<"微秒"< cout << "延时" <<( ((liPerfNow.QuadPart - m_liPerfStart.QuadPart)
*1000000)/(double)m_liPerfFreq.QuadPart)<<"微秒"<

}


因为windows是多任务系统,只要保证windows执行这段代码时不被其他进程打断,就可以
保证延时微秒级成功.出现打断的几率很小.一般可以不考虑.如果代码执行时间低于一
个时间片,那就100%不会被打断了.

你可能感兴趣的:(技术探讨)