Tasks stm32f103vct

OP #2424618
Lesenswert?

Morgen!

Ich möchte mit Tasks arbeiten. Ich habe ein funktionierendes Beispiel, 
dass eine LED blinken lässt. Jetzt möchte ich einen zweiten Task 
ausführen, der einen Port abfragt. In der Beschreibung steht, im ersten 
Task soll der zweite Task kreiert werden. Nun habe ich eine 
Fehlermeldung!
1
__task void init (void) // Task1
2
{
3

4
  BOOL LEDrun;
5

6
  os_tsk_creat (t_IO, 0); // Task 2
7
  
8
  LED_Off(LED_RUN);
9
  while(true)
10
  {
11
      os_dly_wait (500);   // LED run 500 ms  
12
      if(LEDrun)
13
      {
14
        LED_On (LED_RUN);
15
      }
16
      else
17
      {
18
      LED_Off(LED_RUN);
19
      }
20
      LEDrun = !LEDrun;
21
  }
22

23
}

.\Obj\Frontego_OS.axf: Error: L6218E: Undefined symbol os_tsk_creat 
(referred from frontego_os_main.o).


Ist die Beschreibung nur Theorie oder ist der zweite Task immer im 
ersten zu kreieren? Dies würde bedeuten, im zweiten Task kreiere ich den 
dritten Task??

Meiner Meinung nach, muss die anderst gehen. Mit einem Taskmanager oder 
so ähnlich!???

Danke und Gruss!

M.B.
Persönliche Seite #2424634
Lesenswert?

Hi,

du solltest dein Projekt etwas genauer beschreiben.

Dem Code nach sieht es nach Keil RTX aus. Schau dir dazu bitte einmal 
die Beispiele im \RL examples Folder deines Boards / deiner MCU an.

Wichtig:
#include <RTL.h>

Options for Target -> Target -> Operating System -> RTX Kernel


Btw...
> Undefined symbol os_tsk_creat
heisst das Dingen nicht os_tsk_create ?


VG,
/th.
OP #2424773
Lesenswert?

1
/* Include type and function declarations for RTX */
2
#include "RTL.h"
3

4
/* id1, id2 will contain task identifications at run-time */
5
OS_TID id1, id2;
6

7
/* Forward reference. */
8
__task void task1 (void);
9
__task void task2 (void);
10

11
__task void task1 (void) {
12
  /* Obtain own system task identification number */
13
  id1 = os_tsk_self ();
14
  /* Assign system identification number of task2 to id2 */
15
  id2 = os_tsk_create (task2, 0);
16
  for (;;) {    /* do-this */
17
    /* Indicate to task2 completion of do-this */
18
    os_evt_set (0x0004, id2);
19
    /* Wait for completion of do-that (0xffff means no time-out)*/
20
    os_evt_wait_or (0x0004, 0xffff);
21
    /* Wait now for 50 ms */
22
    os_dly_wait (5);
23
  }
24
}
25

26
__task void task2 (void) {
27
  for (;;) {
28
    /* Wait for completion of do-this (0xffff means no time-out) */
29
    os_evt_wait_or (0x0004, 0xffff); /* do-that */
30
    /* Pause for 20 ms until signaling event to task1 */
31
    os_dly_wait (2);
32
    /* Indicate to task1 completion of do-that */
33
    os_evt_set (0x0004, id1);
34
  }
35
}

Habe ich das richtig verstanden?
1
id1 = os_tsk_self ();
speichert die ID des laufenden Tasks!?
1
id2 = os_tsk_create (task2, 0);
startet den Task2 und speichert seine ID? Was bedeutet genau der Wert in 
der Klammer (task2, 0);
1
os_evt_set (0x0004, id2);
Setzt das Event-Flag Bit 4 des Tasks mit der id2??

Was nützt mir dieses Event-Flag Bit? Task2 ist der Event 4??
1
os_evt_wait_or (0x0004, 0xffff);

Es wird mit der Ausführung des Events 4 gewartet, bis das Wait-Flag 4 
gesetzt wurde oder 0xffff systemticks abgelaufen sind ??

kann ich das Wait und event Flagbit auch abfragen?

danke und gruss!

M.B.
Persönliche Seite #2424985
Lesenswert?

>Habe ich das richtig verstanden?
>
>id1 = os_tsk_self ();
>
>speichert die ID des laufenden Tasks!?
richtig!

>id2 = os_tsk_create (task2, 0);
>
>startet den Task2 und speichert seine ID? Was bedeutet genau der Wert in
>der Klammer (task2, 0);
task2 ist die Funktion in der der Code von Task2 steht, und 0 die 
Priorität der Task, steht aber alles in dem Getting Startet zu den RL 
Bibs von Keil auf der Seite von dehnen zu finden.

BTW: Priorität 0 darf nur die idle Task haben also nicht deine Eigene 
Task da sollte Keil meckern.

>
>os_evt_set (0x0004, id2);
>
>Setzt das Event-Flag Bit 4 des Tasks mit der id2??
Jein Das EventFlag Bit2 wird gesetz (2^2 = 4) und id2 bedeutet das diese 
Signal an die Task mit der ID2 geht.

>Was nützt mir dieses Event-Flag Bit? Task2 ist der Event 4??
>
>os_evt_wait_or (0x0004, 0xffff);
Hier wartet die Task 2 auf das Event aus Task1 0xffff ist ein Timeout in 
dem Fall unendlich. Sonst eine Zeit in RTX Zyklen (meist 10ms)

>kann ich das Wait und event Flagbit auch abfragen?
Ja mit os_evt_get(id2) meine ich aber guck im Getting Startet zu RL

http://www.keil.com/product/brochures/rl-arm_gs.pdf

MfG

Tec

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