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