Forum: PC-Programmierung [C] Blinkende LED mit Multithreading?


von matthias (Gast)


Lesenswert?

Hallo zusammen!

Experimentiere gerade mit meinem Single-board Computer und bin dabei an 
folgende Aufgabenstellung gestoßen. Ich möchte gerne Hardware-GPIO 
ansteuern, zum Beispiel eine LED blinken lassen. Nachdem ich z.B. jede 
Sekunde die LED ein- und dann wieder anschalten will, aber als 
nicht-blockierende Funktion (sprich in der Wartezeit soll das Programm 
normal weiterlaufen; die LED als eine Art "Heartbeat" oder 
Status-Anzeige) habe ich mir mal POSIX-Threads anschauen.

Ich habe mir mal diese Seite angeschaut 
http://softpixel.com/~cwright/programming/threads/threads.c.php und den 
Code etwa so modifiziert:
1
#include <pthread.h>
2
#include <stdio.h>
3
4
void *threadFunc(void *arg)
5
{
6
        while(1)
7
  {
8
                printf("Switch LED ON\n");
9
    usleep(1000000);
10
                printf("Switch LED ON\n");
11
    usleep(1000000);
12
  }
13
14
  return NULL;
15
}
16
17
int main(void)
18
{
19
  pthread_t pth;  // this is our thread identifier
20
  int i = 0;
21
22
  pthread_create(&pth,NULL,threadFunc,"foo");
23
  
24
  while(1)
25
  {
26
    usleep(1);
27
    DoSomething();
28
  }
29
30
  printf("main waiting for thread to terminate...\n");
31
  pthread_join(pth,NULL);
32
33
  return 0;
34
}

Leider scheint das mit threadFunc nicht so ganz zu funktionieren. Wenn 
ich aber noch ein printf in die while-Schleife der main-Funktion mache 
mit einer sinnlosen Ausgabe scheints zu gehen. Kann mir da jemand 
helfen?

Danke im Voraus!

Gruß
Matthias

von Klaus W. (mfgkw)


Lesenswert?

matthias schrieb:
> nicht so ganz zu funktionieren

so genau wollte den Fehler niemand beschrieben haben!

von matthias (Gast)


Lesenswert?

Klaus Wachtler schrieb:
> matthias schrieb:
>> nicht so ganz zu funktionieren
>
> so genau wollte den Fehler niemand beschrieben haben!

Der Text in den printfs aus threadFunc wird nicht angezeigt. Außer ich 
gebe z.B. in der while-Schleife in der main Leerzeichen aus. Hat das was 
mit Timing zu tun? Oder optimiert mir der Compiler vielleicht was weg? 
DoSomething habe ich nur mal symbolisch in den Code eingefügt.

Hab's mit GCC auf einem Atmel ARM9 unter Debian Linux kompiliert.

von Tom (Gast)


Lesenswert?

Bei mir (gcc, Ubuntu, X86)  funktioniert es wie erwartet.
Was passiert, wenn du nach jedem printf
1
fflush (stdout);
 aufrufst?

von Rolf Magnus (Gast)


Lesenswert?

matthias schrieb:
>     usleep(1);

Das ist allerdings eine extrem kurze Wartezeit. Ändert sich da was, wenn 
du die mal erheblich länger machst?

von matthias (Gast)


Lesenswert?

Tom schrieb:
> Bei mir (gcc, Ubuntu, X86)  funktioniert es wie erwartet.
> Was passiert, wenn du nach jedem printffflush (stdout); aufrufst?

Autsch.. sieht gut aus mit einem fflush(stdout). Greife ja auch gerade 
nur über die serielle Debugging-Schnittstelle zu. Ich würde das mal 
unter Anfängerfehler verbuchen. Aber super, dass es funktioniert. Danke 
für eure Hilfe!

Dachte schon es wäre ein semantischer Fehler! :D

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Suffering from Buffering?

Irgendwie kann man doch die Puffergröße auf 0 setzten, so daß man den 
Code nicht überall mit fflush verunstalten muss?

von Klaus W. (mfgkw)


Lesenswert?

und eigentlich ist stdout zeilenweise gepuffert, es sollte also 
funktionieren.
Deshalb glaube ich noch nicht, daß es die ganze Wahrheit ist - aber wenn 
es geht...

von matthias (Gast)


Lesenswert?

Klaus Wachtler schrieb:
> und eigentlich ist stdout zeilenweise gepuffert, es sollte also
> funktionieren.
> Deshalb glaube ich noch nicht, daß es die ganze Wahrheit ist - aber wenn
> es geht...

Hallo Klaus! Dooferweise hatte ich keine komfortable Möglichkeit den 
Code vom System auf meinen Rechner zu kopieren bzw. war das System schon 
aus, als ich mich entschlossen hab doch noch ins Forum zu posten. Mein 
echter Code hatte blöderweise wahrscheinlich keine Zeilenumbrüche in der 
Thread-Funktion. Werde ich später mal austesten.

Danke nochmal!

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.