mikrocontroller.net

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


Autor: Lars B. (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Rufus Τ. F. (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
1 lesenswert
nicht 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.
Autor: Rufus Τ. F. (rufus) (Moderator) Benutzerseite
Datum:

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

Autor: useruseruser (Gast)
Datum:

Bewertung
1 lesenswert
nicht 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

Autor: Lars B. (Gast)
Datum:

Bewertung
1 lesenswert
nicht 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

Autor: Lars B. (Gast)
Datum:

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

Das FRTOS ist als präemptiv konfiguriert.

Autor: pegel (Gast)
Datum:

Bewertung
2 lesenswert
nicht 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?

Autor: Lars B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Lars B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Johnny B. (johnnyb)
Datum:

Bewertung
-1 lesenswert
nicht 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:
FRTOS1_xTaskCreate(UART_Task1,
          (const char* const)"uart0_1",
        configMINIMAL_STACK_SIZE + 100,
        (void*)pcTextForTask1,
        1,
        NULL);

Autor: Lars B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!!!

Autor: Eric B. (beric)
Datum:

Bewertung
0 lesenswert
nicht 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
Autor: holger (Gast)
Datum:

Bewertung
1 lesenswert
nicht 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

?

Autor: Lars B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan K. (stefan64)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Welchen mc benutzt Du bzw. wieviel RAM hat der?


Gruß, Stefan

Autor: Lars B. (Gast)
Datum:

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

diesen -->

http://www.nxp.com/docs/pcn_attachments/16530_K64P...

Autor: Lars B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Zitronen F. (jetztnicht)
Datum:

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

Autor: Lars B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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! ;

Autor: Christopher J. (christopher_j23)
Datum:

Bewertung
0 lesenswert
nicht 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 ;)

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Lars B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Rufus Τ. F. (rufus) (Moderator) Benutzerseite
Datum:

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

Autor: Lars B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.