关于短延迟 SLEEP USLEEP NANOSLEEP SELECT

    技术2022-05-19  22

    udelay(unsigned long usecs);mdelay(unsigned long msecs);前者用软件循环指定的微妙数,后者调用前者达到延迟毫秒级。udelay 函数只能用于获取较短的时间延迟,因为loops_per_second值的精度只有8位,所以,当计算更长的延迟时会积累出相当大的误差。尽管最大能允许的延迟将近1秒(因为更长的延迟就要溢出),推荐的 udelay 函数的参数的最大值是取1000微秒(1毫秒)。延迟大于 11 毫秒时可以使用函数 mdelay。要特别注意的是 udelay 是个忙等待函数(所以 mdelay 也是),在延迟的时间段内无法运行其他的任务,因此要十分小心,尤其是 mdelay,除非别无他法,要尽量避免使用。 mdelay 在 Linux 2.0 中并不存在,头文件 sysdep.h 弥补了这一缺陷。关于 usleep sleep 主要的差距在精确程度上,不过网友有关于这个方面的精辟论断:同样我觉得select也是比较好的定时机制,不过大家可以看igmp-proxy的源代码。主函数里面用setitimer和select同时定时是一个相当好的想法。#################################################################再论精确延时(usleep,nanosleep,select)

    /* make: gcc -o test_sleep test_sleep.c */ #include <stdio.h>; #include <stdlib.h>; #include <time.h>; #include <sys/time.h>; #include <errno.h>; #include <string.h>; #include <unistd.h>; #include <sys/types.h>; #define PRINT_USEAGE { / fprintf(stderr,"/n Usage: %s usec ",argv[0]); / fprintf(stderr,"/n/n");/ } int main (int argc, char **argv) { unsigned int nTimeTestSec = 0; /* sec */ unsigned int nTimeTest = 0; /* usec */ struct timeval tvBegin; struct timeval tvNow; int ret = 0; unsigned int nDelay = 0; /* usec */ fd_set rfds; struct timeval tv; int fd = 1; int i = 0; struct timespec req; unsigned int delay[20] = { 500000, 100000, 50000, 10000, 1000, 900, 500, 100, 10, 1, 0 }; int nReduce = 0; /* 误差 */ #if 0 if (argc < 2) { PRINT_USEAGE; exit (1); } nDelay = atoi (argv[1]); #endif fprintf (stderr, "ssss/n", "function", "time(usec)", "realTime", "reduce"); fprintf (stderr, "-------------------------------------------------------------------/n"); for (i = 0; i < 20; i++) { if (delay[i] <= 0) break; nDelay = delay[i]; /*test usleep */ gettimeofday (&tvBegin, NULL); ret = usleep (nDelay); if (-1 == ret) { fprintf (stderr, " usleep error . errno=%d [%s]/n", errno, strerror (errno)); } gettimeofday (&tvNow, NULL); nTimeTest = (tvNow.tv_sec - tvBegin.tv_sec) * 1000000 + tvNow.tv_usec - tvBegin.tv_usec; nReduce = nTimeTest - nDelay; fprintf (stderr, "/t usleep %8u %8u

    转载请注明原文地址: https://ibbs.8miu.com/read-2209097.html

    最新回复(0)