微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何检查计时器任务是否在后台运行?

下面的代码用于通过udp层的套接字接收来自主设备的数据。 在我的项目中有一些API支持,我创build了一个计时器任务,每2ms,10ms等等调用任务。

我正在使用远程C / C ++应用程序在eclipse IDE中的embedded式PC目标上debugging此程序。 我正在调用CreateSocket函数内的CreateSocket maketimer (alarm) 。 但是如何在后台每隔2ms,10ms和100ms检查定时器任务调用函数TASK1,TASK2和TASK3?

#include "MAIN.h" #define BILLION 1000000L timer_t firstTimerID,secondTimerID,thirdTimerID; double Task2ms_Raster,Task10ms_Raster,Task100ms_Raster ; int connectedSocket,acceptSocket; struct sockaddr_in addr; struct sockaddr client,dest; char buf[128]; long rc,sentbytes; int port = 18017; void TASK1(Task2ms_Raster) { struct timespec start,stop; uint32 StartTime,StopTime; if( (StartTime = clock_gettime( CLOCK_REALTIME,&start)) == -1 ) { perror("clock gettime"); } // return EXIT_SUCCESS; /* Trigger DAQ for the 2ms XCP raster. */ if( XCPEVENT_DAQ_OVERLOAD & Xcp_DoDaqForEvent_2msRstr( )) { ++numDaqOverload2ms; } /* Update those variables which are modified every 2ms. */ counter32 += slope32; /* Trigger STIM for the 2ms XCP raster. */ if( enableBypass2ms ) { if( XCPEVENT_MISSING_DTO & Xcp_DoStimForEvent_2msRstr( ) ) { ++numMissingDto2ms; } } if( (StopTime = clock_gettime( CLOCK_REALTIME,&stop)) == -1 ) { perror( "clock gettime" ); } duration2ms = ( stop.tv_sec - start.tv_sec ) + (double)( stop.tv_nsec - start.tv_nsec ) / (double)BILLION; printf( "time difference is= %ldn",duration2ms ); } void TASK2(Task10ms_Raster) { struct timespec start,stop; if( clock_gettime( CLOCK_REALTIME,&start) == -1 ) { perror( "clock gettime" ); } /* Trigger DAQ for the 10ms XCP raster. */ if( XCPEVENT_DAQ_OVERLOAD & Xcp_DoDaqForEvent_10msRstr( )) { ++numDaqOverload10ms; } /* Update those variables which are modified every 10ms. */ counter16 += slope16; /* Trigger STIM for the 10ms XCP raster. */ if( enableBypass10ms ) { if( XCPEVENT_MISSING_DTO & Xcp_DoStimForEvent_10msRstr( ) ) { ++numMissingDto10ms; } } if( clock_gettime( CLOCK_REALTIME,&stop) == -1 ) { perror( "clock gettime" ); } XCP_FN_TYPE Xcp_CmdProcessor ( ); duration10ms = ( stop.tv_sec - start.tv_sec ) + (double)( stop.tv_nsec - start.tv_nsec ) / (double)BILLION; printf( "time difference is= %ldn",duration10ms ); } void TASK3(Task100ms_Raster) { struct timespec start,&start) == -1 ) { perror( "clock gettime" ); } /* Trigger DAQ for the 100ms XCP raster. */ if( XCPEVENT_DAQ_OVERLOAD & Xcp_DoDaqForEvent_100msRstr( )) { ++numDaqOverload100ms; } /* Update those variables which are modified every 100ms. */ counter8 += slope8; /* Trigger STIM for the 100ms XCP raster. */ if( enableBypass100ms ) { if( XCPEVENT_MISSING_DTO & Xcp_DoStimForEvent_100msRstr( ) ) { ++numMissingDto100ms; } } if((clock_gettime( CLOCK_REALTIME,&stop)) == -1 ) { perror( "clock gettime" ); } duration100ms = ( stop.tv_sec - start.tv_sec ) + (double)( stop.tv_nsec - start.tv_nsec ) / (double)BILLION; printf( "time difference is= %ldn",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 * 1000000; its.it_value.tv_sec = 0; its.it_value.tv_nsec = expireMS * 1000000; timer_settime(*timerID,&its,NULL); return 1; } int CreateSocket() { if(rc!=0) { printf("socket failure code: %ldn",rc); return 1; } else { printf("socket started!n"); } // Socket creation for UDP acceptSocket=socket(AF_INET,SOCK_DGRAM,0); if(acceptSocket==-1) { printf("Failure: socket creation is Failed,failure coden"); return 1; } else { printf("Socket started!n"); } memset(&addr,sizeof(addr)); addr.sin_family=AF_INET; addr.sin_port=htons(port); addr.sin_addr.s_addr=htonl(INADDR_ANY); rc=bind(acceptSocket,(struct sockaddr*)&addr,sizeof(addr)); if(rc== -1) { printf("Failure: listen,failure code:n"); return 1; } else { printf("Socket an port %d n",port); } while(rc!=-1) { rc= recvfrom(acceptSocket,buf,128,(struct sockaddr*)&client,sizeof(client)); if(rc==0) { printf("Server has no connection..n"); break; } if(rc==-1) { printf("failure: recv,failure coden"); break; } XcpIp_RxCallback( (uint16) rc,(uint8*) buf,(uint16) port ); makeTimer("First Timer",&firstTimerID,2,2); //2ms makeTimer("Second Timer",&secondTimerID,10,10); //10ms makeTimer("Third Timer",&thirdTimerID,100,100); //100ms // buf[rc]=''; // printf("Client sendet: %sn",buf); // sprintf(buf2,"Du mich auch %s",buf); // rc=sendto(connectedSocket,buf2,strlen(buf2),0); } close(acceptSocket); return 0; } int main() { Xcp_Initialize(); CreateSocket(); return 0; } void XcpApp_IpTransmit( uint16 XcpPort,Xcp_StatePtr8 pBytes,uint16 numBytes ) { if ((long)XcpPort==port) { sentbytes = sendto(acceptSocket,(char*)pBytes,(long)numBytes,(struct sockaddr*) &dest,sizeof(dest)); } XcpIp_TxCallback(port,(uint16)sentbytes); }

为什么我的hrtimercallback在转发之后返回太早?

如何在Linux中创build高分辨率定时器来衡量程序性能

Linux timerfd,每x秒调用一次函数而不阻塞代码的执行

用amd64上的debian linuxtestingtimerfd_create

disable_local_irq和内核定时器

Linux是否为应用程序提供单调递增的时钟?

System.currentTimeMillis与System.nanoTime

在Windows上安装定时器/时钟ISR – 在单线程环境中进行asynchronous调用

如何在Linux内核设备驱动程序中使用定时器?

降低linux内核定时器的频率

读时间(7)和信号(7) 。

顺便说一下,你的BILLION是错的。 你可能应该有

#define BILLION 1.0e9

(因为你只在浮点表达式中使用它)

你可以有三个线程(阅读一个pthreads教程 ),一个用于TASK1,一个用于TASK2,一个用于TASK3(也许使用clock_nanosleep(2) …)。 或者(最好)你可以有一个单一的事件循环 (例如轮询(2)或ppoll(2)复用调用….),也许也使用timerfd_create(2)获取计时器事件,并管理套接字。 看到这个基于poll的事件循环的例子 。 你应该适应它也使用timerfd_create获得的timerfd_create 。你也可以使用一些事件循环库,如libevent或libev

请注意,2毫秒是一个非常小的延迟。 (你想成为多可靠?)

阅读高级Linux编程

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐