[C] Blinkende LED mit Multithreading?

Gast #2448334
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
Gast #2448347
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.
Gast #2448447
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
Gast #2448729
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!

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren