Forum: Mikrocontroller und Digitale Elektronik FreeRTOS Verhalten von semaphoren


von Gebhard R. (Firma: Raich Gerätebau & Entwicklung) (geb)


Lesenswert?

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

von Gebhard R. (Firma: Raich Gerätebau & Entwicklung) (geb)


Lesenswert?

Hmm... scheint daß es nicht gerade Heerscharen von FreeRTOS usern 
gibt.Hat das einen Grund ??

von (prx) A. K. (prx)


Lesenswert?

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.

von Gebhard R. (Firma: Raich Gerätebau & Entwicklung) (geb)


Lesenswert?

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

von (prx) A. K. (prx)


Lesenswert?

Siehe Doku zu configKERNEL_INTERRUPT_PRIORITY

von Gebhard R. (Firma: Raich Gerätebau & Entwicklung) (geb)


Lesenswert?

Welche Doku meinst du?

Grüße

von (prx) A. K. (prx)


Lesenswert?


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.