为什么没有在正确的时间中断? #包括 #包括 #包括 #包括 #包括 #包括 #包括 #包括 typedef无符号整数uint32; #定义百万一百万 双持续时间2ms,持续时间10ms,持续时间100ms; 双任务2ms\u光栅、任务10ms\u光栅、任务100ms\u光栅; 计时器\u t firstTimerID、secondTimerID、thirdTimerID; 无效TASK1(Task2ms_光栅) { 结构timespec启动、停止; 双开始时间,停止时间; int a=1,b=3,c; if((StartTime=clock\u gettime(clock\u REALTIME,&start))=-1) { perror(“时钟获取时间”); } StartTime=start.tv\u sec+0.0000001*start.tv\u nsec; printf(“开始时间为%lf”,开始时间); printf(“值为%d”,c); printf(“ETAS1\n”); if((StopTime=clock\u gettime(clock\u REALTIME,&stop))=-1) { perror(“时钟获取时间”); } StopTime=stop.tv\u sec+0.0000001*stop.tv\u nsec; printf(“停止时间为%lf”,停止时间); 持续时间2ms=停止时间-开始时间; printf(“时差=%lf\n”,持续时间2ms); } 无效任务2(任务10ms\u光栅) { INTA、b、c; 结构timespec启动、停止; 双开始时间,停止时间; if(clock\u gettime(clock\u REALTIME,&start)=-1){ perror(“时钟获取时间”); } StartTime=start.tv\u sec+0.0000001*start.tv\u nsec; printf(“开始时间为%lf”,开始时间); printf(“ETAS2\n”); if((StopTime=clock\u gettime(clock\u REALTIME,&stop))=-1) { perror(“时钟获取时间”); } StopTime=stop.tv\u sec+0.0000001*stop.tv\u nsec; printf(“停止时间为%lf”,停止时间); 持续时间10ms=(stop.tv_秒-start.tv_秒) +(双)(stop.tv\u nsec-start.tv\u nsec) /(加倍)100万; printf(“时差=%lf\n”,持续时间10ms); } void TASK3(Task100ms\u光栅) { INTA、b、c; 结构timespec启动、停止; 双开始时间,停止时间; if(clock\u gettime(clock\u REALTIME,&start)=-1){ perror(“时钟获取时间”); } StartTime=start.tv\u sec+0.0000001*start.tv\u nsec; printf(“开始时间为%lf”,开始时间); printf(“值为%d”,c); printf(“ETAS1\n”); if((StopTime=clock\u gettime(clock\u REALTIME,&stop))=-1) { perror(“时钟获取时间”); } StopTime=stop.tv\u sec+0.0000001*stop.tv\u nsec; printf(“停止时间为%lf”,停止时间); 持续时间100ms=停止时间-开始时间; printf(“时差=%lf\n”,持续时间100ms); } 静态void timerHandler(int-sig、siginfo\u-t*si、void*uc) { 定时器_t*tidp; tidp=si->si_value.sival_ptr; 如果(*tidp==firstTimerID) TASK1(Task2ms_光栅); else if(*tidp==secondTimerID) TASK2(Task10ms_光栅); 如果(*tidp==thirdTimerID),则为else TASK3(Task100ms_光栅); } 静态int makeTimer(字符*名称、计时器\u t*timerID、int expireMS、int intervalMS) { 结构sigte; 结构itimerspec its; struct-sigaction-sa; int sigNo=SIGRTMIN; /*设置信号处理器*/ sa.sa_flags=sa_SIGINFO; sa.sa_sigaction=timerHandler; sigemptyset(和sa.sa_面具); if(sigaction(sigNo,&sa,NULL)=-1) { 佩罗尔(“sigaction”); } /*设置并启用报警*/ te.sigev_notify=sigev_信号; te.sigev_signo=signo; te.sigev_value.sival_ptr=timerID; 计时器\u创建(时钟\u实时,&te,timerID); its.it_interval.tv_sec=0; its.it\u interval.tv\u nsec=间隔*100000; its.it_value.tv_sec=0; its.it\u value.tv\u nsec=expireMS*100000; timer_settime(*timerID,0,&its,NULL); 返回1; } int main() { makeTimer(“第一个计时器”&第一个timerid,2,2);//2ms makeTimer(“第二个计时器”&第二个计时器,10,10);//10ms makeTimer(“第三个计时器”和第三个计时器,100100);//100ms 而(1) ;; }

为什么没有在正确的时间中断? #包括 #包括 #包括 #包括 #包括 #包括 #包括 #包括 typedef无符号整数uint32; #定义百万一百万 双持续时间2ms,持续时间10ms,持续时间100ms; 双任务2ms\u光栅、任务10ms\u光栅、任务100ms\u光栅; 计时器\u t firstTimerID、secondTimerID、thirdTimerID; 无效TASK1(Task2ms_光栅) { 结构timespec启动、停止; 双开始时间,停止时间; int a=1,b=3,c; if((StartTime=clock\u gettime(clock\u REALTIME,&start))=-1) { perror(“时钟获取时间”); } StartTime=start.tv\u sec+0.0000001*start.tv\u nsec; printf(“开始时间为%lf”,开始时间); printf(“值为%d”,c); printf(“ETAS1\n”); if((StopTime=clock\u gettime(clock\u REALTIME,&stop))=-1) { perror(“时钟获取时间”); } StopTime=stop.tv\u sec+0.0000001*stop.tv\u nsec; printf(“停止时间为%lf”,停止时间); 持续时间2ms=停止时间-开始时间; printf(“时差=%lf\n”,持续时间2ms); } 无效任务2(任务10ms\u光栅) { INTA、b、c; 结构timespec启动、停止; 双开始时间,停止时间; if(clock\u gettime(clock\u REALTIME,&start)=-1){ perror(“时钟获取时间”); } StartTime=start.tv\u sec+0.0000001*start.tv\u nsec; printf(“开始时间为%lf”,开始时间); printf(“ETAS2\n”); if((StopTime=clock\u gettime(clock\u REALTIME,&stop))=-1) { perror(“时钟获取时间”); } StopTime=stop.tv\u sec+0.0000001*stop.tv\u nsec; printf(“停止时间为%lf”,停止时间); 持续时间10ms=(stop.tv_秒-start.tv_秒) +(双)(stop.tv\u nsec-start.tv\u nsec) /(加倍)100万; printf(“时差=%lf\n”,持续时间10ms); } void TASK3(Task100ms\u光栅) { INTA、b、c; 结构timespec启动、停止; 双开始时间,停止时间; if(clock\u gettime(clock\u REALTIME,&start)=-1){ perror(“时钟获取时间”); } StartTime=start.tv\u sec+0.0000001*start.tv\u nsec; printf(“开始时间为%lf”,开始时间); printf(“值为%d”,c); printf(“ETAS1\n”); if((StopTime=clock\u gettime(clock\u REALTIME,&stop))=-1) { perror(“时钟获取时间”); } StopTime=stop.tv\u sec+0.0000001*stop.tv\u nsec; printf(“停止时间为%lf”,停止时间); 持续时间100ms=停止时间-开始时间; printf(“时差=%lf\n”,持续时间100ms); } 静态void timerHandler(int-sig、siginfo\u-t*si、void*uc) { 定时器_t*tidp; tidp=si->si_value.sival_ptr; 如果(*tidp==firstTimerID) TASK1(Task2ms_光栅); else if(*tidp==secondTimerID) TASK2(Task10ms_光栅); 如果(*tidp==thirdTimerID),则为else TASK3(Task100ms_光栅); } 静态int makeTimer(字符*名称、计时器\u t*timerID、int expireMS、int intervalMS) { 结构sigte; 结构itimerspec its; struct-sigaction-sa; int sigNo=SIGRTMIN; /*设置信号处理器*/ sa.sa_flags=sa_SIGINFO; sa.sa_sigaction=timerHandler; sigemptyset(和sa.sa_面具); if(sigaction(sigNo,&sa,NULL)=-1) { 佩罗尔(“sigaction”); } /*设置并启用报警*/ te.sigev_notify=sigev_信号; te.sigev_signo=signo; te.sigev_value.sival_ptr=timerID; 计时器\u创建(时钟\u实时,&te,timerID); its.it_interval.tv_sec=0; its.it\u interval.tv\u nsec=间隔*100000; its.it_value.tv_sec=0; its.it\u value.tv\u nsec=expireMS*100000; timer_settime(*timerID,0,&its,NULL); 返回1; } int main() { makeTimer(“第一个计时器”&第一个timerid,2,2);//2ms makeTimer(“第二个计时器”&第二个计时器,10,10);//10ms makeTimer(“第三个计时器”和第三个计时器,100100);//100ms 而(1) ;; },c,linux,timer,signals,scheduling,C,Linux,Timer,Signals,Scheduling,我创建了一个计时器,每2ms、10ms和100ms调用一次任务。我正在使用处理程序来处理任务。上述代码不会在10毫秒时中断task2,在100毫秒时中断task3。它没有在正确的位置中断,输出如下所示 输出: 10毫秒 2ms 2ms 10毫秒 2ms 10毫秒 2ms 2ms 10毫秒 2ms 10毫秒 100毫秒 2ms 10毫秒 2ms 10毫秒 2ms 10毫秒 2ms 10毫秒 2ms 10毫秒 2ms 10毫秒 2ms 10毫秒 100毫秒 2ms 10毫秒 2ms 10毫秒 2ms

我创建了一个计时器,每2ms、10ms和100ms调用一次任务。我正在使用处理程序来处理任务。上述代码不会在10毫秒时中断task2,在100毫秒时中断task3。它没有在正确的位置中断,输出如下所示

输出: 10毫秒 2ms 2ms 10毫秒 2ms 10毫秒 2ms 2ms 10毫秒 2ms 10毫秒 100毫秒 2ms 10毫秒 2ms 10毫秒 2ms 10毫秒 2ms 10毫秒 2ms 10毫秒 2ms 10毫秒 2ms 10毫秒 100毫秒 2ms 10毫秒 2ms 10毫秒 2ms 10毫秒 2ms 10毫秒 2ms 10毫秒 100毫秒 2ms 10毫秒 2ms 2ms 10毫秒 2ms 2ms 10毫秒 2ms 2ms 10毫秒 2ms 10毫秒 2ms 2ms 10毫秒 100毫秒 2ms 2ms 10毫秒 2ms 10毫秒 2ms 2ms 10毫秒 2ms 10毫秒 2ms 10毫秒 2ms 10毫秒 2ms 10毫秒 100毫秒 2ms 10毫秒 2ms 10毫秒 2ms 10毫秒 2ms 10毫秒 2ms
原因是什么?

结构itimerspec中的两个字段是秒和纳秒。毫秒内有1000000纳秒,而不是100000纳秒

所以这是错误的:

#include <signal.h>
#include <unistd.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>

#include <netinet/in.h>
#include <arpa/inet.h>
typedef unsigned int uint32;





#define million 1000000L

double duration2ms, duration10ms, duration100ms;
double Task2ms_Raster, Task10ms_Raster, Task100ms_Raster;
timer_t firstTimerID, secondTimerID, thirdTimerID;





void TASK1(Task2ms_Raster)
{

     struct timespec start, stop;
     double StartTime, StopTime;
     int a=1, b=3,c;

        if( (StartTime = clock_gettime( CLOCK_REALTIME, &start)) == -1 )
        {
          perror("clock gettime");

        }
       StartTime =start.tv_sec + 0.0000001 * start.tv_nsec;
       printf("start time is %lf", StartTime);


        printf("value is %d",c);




      printf("ETAS1\n");
  if( (StopTime = clock_gettime( CLOCK_REALTIME, &stop)) == -1 )
  {
          perror( "clock gettime" );

        }
  StopTime =  stop.tv_sec + 0.0000001 * stop.tv_nsec;
  printf("stop time is %lf", StopTime);


  duration2ms = StopTime - StartTime;
        printf( "time difference is= %lf\n", duration2ms );
}

void TASK2(Task10ms_Raster)
{
    int a,b,c;
    struct timespec start, stop;
     double StartTime, StopTime;

            if( clock_gettime( CLOCK_REALTIME, &start) == -1 ) {
              perror( "clock gettime" );

            }
            StartTime =start.tv_sec + 0.0000001 * start.tv_nsec;
               printf("start time is %lf", StartTime);







              printf("ETAS2\n");
             if( (StopTime = clock_gettime( CLOCK_REALTIME, &stop)) == -1 )
             {
                      perror( "clock gettime" );

                    }
             StopTime =  stop.tv_sec + 0.0000001 * stop.tv_nsec;
             printf("stop time is %lf", StopTime);
    duration10ms = ( stop.tv_sec - start.tv_sec )
                     + (double)( stop.tv_nsec - start.tv_nsec )
                       / (double)million;
            printf( "time difference is= %lf\n", duration10ms );
}


void TASK3(Task100ms_Raster)
{
    int a,b,c;
    struct timespec start, stop;
     double StartTime, StopTime;


            if( clock_gettime( CLOCK_REALTIME, &start) == -1 ) {
              perror( "clock gettime" );

            }

            StartTime =start.tv_sec + 0.0000001 * start.tv_nsec;
               printf("start time is %lf", StartTime);





                printf("value is %d",c);




              printf("ETAS1\n");
             if( (StopTime = clock_gettime( CLOCK_REALTIME, &stop)) == -1 )
             {
                      perror( "clock gettime" );

                    }
             StopTime =  stop.tv_sec + 0.0000001 * stop.tv_nsec;
             printf("stop time is %lf", StopTime);

    duration100ms = StopTime -StartTime;
            printf( "time difference is= %lf\n", duration100ms );
}



static void timerHandler( int sig, siginfo_t *si, void *uc )
{
    timer_t *tidp;

    tidp = si->si_value.sival_ptr;

    if ( *tidp == firstTimerID )

        TASK1(Task2ms_Raster);
   else if ( *tidp == secondTimerID )
       TASK2(Task10ms_Raster);
    else if ( *tidp == thirdTimerID )
        TASK3(Task100ms_Raster);
}


 static int makeTimer( char *name, timer_t *timerID, int expireMS, int intervalMS )
{
    struct sigevent         te;
    struct itimerspec       its;
    struct sigaction        sa;
    int                     sigNo = SIGRTMIN;

    /* Set up signal handler. */
    sa.sa_flags = SA_SIGINFO;
    sa.sa_sigaction = timerHandler;
    sigemptyset(&sa.sa_mask);
    if (sigaction(sigNo, &sa, NULL) == -1)
    {
        perror("sigaction");
    }

    /* Set and enable alarm */
    te.sigev_notify = SIGEV_SIGNAL;
    te.sigev_signo = sigNo;
    te.sigev_value.sival_ptr = timerID;
    timer_create(CLOCK_REALTIME, &te, timerID);

    its.it_interval.tv_sec = 0;
    its.it_interval.tv_nsec = intervalMS * 100000;
    its.it_value.tv_sec = 0;
    its.it_value.tv_nsec = expireMS * 100000;
    timer_settime(*timerID, 0, &its, NULL);

    return 1;
}


int main()
{

                    makeTimer("First Timer", &firstTimerID, 2, 2);   //2ms
                    makeTimer("Second Timer", &secondTimerID, 10, 10);    //10ms
                    makeTimer("Third Timer", &thirdTimerID, 100, 100);  //100ms

                 while(1)
                    ;;

}
因此,您运行(或试图运行)计时器的速度比您想象的快10倍。如果你在处理程序中所做的任何事情都跟不上信号,那么它们只会排队到一个很小的限制,然后它们就会被丢弃。在这一点上,什么信号被处理,什么信号被丢弃是不可预测的


顺便说一句,我没有看到这种行为,即使我在一台非常普通的5年机器上以任意一个计时器间隔运行它,这让我相信你真正的处理程序所做的任何事情都比你想象的要长。

尝试将2、10和100更改为20、100和1000。我怀疑它会神奇地工作(调用信号处理程序plus
printf
可能总共需要2毫秒以上的时间,而且您正在丢失信号——信号没有排队!)。正常情况下,定时器的分辨率应该很容易达到2ms(反正在我的系统上!)。你说的是真的
its.it_interval.tv_nsec = intervalMS * 100000;
its.it_value.tv_nsec = expireMS * 100000;