windows下实现微秒级的延时

时间:2023-03-09 04:08:16
windows下实现微秒级的延时

windowsintegeriostream汇编嵌入式任务

最近正在做一个嵌入式系统,是基于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以下的系统,不过这些系统应
该没人用了吧.呵呵.
下面是示例代码:

windows下实现微秒级的延时windows下实现微秒级的延时
Code//LARGE_INTEGER类型类似一个64位的整型,是一个union,里面是LongLong类型和两个
long组成的结构体的union.
//QueryPerformanceFrequency函数得到你的计算机里高精度计时器每秒计时多少次,
//参数LARGE_INTEGER,返回false表示你的当前计算机硬件不支持高精度计时器.
//QueryPerformanceCounter函数得到当前计时器记了多少次.类似与GetTickCout.
#include <windows.h>
#include <iostream>
using namespace std;
void main(){
int delayTime = 20; //微秒级的延时.
LARGE_INTEGER m_liPerfFreq={0};
if (!QueryPerformanceFrequency(&m_liPerfFreq))
{
cout <<"你的当前计算机硬件不支持高精度计时器"<<endl;
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 <<endl;
cout << "结束" <<(double)liPerfNow.QuadPart <<endl;
cout<<"时间精度"<<(1/(double)m_liPerfFreq.QuadPart)*1000000<<"微秒"<<endl;
cout << "延时" <<( ((liPerfNow.QuadPart - m_liPerfStart.QuadPart)
*1000000)/(double)m_liPerfFreq.QuadPart)<<"微秒"<<endl;
}

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