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/