linux环境下的精确时延的获取
(2017-10-29 15:51:23)
标签:
linux精确延时 |
分类: programming |
用户空间Linux下延时的方式不外乎调用各种延时函数,或者使用定时器,或者使用select,网络摘抄如下
1. unsigned int sleep(unsigned int seconds);
2. int usleep(useconds_t usec);
3. int nanosleep(const struct timespec *req, struct timespec *rem);
4. select()
useconds_t在linux中的定义就是unsigned int
struct timespec {
};
1、 sleep函数可能提前返回,即延时时间不足seconds秒
原因分析:sleep函数可能被信号中断而提前返回
规避措施:判断sleep的返回值,只有返回0时才表示完成预期的延时,否则返回剩余的秒数。所以请检查一下您的代码中是否判断了sleep的返回值?
2、 usleep/nansleep函数成功返回时其延时时间可能大于入参指定的时间
原因分析:usleep函数手册中明确标示usleep调用至少挂起进程usec微秒,导致进程挂起时间变长的原因是:
1、
2、
3、
规避措施:
1、
2、
3、 usleep函数不能用于秒级以上的延时
原因分析: 在某些系统中usleep接受的入参最大值必须小于1000000(即1秒)
规避措施:
1、
2、
3、
说明:在Suse9/10上测试是没有问题的,但出于可移植性考虑,不要使用usleep作秒级以上的延时
4、nanosleep函数延时存在多种情况,需要根据返回值/errno/输出变量综合判断
情况1延时时间大于或是等于预期时间(绝大部分情况下),返回0
情况2延时时间小于预期时间,返回-1
情况2.1 errno为EINTR表示函数提前返回,此时可读取第2个参数的获取剩余时间
情况2.2 errno为EINVAL表示第一个入参req.tv_nsec取值超出范围[0, 999,999,999]
5. 、select的精度是微妙,精确
struct timevaldelay;
delay.tv_sec =0;
delay.tv_usec =20 * 1000; // 20 ms
select(0, NULL,NULL, NULL, &delay);#include
6. 直接 循环 延时, for (i =0; i < 1000; i++){}
=========================实验============
#include
#include
#include
#include
#include
void seconds_sleep(unsigned seconds){
}
void milliseconds_sleep(unsigned long mSec){
}
void microseconds_sleep(unsigned long uSec){
}
void nanodelay_sleep(unsigned long nSec){
}
void countdelay(unsigned long cnt)
{
}
int main()
{
#define MAXLP 1000