Forum: FPGA, VHDL & Co. xilkernel Thread


von olpo (Gast)


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");

von pthread (Gast)


Lesenswert?

was bedeutet noch mal "pthread_join" und was "while(1)"?

warten auf etwas was nie passiert und siehe da es passiert nix :-)

von LatticeFan (Gast)


Lesenswert?

versuchs mal mit:

blah = pthread_join(ret, NULL);

von pthread (Gast)


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!

von olpo (Gast)


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

von D. I. (Gast)


Lesenswert?

Das ist auch der Sinn von join() :

Haupt-Thread startet mehrere Arbeiter und möchte erst weiterarbeiten 
wenn alle Arbeiter ihre Arbeit erledigt haben ->

Also joint man auf diese Threads

von olpo (Gast)


Lesenswert?

wenn ich pthread_join() rausnehme, startet leider der muster_thread() 
nicht. Warum das?

von olpo (Gast)


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
    }

von PittyJ (Gast)


Lesenswert?

Geht ja auch nicht. Es wird getPsiByte gestartet und nicht test_Thread.

Oder sehe ich das falsch?

von olpo (Gast)


Lesenswert?

hmm ja, das ist für's Forum übersichtlicher gemacht und in test_Thread 
umbenannt. Im eigentlichen C-Code stimmt beides überein.

von pthread (Gast)


Lesenswert?

probier mal:
1
yield();
damit sollte der ThreadScheduler aktiv werden.
Kann sein, daß der "High Prio" Thread zwar existiert,
aber eben (noch) nicht läuft.

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.