Fehler beim Verwenden von vPortFree (ptr) CMSIS-RTOS auf STM32F4


0

Ich werde mit malloc und free mit dynamischem Speicher umgehen müssen. In der FreeRTOS-Dokumentation habe ich festgestellt, dass pvPortMalloc (Größe) und vPortFree (ptr), pvPortMalloc (Größe) einwandfrei funktionieren. Wenn Sie versuchen, Speicher mit vPortFree (ptr) in einem Thread freizugeben, bleibt der Code bei diesem Aufruf hängen.

Ich verwende heap_4 für CMSIS-RTOS in TrueStudio.


Bitte stellen Sie eine bestimmte Frage und geben Sie einen Code ein.
Voltage Spike

Antworten:


0

In FreeRTOS hängt die Art pvPortMalloc()und Weise der vPortFreeImplementierung davon ab, welche der Heap-Optionen Sie für Ihr Projekt ausgewählt haben.

heap_1 - die einfachste
Methode , die die Freigabe von Speicher nicht zulässt heap_2 - die Freigabe von Speicher zulässt, aber benachbarte freie Blöcke nicht verschmelzen lässt.
heap_3 - Umschließt einfach die Standard-malloc () und
-free () für die Threadsicherheit. heap_4 - Fügt benachbarte freie Blöcke zusammen, um eine Fragmentierung zu vermeiden. Beinhaltet die absolute Adressplatzierungsoption
heap_5 - gemäß heap_4, mit der Möglichkeit, den Heap über mehrere nicht benachbarte Speicherbereiche zu verteilen

https://www.freertos.org/a00111.html

Nach dem Verhalten Ihres Projekts zu urteilen, scheint es, dass entweder:

  • Sie haben Heap_1 und nicht Heap_4, wie Sie beabsichtigen
  • Sie beschädigen die Speicherblockinformationen für den Block, den Sie freigeben möchten

Wenn Sie Speicher mallocieren, zeigt der Zeiger, den Sie erhalten, tatsächlich ein wenig in den tatsächlich zugewiesenen Speicherblock.
Der Abstand zwischen dem tatsächlichen Beginn des Blocks und dem Zeiger, den Sie erhalten haben, wird zum Speichern einiger Informationen über den Block und den Heap verwendet, mit denen freedie Zuordnung des Blocks aufgehoben und der Block an den Heap zurückgegeben wird, wenn Sie damit fertig sind.
Wenn Sie diese Informationen verfälschen, wird free verwirrt und zeigt leicht die von Ihnen beschriebenen Symptome.


Danke für die Antwort. Ich habe das Problem gelöst, es passiert, wenn ich den Zeiger inkrementiere und versuche, ihn nach dieser Operation zu lösen.
Marcelo Gadotti
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.