Ich experimentiere mit einem STM32 und möchte das Schreiben auf SD Karte als Task laufen lassen. Dieser wird immer wieder unterbrochen(suspended) wenn eine SPI Interruptroutine selbständig Aufgaben (wie z.B warten auf ende des SD-Karten "busy-Signals") durchführt, damit andere Tasks weiterarbeiten können. Ich hab dafür das FreeRTOS 4.8.0 auf dem Kontroller laufen. Das (die) Probleme: wenn ich in z.B der Warteroutine den SPI interrupt aktiviere und dann vTaskSuspend() ausführe, funktioniert das bei sehr kurzer Interrupt-Latenz nicht, weil vTaskSuspend() noch gar nicht vollständig ausgeführt wurde, aber bereits vom Interrupt xTaskResumeFromISR() ausgeführt wird, das ergebnislos bleibt, weil ja der Task noch nicht suspended ist.Folge: Task bleibt suspended. Gut, das ist einsehbar, Abhilfe würde nur die Freigabe des Interrups am Ende der vTaskSuspend() Routine schaffen. Wär zwar ziemlich einfach, möchte aber den originalen RTOS code nicht verpfuschen. Weiters hab ich probiert, das Problem mit xSemaphoreTake( xSemaphore, 0xFFF0 ) zu lösen. Im Interrupt steht dann: xHigherPriorityTaskWoken = pdFALSE; xHigherPriorityTaskWoken=xSemaphoreGiveFromISR(xSemaphore, xHigherPriorityTaskWoken ); if(xHigherPriorityTaskWoken)vPortYieldFromISR(); Das Verhalten scheint genau umgekehrt wie beim ersten Versuch zu sein: Wenn die Semaphore nicht sofort da ist, blockiert xSemaphoreTake() 0xFFF0 ms. Ich würde mir erwarten (und wünschen), daß sobald die Semaphore gegeben wird, der blockierte Task sofort weiterläuft. Tut's aber nicht. Hab ich da was falsch gemacht, oder ist das Verhalten von xSemaphoreTake( ) einfach so??????? Danke für brauchbare Antworten
Hmm... scheint daß es nicht gerade Heerscharen von FreeRTOS usern gibt.Hat das einen Grund ??
Ich stecke im FreeRTOS nicht so tief drin, aber es sollte nicht relevant sein, zu welchem Zeitpunkt sie Sema freigegeben wird. Eine Sema wird in der Doku als Queue Länge 1 beschrieben, d.h. sie hat eine Zustand, der mit gesperrt/freigegeben beschrieben werden kann. Ob das vorher oder nachher wechselt sollte egal sein. Zu beachten wäre aber, dass es in FreeRTOS auf STM32 meiner Erinnerrung nach eine Interrupt-Priorität gibt, oberhalb (numerisch unterhalb) der eine ISR keinen FreeRTOS API aufrufen darf, weil der dann die kritischen Funktionen von FreeRTOS unterbrechen kann.
Hallo A.K. In der "äusserst umfangreichen Beschreibung" von FreeRTOS hab ich davon nix gelesen, was aber womöglich gar nichts heißt. Danke mal für die Antwort Grüße
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.