Hi !

I've been using rt-linux for a couple of days and I notice strange 
crashes while running some of my tests. Let me explain what I'm trying 
to do.

I wrote several tests so as to compare the different clock modes 
(oneshot or periodic) and to measure the time required to wake up a task.

Here is one of my test :

// RTL - ONESHOT - 1 TACHE

#include <rtl.h>
#include <pthread.h>
#include <rtl_fifo.h>

#define FIFO_TAILLE    50000
#define NUM_FIFO    0
#define PERIODE        100000 // periode de 100 ?s   

#define LOAD         16660

pthread_t tache1;

hrtime_t debut;

struct data_   
   {
   int tache;        // numero de la tache
   int passage;        // nombre de passages
   double delta;        // temps entre 2 passages
   double duree;        // duree de la tache
   };
      
void *code_tache(void * n)
{
   hrtime_t time, end_time;
   struct data_ data;
   int compteur = 0;
   int cpt_load;
   struct sched_param p;
  
   data.tache = (int)n;
   
   // choix du mode de l'horloge
   rtl_setclockmode(rtl_getschedclock(),RTL_CLOCK_MODE_ONESHOT,PERIODE);

   // definition des parametres de l'ordonnanceur
   p.sched_priority = 5;
   pthread_setschedparam (tache1, SCHED_FIFO, &p);

    // tache periodique commencant dans 5 PERIODES, de periode 10 PERIODES
   debut = gethrtime(); // date de lancement de la tache
   rtl_printf("debut = %d\n",debut);
   pthread_make_periodic_np (tache1, debut + 5*PERIODE, 10*PERIODE);
    
   while (1)
   {
       // attente du prochain top d'horloge
       pthread_wait_np ();
      
       // acquisition de la date
       time = gethrtime();
      
       // calculs       
       data.delta = time - debut;
       data.passage = compteur;
      
       // boucle pour charger le CPU, duree de 200?s
       for (cpt_load = 0; cpt_load < LOAD; cpt_load++)
       {
           cpt_load++;
           cpt_load--;
       }
      
       // acquisition de la date
       end_time = gethrtime();       
      
       // calculs des donnees
           data.duree = end_time - time;
      
           // ecriture dans la FIFO
       if(rtf_put(NUM_FIFO, (char *) &data, sizeof(data)) < 0)
       {
           // si ecriture impossible, arret de la tache
           rtl_printf("impossible d'ecrire dans la fifo \n");
           pthread_suspend_np(pthread_self());   
       }

       compteur++;
   }

   return 0;
}


int init_module(void)
{   
   // creation d'une FIFO
   rtf_create(NUM_FIFO, FIFO_TAILLE);

   // creation de la tache avec les valeurs par defaut
   pthread_create (&tache1, NULL, code_tache, (void *)0);
          
   return 0;
}


void cleanup_module(void)
{
   // destruction de la FIFO
   rtf_destroy(NUM_FIFO);

   // effacement des taches
   pthread_delete_np(tache1);
}


What strikes me most is that this test may run or not : you never know ! 
Thus it does not always crash at the same place. But, most of the time, 
I have this message in dmesg :

Unable to handle kernel NULL pointer dereference at virtual address 00000070
current->tss.cr3 = 05b8b000, %cr3 = 05b8b000
*pde = 00000000
Oops: 0000
CPU:    0
EIP:    0010:[<c0107f5e>]
EFLAGS: 00010282
eax: 00000000   ebx: c5b6a000   ecx: c303e000   edx: c5e39360
esi: c303e000   edi: c0229e00   ebp: c3040014   esp: c5b6bf10
ds: 0018   es: 0018   ss: 0018
Process klogd (pid: 350, process nr: 10, stackpage=c5b6b000)
Stack: c0110e12 00000003 00000086 00000000 00000000 b00c5180 000000c7 
00000000
      00000050 c6821100 c681a6a7 00000086 c5969c00 c6829400 c5b6bf50 
c6823ded
      c5b6bf60 c6820631 c5b6bfc4 00000000 c5b6bfbc c681a4be 00000000 
c5b6bfc4
Call Trace: [<c0110e12>] [<c6821100>] [<c681a6a7>] [<c6829400>] 
[<c6823ded>] [<c
6820631>] [<c681a4be>]
      [<c0109178>]
Code: 8b 40 70 39 42 70 74 07 0f 00 93 40 02 00 00 8b 83 fc 01 00

What's wrong in my test ?

Thank you for your help

Sebastien
-- [rtl] ---
To unsubscribe:
echo "unsubscribe rtl" | mail [EMAIL PROTECTED] OR
echo "unsubscribe rtl <Your_email>" | mail [EMAIL PROTECTED]
--
For more information on Real-Time Linux see:
http://www.rtlinux.org/rtlinux/

Reply via email to