FreeRTOS Verhalten von semaphoren

OP (Firma: Raich Gerätebau & Entwicklung) #1458328
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
#1459391
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.