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,还可以接受。