linux用户空间的延时函数分析 (2011-08-16 10:28)

linux用户空间的延时函数分析

 

在用户空间实现one wire总线,我需要精确到us的延时,可惜usleep函数不给力,我得自己摸索其他方法。

环境:ep9302,arm9,主频200MHz。

试验一:

void inline tickDelay(int tick)
{
 struct timeval tv, tv2;
 gettimeofday(&tv, NULL);
 gettimeofday(&tv2, NULL);
 printf("time1: %ld, %ld.\n", tv2.tv_sec - tv.tv_sec, tv2.tv_usec - tv.tv_usec);
 gettimeofday(&tv, NULL);
 usleep(5);
 gettimeofday(&tv2, NULL);
 printf("time2: %ld, %ld.\n", tv2.tv_sec - tv.tv_sec, tv2.tv_usec - tv.tv_usec);
}

多次运行结果:
time1: 0, 6.
time2: 0, 19762.
time1: 0, 6.
time2: 0, 19760.
time1: 0, 8.
time2: 0, 19740.
time1: 0, 6.
time2: 0, 19868.
time1: 0, 6.
time2: 0, 19577.
time1: 0, 8.
time2: 0, 19734.
time1: 0, 4.
time2: 0, 19760.
time1: 0, 6.
time2: 0, 19758.
 

usleep需要让进程睡眠,通过信号唤醒,实现过程比较复杂,最小sleep时间与cpu运算速度有关,在这里,它只能最小达到19ms的延时,这个应该和进程睡眠唤醒的时间有关。

gettimeofday函数运行一次,在这里需要6us左右的时间。

会产生休眠的函数,其睡眠最小值与cpu的速度有关。如果需要最小值为us的延时,也只能自己写个循环来延时,误差也有几us,还可以接受。

你可能感兴趣的:(linux用户空间的延时函数分析 (2011-08-16 10:28))