xilkernel Thread

Gast #2661677
Lesenswert?
• ▲
▼
Hallo,

ich brauche Hilfe beim Erstellen eines Thread im Xilkernel. Es sollen 
zwei Programme parallel ablaufen.

Der Code unten zeigt, wie ich's gemacht habe. Aber an die untere Stelle 
"HIER KOMME ICH NICHT AN" kommt der Code leider nie. Er bleibt im Thread 
hängen.

Habe ich einen Denkfehler, oder ist der Thread-Aufbau falsch?

Wäre super, wenn mir jmd helfen könnte.

1
void muster_thread(){
2
    xil_printf("Thread-TEST");
3
    while(1);
4
 }
5

6

7
int main() {
8
  /*
9
   * Thread Crap
10
   */
11
   pthread_t worker;
12
   pthread_attr_t attr;
13

14
   pthread_attr_init (&attr);
15

16
  /* This is how we can join with a thread and reclaim its return value */
17
   pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
18

19
   int ret = pthread_create (&worker, &attr, (void*)muster_thread,
20
                              NULL);
21

22
   if (ret != 0) {
23
     xil_printf ("ERROR (%d) launching worker thread\r\n", ret);
24
     return -1;
25
   }
26

27
   if (ret) {
28
    xil_printf("Master Thread Terminating.\r\n");
29
    return -1;
30
   }
31

32
    xil_printf("soweit sogut");
33
    ret = pthread_join(worker, NULL);
34
   
35
  /*
36
   * END Thread Crap
37
   */
38

39
   while(1){
40
     xil_printf("HIER KOMME ICH NICHT AN");
Gast #2662403
Lesenswert?
• ▲
▼
noch ein (Gedankenanregungs-)Versuch:

"The pthread_join() function suspends execution of the
calling thread until the target thread terminates, unless the
target thread has already terminated."

d.h. eine Task die "while(1);" macht, beendet sich nicht
und auf ihr Ende zu warten kann dauern

LatticeFan schrieb:
> blah = pthread_join(ret, NULL);

von welchen Typ ist nochmal ret?
laut Doku muß es von Typ "pthread_t" sein.
Selbst wenn der eigentlich "int" sein sollte,
dann hat ret den Wert 0 und pthread_join wird mit ESRCH
oder "thread ungültig" zurück kommen.
Löst zwar olpo's Problem, aber bringt ihn nicht weiter!
Gast #2662833
Lesenswert?
• ▲
▼
pthread schrieb:
> "The pthread_join() function suspends execution of the
> calling thread until the target thread terminates, unless the
> target thread has already terminated."
>
> d.h. eine Task die "while(1);" macht, beendet sich nicht
> und auf ihr Ende zu warten kann dauern

Hmm, hier scheint der Hund begraben zu sein.

Aber, so ganz verstehen tu ich das noch nicht.

Wenn ich pthread_join() aufrufe, dann wartet er bis der gestartete 
Thread, hier "worker",  beendet ist???
Das macht doch gar keinen Sinn. Das ist dann ja kein Thread, sondern ein 
einfacher Funktionsaufruf.

Vielleicht ist mein Englisch auch nicht so toll...
Gast #2666640
Lesenswert?
• ▲
▼
hier nochmal der Code wie ich es jetzt probiere.
Ich setze die höchste Priorität.
Aber "PThread-TEST" wird nicht ausgegeben.
1
/**
2
 * Thread
3
 */ 
4
void test_Thread(){
5

6
  xil_printf("PThread-TEST\n\r");
7

8
  while(1);
9

10
}
11

12

13
int main() // CI
14
{
15
   pthread_t worker;
16
   pthread_attr_t attr;
17

18
   pthread_attr_init (&attr);
19

20
   attr.schedparam.sched_priority = 0;
21

22

23
   int ret = pthread_create (&worker, &attr, (void*)getPsiByte, NULL);
24
   
25
   if (ret != 0) {
26
      xil_printf ("Xilkernel Demo: ERROR (%d) launching worker thread\r\n", ret);
27
      return -1;
28
    }

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