fp@43: /****************************************************************************** fp@43: * fp@43: * msr_jitter.c fp@43: * fp@43: * Autor: Wilhelm Hagemeister fp@43: * fp@43: * (C) Copyright IgH 2002 fp@43: * Ingenieurgemeinschaft IgH fp@43: * Heinz-Bäcker Str. 34 fp@43: * D-45356 Essen fp@43: * Tel.: +49 201/61 99 31 fp@43: * Fax.: +49 201/61 98 36 fp@43: * E-mail: hm@igh-essen.com fp@43: * fp@43: * $Id$ fp@43: * fp@43: *****************************************************************************/ hm@28: hm@28: #ifndef __KERNEL__ hm@28: # define __KERNEL__ hm@28: #endif hm@28: #ifndef MODULE hm@28: # define MODULE hm@28: #endif hm@28: hm@28: #include hm@28: #include hm@28: #include hm@28: #include hm@28: #include /* maschine-specific registers */ hm@28: #include /* fuer HZ */ hm@28: hm@28: #include hm@28: #include "msr_jitter.h" hm@28: fp@43: /*--includes-----------------------------------------------------------------*/ hm@28: fp@43: /*--external functions-------------------------------------------------------*/ hm@28: fp@43: /*--external data------------------------------------------------------------*/ hm@28: fp@43: /*--public data--------------------------------------------------------------*/ hm@28: fp@43: /*--local data---------------------------------------------------------------*/ hm@28: hm@28: #define NUMCLASSES 16 hm@28: fp@43: static int jittime[NUMCLASSES]={0,1,2,5,10,20,50,100,200,500, fp@43: 1000,2000,5000,10000,20000,50000}; //in usec hm@28: static int jitcount[NUMCLASSES]; hm@28: static double jitpercent[NUMCLASSES]; hm@28: static unsigned int tcount = 1; hm@28: hm@28: static void msr_jit_read(void) hm@28: { hm@28: int i; hm@28: for(i=0;i100) { hm@28: jitpercent[i] = jitcount[i]*100.0/tcount; hm@28: } hm@28: } hm@28: } hm@28: hm@28: void msr_jitter_init(void) hm@28: { fp@43: msr_reg_int_list("/Taskinfo/Jitter/Classes","usec", fp@43: &jittime[0],MSR_R,NUMCLASSES,NULL,NULL,NULL); fp@43: msr_reg_int_list("/Taskinfo/Jitter/Count","", fp@43: &jitcount[0],MSR_R,NUMCLASSES,NULL,NULL,NULL); fp@43: msr_reg_dbl_list("/Taskinfo/Jitter/percent","%", fp@43: &jitpercent[0],MSR_R,NUMCLASSES,NULL,NULL,&msr_jit_read); hm@28: } hm@28: fp@43: /****************************************************************************** fp@43: * fp@43: * Function: msr_jitter_run fp@43: * fp@43: * Beschreibung: fp@43: * fp@43: * fp@43: * Parameter: Zeiger auf msr_data fp@43: * fp@43: * Rückgabe: fp@43: * fp@43: * Status: exp fp@43: * fp@43: *****************************************************************************/ hm@28: hm@28: void msr_jitter_run(unsigned int hz) { hm@28: hm@28: int i,hit; hm@28: static int firstrun = 1; hm@28: static unsigned long k,j = 0; hm@28: unsigned int dt,jitter; hm@28: hm@28: hm@28: rdtscl(k); hm@28: hm@28: tcount++; hm@28: hm@28: //Zeitabstand zwischen zwei Interrupts in usec hm@28: fp@43: dt = ((unsigned long)(100000/HZ)*((unsigned long)(k-j))) fp@43: /(current_cpu_data.loops_per_jiffy/10); hm@28: fp@43: jitter = (unsigned int)abs((int)dt-(int)1000000/hz); fp@43: //jitter errechnet zum Sollabtastrate hm@28: hm@28: //in die Klassen einsortieren hm@28: if(!firstrun) { //das erste mal nicht einsortieren hm@28: hit = 0; hm@28: for(i=0;i=jittime[i] && jitter