Forum: Mikrocontroller und Digitale Elektronik Sleep() macht nicht das was es soll


von Schnarcher (Gast)


Lesenswert?

Vorab: Ich bin neu in der Linux-Welt und kenne mich im Grunde nur mit 
PICs und AVRs aus.

Der Code ist cross-compiliert für einen Raspberry Pi und sollte 
eigentlich gehen.
1
#include <stdio.h>
2
#include <stdlib.h>
3
#include <time.h>
4
#include <unistd.h>
5
#include "c_gpio.h"
6
7
int main(void) {
8
  printf("\nTest_1 Timing\n");
9
  printf  ("=============\n");
10
  int i;
11
  for (i = 0; i<10; i++){
12
    sleep(1);
13
    //DelayMicrosecondsNoSleep (1000000); <- funktioniert nicht
14
    printf ("%i, ", i);
15
  }
16
  printf ("\n");
17
  return EXIT_SUCCESS;
18
19
}
Eigentlich erwarte ich, daß nach jeder Sekunde i schön artig um 1 erhöht 
und printf aufgerufen wird. Das ist aber nicht so, stattdessen passiert 
10 sek lang gar nichts, danach zeigt printf alle Zahlen von 0 bis 9.


Wenn ich zusätzlich aber das hier in die for-Schleife einfüge, 
funktioniert's.
1
s = sleep(1);
2
printf ("sleep(1): %i\n", s);
pi@raspberrypi ~/c-stuff $ ./test_1

Test_1 Timing
=============
sleep(1): 0
0, sleep(1): 0
1, sleep(1): 0
2, sleep(1): 0
3, sleep(1): 0
4, sleep(1): 0
5, sleep(1): 0
6, sleep(1): 0
7, sleep(1): 0
8, sleep(1): 0
9,


Warum ist das so?

Das hab ich in unistd.h gefunden:
1
/* Make the process sleep for SECONDS seconds, or until a signal arrives
2
   and is not ignored.  The function returns the number of seconds less
3
   than SECONDS which it actually slept (thus zero if it slept the full time).
4
   If a signal handler does a `longjmp' or modifies the handling of the
5
   SIGALRM signal while inside `sleep' call, the handling of the SIGALRM
6
   signal afterwards is undefined.  There is no return value to indicate
7
   error, but if `sleep' returns SECONDS, it probably didn't work.
8
9
   This function is a cancellation point and therefore not marked with
10
   __THROW.  */
Steht das damit im Zusammenhang?

von Karl H. (kbuchegg)


Lesenswert?

Schnarcher schrieb:

> Eigentlich erwarte ich, daß nach jeder Sekunde i schön artig um 1 erhöht
> und printf aufgerufen wird. Das ist aber nicht so, stattdessen passiert
> 10 sek lang gar nichts, danach zeigt printf alle Zahlen von 0 bis 9.

Klarer Fall von Output Buffering.

Entweder stdout mal flushen oder im printf einen \n ausgeben lassen.

von Karl H. (kbuchegg)


Lesenswert?

>
1
> printf ("sleep(1): %i\n", s);
2
3
                       ****
4
>

das hier ist der entscheidende Punkt.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Schnarcher schrieb:
> Eigentlich erwarte ich, daß nach jeder Sekunde i schön artig um 1 erhöht
> und printf aufgerufen wird. Das ist aber nicht so, stattdessen passiert
> 10 sek lang gar nichts, danach zeigt printf alle Zahlen von 0 bis 9.

Es fehlt ein

    fflush(stdout);

nach dem printf().

Also:

    printf ("%i, ", i);
    fflush(stdout);

Die stdio-Bibliothek buffert. Bei Consolen/Terminals bis zum nächsten 
'\n'. Mit fflush() kannst Du die Ausgabe erzwingen.

von Schnarcher (Gast)


Lesenswert?

Danke, nun geht's.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.