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
Und, wie hast Du FreeRTOS konfiguriert? Präemptiv oder kooperativ? Ist die Funktion UART1_SendBlock reentrant?
Beitrag #5027784 wurde von einem Moderator gelöscht.
Das Urheberrecht ist auch bei Beiträgen für dieses Forum zu beachten, so gut die Absicht auch sein möge.
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
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
Rufus Τ. F. schrieb: > Und, wie hast Du FreeRTOS konfiguriert? Präemptiv oder kooperativ? Das FRTOS ist als präemptiv konfiguriert.
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?
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!
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
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); |
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!!!
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
>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 ?
holger schrieb: > Was steht in FreeRTOSConfig.h unter > > #define configTOTAL_HEAP_SIZE > > ? Hallo, da steht (2048) sollte eigentlich nicht das Problem sein. Oder? VG
Welchen mc benutzt Du bzw. wieviel RAM hat der? Gruß, Stefan
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
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?
Naja, Stack fuer Parameteruebergaben bei Funtionsaufrufen, der Heap ist fuer dynamisches Memory. Da wirst du ja wohl eine Idee haben welches wieviel benoetigt.
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! ;
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 ;)
>> 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.
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?
Nur, wenn sonst kein Heap verwendet wird, wenn also malloc & Co. nicht genutzt werden.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.