Forum: Mikrocontroller und Digitale Elektronik FreeRTOS Taskaufruf nur, wenn eine Task vorhanden


von Lars B. (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

ich möchte künftig FreeRTOS nutzen. Leider habe ich da nun ein Problem, 
das da wäre:

immer wenn ich nur eine Task definiere funktioniert alles super, sobald
ich aber die zweite Task dazu"definiere", wird keine der Tasks 
aufgerufen.

die beiden Task sowie deren "Registrierung" sind in der angefügten Datei 
zu finden.





Da die Priorität für beide Tasks auf 1 steht, erwartete ich einen 
stetigen Aufrufswechsel zwischen den beiden Tasks, stattdessen geschieht 
nüschts....also es wird keine der bekannten Tasks aufgerufen.

hmmh

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Und, wie hast Du FreeRTOS konfiguriert? Präemptiv oder kooperativ?

Ist die Funktion UART1_SendBlock reentrant?

Beitrag #5027784 wurde von einem Moderator gelöscht.
von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Das Urheberrecht ist auch bei Beiträgen für dieses Forum zu beachten, so 
gut die Absicht auch sein möge.

von useruseruser (Gast)


Lesenswert?

Rufus Τ. F. schrieb:
> Ist die Funktion UART1_SendBlock reentrant?

das wird das problem sein

da sie von beiden tasks aus auf die selben register aufgerufen wird


schau dir "TaskNotify" oder semaphoren an

du musst dann dafür sorgen das diese funktion nur von einem task 
aufgerufen werden kann ... der andere task muss dann solange warten

von Lars B. (Gast)


Lesenswert?

Rufus Τ. F. schrieb:
> Das Urheberrecht ist auch bei Beiträgen für dieses Forum zu beachten, so
> gut die Absicht auch sein möge.

Hallo, ich verstehe diesen Post nicht! An welcher Stelle werden 
unbeabsichtigt Urheberrechte verletzt?

VG

von Lars B. (Gast)


Lesenswert?

Rufus Τ. F. schrieb:
> Und, wie hast Du FreeRTOS konfiguriert? Präemptiv oder kooperativ?

Das FRTOS ist als präemptiv konfiguriert.

von pegel (Gast)


Lesenswert?

Lars B. schrieb:
> Hallo, ich verstehe diesen Post nicht! An welcher Stelle werden
> unbeabsichtigt Urheberrechte verletzt?

Er meinete und löschte meinen link auf 'A Practical Guide ...'.
Allerdings ist die Version für PIC32 und NXP auch offiziell auf
http://www.freertos.org/Documentation zu finden.

Ich fand das sehr schön nachvollziehbar geschrieben und hatte es vor 
Jahren zwei mal durchgearbeitet. Die Cortex-M3 Version allerdings.

Kann es sein das das Dokument teilweise frei gegeben wurde?

von Lars B. (Gast)


Lesenswert?

pegel schrieb:
> Er meinete und löschte meinen link auf 'A Practical Guide ...'.
> Allerdings ist die Version für PIC32 und NXP auch offiziell auf
> http://www.freertos.org/Documentation zu finden.

Vielen Dank für den Link!

von Lars B. (Gast)


Lesenswert?

Hallo,

ich hab jetzt bzgl. meines Problems Fortschritte gemacht und gleich ein 
neues mitgebracht, das ich präsentieren möchte bevor ich auf das 
Problem, das nur eine Task vorhanden sein darf eingehe:

static const char pcTextForTask1[] = " Task 1 is running\n\r";
static const char pcTextForTask2[] = " Task 2 is running\n\r";


char InpData[10];
LDD_TError Error;
LDD_TDeviceData *MySerialPtr;

void UART_Task1(void *pvParameters)
{                                   /* Initialization of AS1 component 
*/
  char *pcTaskName;
  pcTaskName = (char*) pvParameters;
  for(;;)
  {

      Error = UART_SendBlock(MySerialPtr, pcTaskName, 
sizeof(pcTaskName)); /* Send block of characters */

  }
  vTaskDelete(NULL);
}




{

main(){
  MySerialPtr = UTB_Init(NULL);


  FRTOS1_xTaskCreate(UART_Task1,
          (const char* const)"uart0_1",
        configMINIMAL_STACK_SIZE,
        (void*)pcTextForTask1,
        1,
        NULL);
  FRTOS1_xTaskCreate(UART_Task1,
          (const char* const)"uart0_2",
        configMINIMAL_STACK_SIZE,
        (void*)pcTextForTask2,
        1,
        NULL);
...
}

ich erstelle dort 2 Tasks, die dieselbe Implementierung verwenden, dabei 
übergebe ich unterschiedliche "strings" für die Textausgabe. Es ist nun 
aber so, dass mir die sizeof() Funktion nicht 20 zurückgibt, wie ich 
eigentlich erwarte?
Woran mag das liegen?


Zurück zur Problematik, dass ich nur eine Task erstellen konnte:

Es ist so, dass
configMINIMAL_STACK_SIZE bei 200 liegt!
wenn ich nun 2 Tasks haben möchte muss geht dies nur,wenn
der Wert hierfür <= 100 ist,
für 4 Task <= 50, etc.
demnach kann ich also nur max. 200 Tasks haben?
ist das so richtig/normal?

VG

von Johnny B. (johnnyb)


Lesenswert?

Lars B. schrieb:
> configMINIMAL_STACK_SIZE bei 200 liegt!

Wenn Du mehr benötigst als das Minimum, kannts Du das ja z.B. so 
deklarieren für 100 Bytes zusätzlich:
1
FRTOS1_xTaskCreate(UART_Task1,
2
          (const char* const)"uart0_1",
3
        configMINIMAL_STACK_SIZE + 100,
4
        (void*)pcTextForTask1,
5
        1,
6
        NULL);

von Lars B. (Gast)


Lesenswert?

Johnny B. schrieb:
> Wenn Du mehr benötigst als das Minimum, kannts Du das ja z.B. so
> deklarieren für 100 Bytes zusätzlich:FRTOS1_xTaskCreate(UART_Task1,
>           (const char* const)"uart0_1",
>         configMINIMAL_STACK_SIZE + 100,
>         (void*)pcTextForTask1,
>         1,
>         NULL);

klar kann ich das machen, was aber mein Problem ist:

habe ich nur eine Task kann
configMINIMAL_STACK_SIZE ruhig bei 200 liegen
will ich aber, dass zwei Tasks laufen muss ich den Wert auf 100,
will ich aber, dass vier Tasks laufen auf 50 runter setzen!!!

von Eric B. (beric)


Lesenswert?

Lars B. schrieb:
> char *pcTaskName;
>   pcTaskName = (char*) pvParameters;
>   for(;;)
>   {
>
>       Error = UART_SendBlock(MySerialPtr, pcTaskName,
> sizeof(pcTaskName)); /* Send block of characters */

> Es ist nun
> aber so, dass mir die sizeof() Funktion nicht 20 zurückgibt, wie ich
> eigentlich erwarte?
> Woran mag das liegen?

pcTaskName ist definiert als pointer auf char, nicht als char-Array. 
sizeof() liefert dir also die Größe des Pointers, nicht die Große des 
Arrays worauf der Pointer zeigt.
Entweder musst du die Größe irgendwie mitübergeben als Task-Parameter, 
oder im Task den String Byte für Byte rausschieben...

: Bearbeitet durch User
von holger (Gast)


Lesenswert?

>habe ich nur eine Task kann
>configMINIMAL_STACK_SIZE ruhig bei 200 liegen
>will ich aber, dass zwei Tasks laufen muss ich den Wert auf 100,
>will ich aber, dass vier Tasks laufen auf 50 runter setzen!!!#

Was steht in FreeRTOSConfig.h unter

#define configTOTAL_HEAP_SIZE

?

von Lars B. (Gast)


Lesenswert?

holger schrieb:
> Was steht in FreeRTOSConfig.h unter
>
> #define configTOTAL_HEAP_SIZE
>
> ?

Hallo,

da steht (2048)

sollte eigentlich nicht das Problem sein. Oder?

VG

von Stefan K. (stefan64)


Lesenswert?

Welchen mc benutzt Du bzw. wieviel RAM hat der?


Gruß, Stefan

von Lars B. (Gast)


Lesenswert?

Stefan K. schrieb:
> Welchen mc benutzt Du bzw. wieviel RAM hat der?

diesen -->

http://www.nxp.com/docs/pcn_attachments/16530_K64P144M120SF5-rev4-final.pdf

von Lars B. (Gast)


Lesenswert?

OK ich hab, ohne den Zusammenhang genau zu kennen, folgendes 
herausgefunden :

#define configTOTAL_HEAP_SIZE
ist mit
configMINIMAL_STACK_SIZE

verbunden

ich hab jetzt mal

#define configTOTAL_HEAP_SIZE  32768

und dann geht auch
configMINIMAL_STACK_SIZE  1000

ich nutze das für xTaskCreate als "usStackDepth"

wie ist da der Zusammenhang?
das eine ist Stack das andere Heap.... Wa...Was?

von Pandur S. (jetztnicht)


Lesenswert?

Naja, Stack fuer Parameteruebergaben bei Funtionsaufrufen, der Heap ist 
fuer dynamisches Memory. Da wirst du ja wohl eine Idee haben welches 
wieviel benoetigt.

von Lars B. (Gast)


Lesenswert?

Sapperlot W. schrieb:
> Naja, Stack fuer Parameteruebergaben bei Funtionsaufrufen, der Heap ist
> fuer dynamisches Memory. Da wirst du ja wohl eine Idee haben welches
> wieviel benoetigt.

Nö, wenn ich's wüsste hätte ich ja nicht gefragt! ;

von Christopher J. (christopher_j23)


Lesenswert?

Lars B. schrieb:
> wie ist da der Zusammenhang?
> das eine ist Stack das andere Heap.... Wa...Was?

Der Zusammenhang ist der, das die Stacks aller Tasks und der Heap 
zusammen nicht größer als dein RAM sein dürfen.

Lars B. schrieb:
> habe ich nur eine Task kann
> configMINIMAL_STACK_SIZE ruhig bei 200 liegen
> will ich aber, dass zwei Tasks laufen muss ich den Wert auf 100,
> will ich aber, dass vier Tasks laufen auf 50 runter setzen!!!

Wenn du den Stack für einen Task zu klein machst kann es übrigens 
passieren, dass der (im besten Fall) nichts mehr macht oder (im 
schlechteren Fall) der Stack eines anderen Tasks oder auch der Heap mit 
"Müll" beschrieben werden. Das Phänomen nennt sich Stackoverflow und ist 
Namensgeber einer sehr frequentierten Webseite ;)

von holger (Gast)


Lesenswert?

>> wie ist da der Zusammenhang?
>> das eine ist Stack das andere Heap.... Wa...Was?
>
>Der Zusammenhang ist der, das die Stacks aller Tasks und der Heap
>zusammen nicht größer als dein RAM sein dürfen.

Der Zusammenhang ist der, das beim erzeugen des Tasks der Stack
des Tasks im Heap angelegt wird.

von Lars B. (Gast)


Lesenswert?

holger schrieb:
> Der Zusammenhang ist der, das beim erzeugen des Tasks der Stack
> des Tasks im Heap angelegt wird.

ah ok, dementsprechend kann ich bei 200Bytes Stack Größe für die 
einzel-Task
in 32kB Heap ca. 163 Task gespeichert werden.... also
insgesamt 163TASKS der Größe 200 zur selben Zeit existent sein?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Nur, wenn sonst kein Heap verwendet wird, wenn also malloc & Co. nicht 
genutzt werden.

von Lars B. (Gast)


Lesenswert?

Rufus Τ. F. schrieb:
> Nur, wenn sonst kein Heap verwendet wird, wenn also malloc & Co. nicht
> genutzt werden.

Ist das dann so gängig bei Mikrocontrollern dieser Größe?

VG

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.