On Wed, 7 Sep 2005, Dr. Adrian Botescu-Fianu wrote:

> M-am dat cu capul zdravan de "timing". la viteza de 512bps pe care vreau sa o
> simulez pe pinul DTR al portului serial ar trebui sa il mentin intr-o stare
> timp de aproximativ 2milisecunde. Am crezut initial ca nu merge din cauza
> unei latente a schimbarii starii pinului DTR si am incercat ceva mai simplu
> (adica nu am mai schimbat starea pinului DTR) care a dovedit ca problema nu
> era acolo:
>
> #include <sys/time.h>
> #include <sched.h>
> #include <time.h>
> #include <stdio.h>
>
> int n;
> const struct timespec bps512 = { 0, 1953125};
> struct sched_param s;
>
> int main (void){
> struct timeval before, after;
>
> s.sched_priority = sched_get_priority_max (SCHED_FIFO);
> if (sched_setscheduler ( 0, SCHED_FIFO, &s ) == -1) {
>   fprintf (stderr, "Error setting scheduling policy. Aborting \n");
>   return 1;
> }
> for(n=0;n<512;n++) {
> gettimeofday(&before, NULL);
>  nanosleep (&bps512, 0);
> gettimeofday(&after, NULL);
> printf ("Elapsed microseconds: %d\n",
>            after.tv_sec * 1000000 + after.tv_usec -
>            before.tv_sec * 1000000 - before.tv_usec ) ;
> }
> }
>
>
>
> Linuxul meu Slack 10.0 pe un Sempron la 2800, 512MB RAM si kernel 2.4.29 Nu
> are de loc precizie la folosirea nanosleep() din C. Daca dau prioritate

Din manualul lui nanosleep:
BUGS
        The  current  implementation  of  nanosleep is based on the normal 
kernel timer
        mechanism, which has a resolution of 1/HZ s (i.e, 10 ms on 
Linux/i386 and  1 ms
        on Linux/Alpha).  Therefore, nanosleep pauses always for at least 
the specified
        time, however it can take up to 10 ms longer than specified until 
the  process
        becomes  runnable  again.  For the same reason, the value returned 
in case of a
        delivered signal in *rem is usually rounded to  the  next  larger 
multiple  of
        1/HZ s

Lamurit ?

> maxima procesului pauza este in sfarsit cea pe care o doresc dar apar alte
> belele. Sistemul devine neutilizabil pe toata perioada rularii programului.Am
> compilat 2.6.13 si daca ii dau prioritate maxima procesului in loc de 2ms
> doarme in jur de 8 dar constant, fara ca sistemul sa se blocheze, dar tot nu
> ma ajuta cu nimic.
> Pe un Athlon XP 2400 parca, tot cu slack dar cu kernel 2.6.0 recompilat din
> surse se mai apropie de pauza pe care o vreau de 2milisecunde dar variaza
> totusi ajungand si la 4ms.
>

Cum ai masurat tu pauza asta ?

> Chiar nu pot face in nici un fel sa obtin o precizie buna pt un sleep de 2
> milisecunde? Exista o solutie mai buna decat cea aplicata? Cum de s-a putut
> face asa ceva in dos acum 12 ani si in C sub Linux nu se poate?
>

Linux e un OS multiuser cu preemtible multitasking.  DOS era un OS (i 
guess ;-))
In linux intre nanosleep-ul tau si gettimeofday-ul tau se pot intimpla 
multe lucruri


--

Pe Slashdot:
"You, Sir, are one of the half-digested pieces of poisonous, rotten meat
in the vomit of a dying democracy."


Raspunde prin e-mail lui