www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik FreeRTOS Verhalten von semaphoren


Autor: Gebhard Raich (geb)
Datum:

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

Autor: Gebhard Raich (geb)
Datum:

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

Autor: A. K. (prx)
Datum:

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

Autor: Gebhard Raich (geb)
Datum:

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

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Siehe Doku zu configKERNEL_INTERRUPT_PRIORITY

Autor: Gebhard Raich (geb)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Welche Doku meinst du?

Grüße

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

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.