All of lore.kernel.org
 help / color / mirror / Atom feed
From: Daniel Simon <Daniel.Simon@domain.hid>
To: Xenomai-help@domain.hid
Subject: [Xenomai-help] starnge latencies with native
Date: Fri, 12 May 2006 17:24:56 +0200	[thread overview]
Message-ID: <20060512172456.555caf51@domain.hid> (raw)

[-- Attachment #1: Type: text/plain, Size: 1571 bytes --]

Hi all,

I'm doing some tests with the native skins. The attached program uses
an alarm to trigger a periodic task and measures the sampling latency. 

Initial latencies are in the range of tens of millisecs. and then
decrease slowly to the range of microsecs:

rt_timer_set_mode(TM_ONESHOT) started 
alarm started with period 1000000000 ns 
increment 1124642266 absjitter 124642266  
increment 937743828 absjitter 62256172  
increment 1031095424 absjitter 31095424  
increment 984466651 absjitter 15533349  
increment 1007758686 absjitter 7758686  
increment 996126407 absjitter 3873593  
increment 1001934707 absjitter 1934707  
increment 999039749 absjitter 960251  
increment 1000477139 absjitter 477139  
increment 999759707 absjitter 240293  
increment 1000119631 absjitter 119631  
increment 999938964 absjitter 61036  
increment 1000029816 absjitter 29816  
increment 999985508 absjitter 14492  
increment 1000004750 absjitter 4750  
increment 999998882 absjitter 1118  
increment 1000000946 absjitter 946  
increment 999998780 absjitter 1220  
increment 1000001951 absjitter 1951  
increment 999999514 absjitter 486  
increment 999998746 absjitter 1254  
[...]

 What may be wrong? 

I observe the same behaviour if the periodic sampling is given by a
rt_periodic task or by a rt_sleep_until in the clock loop...

	Daniel

-- 
      Daniel SIMON    Projet POP ART  INRIA Rhone-Alpes
ZIRST, 655 avenue de l'Europe, 38330 MONTBONNOT SAINT MARTIN, FRANCE 
 Daniel.Simon@domain.hid Phone:(33)476615328 Fax:(33)476615252
	 http://pop-art.inrialpes.fr/people/simon/



[-- Attachment #2: orcalarm.c --]
[-- Type: text/x-csrc, Size: 4787 bytes --]

//#include "orcnative.h"
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <signal.h>
#include <sys/time.h>
#include <sys/io.h>
#include <sys/mman.h>
#include <native/types.h>
#include <native/task.h>
#include <native/queue.h>
#include <native/intr.h>
#include <native/timer.h>
#include <native/sem.h>
#include <native/alarm.h>
#include <native/heap.h>
#include <native/queue.h>
#include <native/syscall.h>
#define STACK_SIZE 8192
#define MIN_PRIO 1
#define MAX_PRIO 99

typedef void * (*FUNCPTR) (void *);
typedef void * (*SOSO) (void *); /**< Special type to be used for casting in pthread_create() */
//                     --s-ms-us-ns
RTIME task_period_ns = 1000000000llu;
#define NSEC_PER_SEC 1000000000
#define NBCLKS 3
#define BASECLK 0.001 //seconds !!!

#define OK 0
#define ERROR -1
#define STATUS int

#define FALSE 0
#define TRUE 1
#define POLICY 1

static int ji = 0;
//static int togparport = 0;
static RTIME startime, now, inittime, nexttime;
static long long hjitter, jinc, max, moy, drift, jitter;
struct timespec clock_resolution;

RT_SEM mainSem;
RT_SEM handSem;
RT_ALARM BaseClk;
int status, err, end = 0;
//pthread_t * tid;
char *dummy;
RT_TASK thr_clockit;


///Function that returns the cpu time in nanoseconds
inline long long GetCpuTime(void)
{
    return (long long)rt_timer_read();
}

// Trap Ctrl C Interruption
void clean_exit(int dummy)
{
    printf("Ctrl C Interrupt\n");
/*     printf("rt_sem_v(mainSem); \n"); */
/*     rt_sem_v(&mainSem); */
    end = 1;
    err = rt_task_join(&thr_clockit);
    if (err != 0)printf("rt_task_join() error %d \n", err);

    printf("deleting rt devices \n");
    rt_alarm_delete(&BaseClk);
    rt_task_delete(&thr_clockit);
    //rt_sem_delete(&mainSem);
    return ;
}

int orcTimerSigMask(void)
{
    sigset_t set;
    sigfillset(&set);
    if ((err = pthread_sigmask(SIG_BLOCK, &set, NULL)) != OK)
    {
        printf("pthread_sigmask Failed %d \n", err);
        return ERROR;
    }
    sigemptyset(&set);
    sigaddset(&set, SIGINT);
    sigaddset(&set, SIGTERM);
    if ((err = pthread_sigmask(SIG_UNBLOCK, &set, NULL)) != OK)
    {
        printf("pthread_sigmask Failed %d \n", err);
        return ERROR;
    }

    return OK;
}

void setTimer(void)
{
    /***starting timer ***/
    err = rt_timer_set_mode(TM_ONESHOT);
    if (err != 0)perror("rt_timer_set_mode()");
    else printf("rt_timer_set_mode(TM_ONESHOT) started \n");
    err = rt_alarm_create(&BaseClk, "BaseClock");
    if (err != 0)printf("rt_alarm_create() error %d \n", err);
    err = rt_alarm_start(&BaseClk,
                         task_period_ns,
                         task_period_ns);
    if (err != 0)printf("rt_alarm_start() error %d \n", err);

    else printf("alarm started with period %llu ns \n", task_period_ns);
    return ;

}

void clock_it(void *cookie)
{
  int ret;
    while (!end)
    {
        ret = rt_task_set_mode(0, T_PRIMARY, NULL);
        if (ret)
        {
            printf("error while rt_task_set_mode, code %d\n", ret);
            return ;
        }
/* #ifdef DEBUG */
/*         printf("before alarm_wait \n"); */
/* #endif */
        err = rt_alarm_wait(&BaseClk);
        now = GetCpuTime();
/* #ifdef DEBUG */
/*         printf("clock_it loop\n"); */
/* #endif */
        if (ji == 0)
        {
            max = moy = drift = 0;
            startime = now;
            ji++;
        }
        else if (ji == 1)
        {
            ji++;startime = now;
        }
        else
        {
            jinc = (long long)(now - startime);
            jitter = (jinc - (long long)task_period_ns );
            drift += jitter;
            hjitter = abs(jitter);
            moy += hjitter;
            ji++;
            if (hjitter > max) max = hjitter;
#ifdef DEBUG
            printf("increment %ld absjitter %ld  \n", (long)jinc, (long) hjitter);
#endif
            startime = now;
        }
    }
    printf ("jittermoy = %ld, jittermax = %ld \n", (long)moy / ji, (long)max);
    return ;
}

int main(void)
{

    orcTimerSigMask();

    mlockall(MCL_CURRENT | MCL_FUTURE);

    signal(SIGTERM, clean_exit);
    signal(SIGINT, clean_exit);

    setTimer();

    err = rt_task_spawn(&thr_clockit,
                        "MyAlarmServer",
                        0,
                        MAX_PRIO,
                        T_FPU|T_JOINABLE,
                        &clock_it,
                        NULL);

    if (err != 0) printf("rt_task_spawn error %d \n", err);

/*     err = rt_sem_create(&mainSem, "MainSem", 0, S_FIFO); */
/*     if (err != 0) printf("rt_sem_create error %d \n", err); */

/*     err = rt_sem_p(&mainSem, TM_INFINITE); */
/*     if (err != 0) printf("rt_sem_p error %d \n", err); */


    pause();
    fflush(NULL);

    return 0;
}




             reply	other threads:[~2006-05-12 15:24 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2006-05-12 15:24 Daniel Simon [this message]
2006-05-12 16:08 ` [Xenomai-help] starnge latencies with native Philippe Gerum
2006-05-12 16:25 ` Gilles Chanteperdrix
     [not found]   ` <20060512185206.3a6b2705@domain.hid>
2006-05-12 17:47     ` Gilles Chanteperdrix
2006-05-15  8:31       ` Daniel Simon

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20060512172456.555caf51@domain.hid \
    --to=daniel.simon@domain.hid \
    --cc=Xenomai-help@domain.hid \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.