Forum: Compiler & IDEs FreeRTOS hängt nach vTaskDelete


von Vincent H. (vinci)


Lesenswert?

Grüß euch

Ich betreibe den aktuellen main branch von FreeRTOS (>=V10.4.6) auf 
einem STM32 Cortex-M4. Via USB-CDC kommen verschiedene Arten von Daten 
die von dem Prozessor auf unterschiedliche Art abgearbeitet werden 
sollen. Aus diesem Grund gibt es vorab einen Task der auf das 
"Switch"-Kommando wartet und entsprechend den erhaltenen Daten dann den 
Betriebsmodus wechselt.

Zum Wechsel des Betriebsmodus wird ein Task gelöscht und ein anderer 
gestartet.
1
bool compare_entry_maybe_switch_task(std::string_view entry,
2
                                     std::string_view str,
3
                                     void (*create_task)()) {
4
  auto const equal{entry.compare(0uz, size(str), begin(str)) == 0};
5
  if (!equal || size(entry) > size(str) || !create_task) return equal;
6
  xStreamBufferSend(tx_buffer, begin(ok), size(ok), 0u);
7
  create_task();        // Startet neuen Betriebsmodus
8
  vTaskDelete(nullptr); // Löscht "Switch"-Task
9
  return equal;         // Sollte nie erreicht werden
10
}

Leider funktioniert das nicht so wie ich mir das vorstell. Sobald der 
Idle Task bei der nächsten Gelegenheit versucht den "Switch"-Task zu 
löschen bleibt er in folgendem Assert beim Freigeben des Speichers 
hängen.
1
void vPortFree( void * pv )
2
{
3
     ...
4
        configASSERT( heapBLOCK_IS_ALLOCATED( pxLink ) != 0 ); 
5
     ...
6
}

Ich nutze die "Heap4" Implementierung fürs Memory Management, 
dementsprechend findet sich die gesamte vPortFree Funktion hier:
https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/portable/MemMang/heap_4.c

Ich mach mich mal ran ein MRE zu schreiben, aber vielleicht kann mir ja 
bereits jemand einen Tip geben.


/edit
Ja... ma sollt halt ned so deppat sein und vergessen dass die eigenen 
Debug-Ausgabe vsnprintf nutzen. -.-

: Bearbeitet durch User
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.