内核延时
如果是短延时,比如不超过几毫秒,可以用下面的方式,比如最小1ms;因为软件定时器一般用于长延时。
1.下面这三个是忙等待,比较精确
include <linux/delay.h>
void ndelay(unsigned long nsecs); //纳秒
void udelay(unsigned long usecs); //微秒
void mdelay(unsigned long msecs); //毫秒
2.下面的函数会引起休眠,没上面的函数准确。
void msleep(unsigned int msecs) //毫秒延时
unsigned long msleep_interruptible(unsigned int msecs) //毫秒可中断延时
void ssleep(unsigned int seconds) //秒级延时,基于msleep()
应用延时
1.sleep()和usleep() 延时
#include <unistd.h>
unsigned int sleep (unsigned int seconds); //n秒
int usleep (useconds_t usec); //n微秒
Linux中并没有提供系统调用sleep(),sleep()是在库函数中实现的,它是通过调用alarm()来设定报警时间,调用sigsuspend()将进程挂起在信号SIGALARM上。
2.采用select()函数来进行精确延时
#include <stdio.h>
#include <sys/select.h>
static void sleep_ms(unsigned int secs)
{
struct timeval tval;
tval.tv_sec=secs/1000;
tval.tv_usec=(secs*1000)%1000000;
select(0,NULL,NULL,NULL,&tval);
}
比如说延时0.2s:
sleep_ms(200)
3.可以用系统调用nanosleep()更精确
int nanosleep(const struct timespec *req,struct timespec *rem);
struct timespec
{
time_t tv_sec; /* seconds */
long tv_nsec; /* nanoseconds */
}