nanosleep納秒級延遲
//函數原型 int nanosleep(struct timespec *req, struct timespec *rem)
//參數列表:
// req:要求的睡眠時間
// rem:剩餘的睡眠時間
//返回值:
// 0:成功;-1,失敗,errno保存錯誤代碼
//目的:納秒級別的延遲
int nano_delay(long delay)
{
struct timespec req, rem;
long nano_delay = delay;
int ret = 0;
while(nano_delay > 0)
{
rem.tv_sec = 0;
rem.tv_nsec = 0;
req.tv_sec = 0;
req.tv_nsec = nano_delay;
if(ret = (nanosleep(&req, &rem) == -1))
{
printf("nanosleep failed.\n");
}
nano_delay = rem.tv_nsec;
};
return ret;
}
//測試,納秒級延遲的誤差率
int main()
{
int ret = 0;
long delay = 0;
struct timespec start, end, interv;
for(delay = 1000; delay < 1000*1000; delay+=1000)
{
curr_time(&start);
nano_delay(delay);
curr_time(&end);
diff(&start, &end, &interv);
printf("delay = %ld, real delay = %ld, error = %g.\n", delay, interv.tv_sec * 1000000000 + interv.tv_nsec, (float)(interv.tv_sec * 1000000000 + interv.tv_nsec - delay)/delay );
}
}
//測試結果:
// Duo CPU e8200
// Ubuntu 12.10 Kernel 3.4
//
最後更新:2017-04-03 14:53:40