Hello,
I will try to help as I have been looking into a similar
benchmark problem. Hopefully someone will correct me if
I am wrong.
In init_module():
[1] you call rt_set_oneshot_mode() followed by
start_rt_timer(). Since start_rt_timer() sets the
timer mode back to periodic, rt_set_oneshot_mode()
does you no good.
[2] I think here is the real problem. The call to
start_rt_timer() has a value LARGER than the
call to rt_task_make_periodic(). I believe the
value for rt_task_make_periodic() must be a
multiple of the value in start_rt_timer(). Try
defining TICK_PERIOD to 700000 or 700000 divided
by some whole number and I think you will see the
bad jitter go away.
Maybe Paolo or someone else can shed more light.
Are there recommended min and max values for the call
to start_rt_timer() for 8254? APIC?
Hope this helps.
Rich
-----Original Message-----
From: Sebastien GAUME [mailto:[EMAIL PROTECTED]]
Sent: Tuesday, May 15, 2001 7:53 AM
To: [EMAIL PROTECTED]; [EMAIL PROTECTED]; Paolo Mantegazza
Subject: [rtl] Wrong calibration ?
Hello,
I'm doing basic tests with a periodic task : I'm measuring when the task
really wakes up which enables me to know much more about the jitter.
I sometimes obtain excellent results (the jitter value is about 1 us)
but I sometimes come across quite surprising results. By surprising
results, I mean that the jitter is increasing more and more ; for
instance, after 30 s, the jitter is about 100 us !
These problems occure on the two PCs I am using : one is a P166 MMX with
96M Ram, the other is a PII 350 with 64M Ram. On both PC, I am using
RTAI 1.6 with linux kernel 2.2.17.
I first thought the trouble was coming from the CPU frequency. That's
why I used your CPU frequency calibration. Unfortunately, the results
became as bad as the earlier were, and even worse sometimes.
The latency calibration was realized on both PC, but it did not change
anything. I even tried to realize the latency calibration offered by
RTAI 24.1.4. but the results go on being either excellent either bad.
I provide you the test code. So, if you have any idea of where the
problem comes from, do not hesitate e-mailing me. Thank you.
Sebastien
#include <linux/module.h>
#include <asm/io.h>
#include <rtai.h>
#include <rtai_fifos.h>
#include <rtai_sched.h>
#define TICK_PERIOD 1000000
#define STACK_SIZE 4000
#define LOAD 16550
RT_TASK tache_periodique[1];
RTIME now, tick_period;
struct donnees_
{
int tache; // id tache
int passage; // nombre de passages
long long temps; // temps entre 2 passages
long long duree; // duree de la tache
};
void periodic_task(int id_tache)
{
int compteur, cpt_load;
long long time_cpu, intermediate_time_cpu, end_time, task_duration;
struct donnees_ donnees;
// recopie id de la tache
donnees.tache = id_tache;
// initialisation compteur nb de reveils de la tache
compteur = 0;
while(1)
{
// recuperation date de reveil de la tache
intermediate_time_cpu = rt_get_cpu_time_ns();
// calcul de la date de reveil en partant de la date de lancement de
l'application
time_cpu = intermediate_time_cpu - count2nano(now);
// recopie des donnes concernant la tache dans la structure donnees
donnees.passage = compteur;
donnees.temps = time_cpu;
// chargement du cpu
rt_busy_sleep(200000);
// recuperation date de fin de la tache
end_time = rt_get_cpu_time_ns();
// calcul de la duree de la tache
task_duration = end_time - intermediate_time_cpu;
// recopie de la duree de la tache dans
donnees.duree = task_duration;
// envoi de la structure donnees (par fifo) // tous les 500 passages
if (compteur % 500 == 0)
{
if (rtf_put(0, &donnees, sizeof(donnees)) < sizeof(donnees))
{
rt_printk("impossible d'ecrire dans la fifo \n");
rt_task_suspend(&tache_periodique[id_tache]);
}
}
// on incremente le compteur nb de reveils de la tache
compteur++;
//attente prochaine periode de reveil
rt_task_wait_period();
}
}
int init_module(void)
{
//creation de la fifo
rtf_create(0, 100000);
// initialisation des taches
rt_task_init(&tache_periodique[0], periodic_task, 0, STACK_SIZE, 5, 0,
0);
// definition du mode (oneshot)
rt_set_oneshot_mode();
// lancement du timer
tick_period = start_rt_timer(nano2count(TICK_PERIOD));
// recuperation de la date actuelle
now = rt_get_time();
rt_printk("now %d \n", count2nano(now));
// lancement de la tache periodique
rt_task_make_periodic(&tache_periodique[0], now+nano2count(500000),
nano2count(700000));
return 0;
}
void cleanup_module(void)
{
// arret du timer
stop_rt_timer();
// destruction de la fifo
rtf_destroy(0);
// destruction des taches
rt_task_delete(&tache_periodique[0]);
printk("Et c'est fini !!!!!!!!\n\n");
}
-- [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/
-- [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/