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."