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. -.-