#include #include #include #include #include #include #include #include #include #include #include #define MMAP_LEN 1024 #define FPGA_DEV "/dev/firq" struct irq_tstat { unsigned int min; unsigned int max; unsigned int avg; }; //global variables for thread pthread_mutex_t slowThreadMutex; int finish=0; int firq_dev; void *mmap_base; struct irq_tstat is; struct irq_tstat tstat; void outputStat(const char *mode,struct irq_tstat val) { float tcl = .00000004000000000000; printf("%s min:%.9f max:%.9f avg:%.9f\n",mode,val.min*tcl,val.max*tcl,val.avg*tcl); } void sighandler(int signum) { finish=1; } static void *rtthread(void *arg) { while(!finish) { read(firq_dev,&is,sizeof(is)); unsigned int counter = *((unsigned int*)(mmap_base+0x3C)); unsigned int reload = *((unsigned int*)(mmap_base+0x40)); unsigned diff = counter - reload; if(tstat.min>diff) tstat.min=diff; if(tstat.max>1; pthread_mutex_unlock(&slowThreadMutex); } } int main(int argc,char* argv[]) { pthread_mutexattr_t mutexattr; pthread_attr_t rtattr; pthread_t tid; struct sched_param params; struct sigaction action; unsigned char c; unsigned short s; unsigned int w; int address; char access; char *endptr; int res; int i; struct sched_param param; tstat.min=0xffffffff; tstat.max=0; tstat.avg=1; printf("threaded version:1\n"); firq_dev=open(FPGA_DEV,O_RDWR); if(firq_dev==-1) { perror(FPGA_DEV); exit(1); }; mmap_base=mmap(0,MMAP_LEN,PROT_READ|PROT_WRITE,MAP_SHARED|MAP_LOCKED,firq_dev,0); if((int)mmap_base==-1) { perror("mmap"); exit(2); } for(i=0;i<20;i++) { action.sa_handler=sighandler; sigaction(i,&action,NULL); } pthread_mutexattr_init (&mutexattr); //pthread_mutexattr_setprotocol (&mutexattr, PTHREAD_PRIO_NONE); pthread_mutex_init(&slowThreadMutex,&mutexattr); pthread_attr_init(&rtattr); pthread_attr_setschedpolicy(&rtattr, SCHED_FIFO); params.sched_priority = 98; pthread_attr_setschedparam(&rtattr, ¶ms); pthread_create(&tid,&rtattr,rtthread,NULL); /* param.sched_priority=98; if(sched_setscheduler(0,SCHED_FIFO,¶m) == -1) { perror("MeasThread::run(), sched_setscheduler"); exit(-1); } */ while(!finish) { pthread_mutex_lock(&slowThreadMutex); outputStat("rusermode",tstat); outputStat("rirq ",is); printf("usermode min:%u max:%u avg:%u\n",tstat.min,tstat.max,tstat.avg); printf("irq min:%u max:%u avg:%u\n",is.min,is.max,is.avg); } res=munmap(mmap_base,MMAP_LEN); close(firq_dev); return 0; }