All of lore.kernel.org
 help / color / mirror / Atom feed
From: Lionel Perrin <perrin@domain.hid>
To: xenomai@xenomai.org
Subject: [Xenomai-help] How to make main sleep ? clock_nanosleep ? rt_alarm_wait ?
Date: Thu, 01 Jun 2006 09:41:15 +0200	[thread overview]
Message-ID: <447E9A1B.10507@domain.hid> (raw)

I got some difficulties to use either rt_alarm_wait or clock_nanosleep.
It seems i haven't understood what's a "context that can sleep".

First of all, what do we need to use clock_nanosleep ?
Is it impossible to use this function in the main thread ?

I tried this :

#include <stdio.h>
#include <time.h>
#include <errno.h>

#define NANOCOEF 0.000000001

double getfloattime(const struct timespec *tp){
    return tp->tv_sec + tp->tv_nsec * NANOCOEF;
}

int setfloattime(struct timespec *tp, double val) {
    tp->tv_sec = (time_t)val;
    tp->tv_nsec = (long) ( ( val - (double)(tp->tv_sec) ) / NANOCOEF );
    return 0;
}

int main(int argc, char *argv[])
{
    struct timespec tp, rmtp;
    int ret;
   
    clock_gettime( CLOCK_REALTIME, &tp);
    printf("start time : %lf\n", getfloattime( &tp ));
    setfloattime(&tp, 1.0);
    ret = nanosleep(&tp, &rmtp);
    switch (errno) {
        case 0:       printf("clock_nanosleep ok\n");
        break;
        case EPERM:   printf("the caller context is invalid\n");
        return errno;
        case ENOTSUP: printf("the specified clock is unsupported\n");
        return errno;
        case EINVAL:  printf("the specified wakeup time is invalid\n");
        return errno;
        case EINTR:   printf("this service was interrupted by a signal\n");
        return errno;
    }
    clock_gettime( CLOCK_REALTIME, &tp);
    printf("stop time : %lf\n", getfloattime( &tp ));
    return 0;
}

but nanosleep won't work :(

I also tried to put this nanosleep into a thread, to set thread 
scheduling policy to SCHED_FIFO, but that's not better...
I solve my problem puting nanosleep in thread with policy set to 
'SCHED_FIFO' and adding those lines in main:
mysched.sched_priority = sched_get_priority_max(SCHED_FIFO) - 1;
if( sched_setscheduler( 0, SCHED_FIFO, &mysched ) == -1 ) {
    perror("sched_setscheduler");
}
but I don't know why this is correct...

Is it impossible to make the main thread sleep ?

I had the same problem with native API and rt_alarm_wait.

Any help would be usefull.
Thanks


             reply	other threads:[~2006-06-01  7:41 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2006-06-01  7:41 Lionel Perrin [this message]
2006-06-01  8:44 ` [Xenomai-help] How to make main sleep ? clock_nanosleep ? rt_alarm_wait ? Gilles Chanteperdrix
2006-06-01  9:34   ` Lionel Perrin
2006-06-01 11:09     ` Gilles Chanteperdrix

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=447E9A1B.10507@domain.hid \
    --to=perrin@domain.hid \
    --cc=xenomai@xenomai.org \
    /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.