FreeRTOS hängt nach vTaskDelete

OP #7091125
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. -.-

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 4 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.