FreeRTOS - Heap nach Reset

Gast #5352940
Lesenswert?

Hallo zusammen,

ich habe in meinem STM32F107 FreeRTOS implementiert (Das war ein Kampf 
o.O).
Nun läuft ein Task endlich, jedoch nur zuverlässig nach dem Flashen!
Wenn ich dann den Reset-Taster drücke, lasse ich mir bei Programmstart 
den verfügbaren Heap zurrückgeben. Und nach jedem Reset reduziert sich 
der freie Heap bis keiner mehr verfügbar ist und der Task nicht starten 
kann.

Ich kann mir das gerade nicht erklären. Habt ihr Ideen woran es liegen 
könnte?
#5353456
Lesenswert?

Ich würde tippen, dass die Variablen, die deinen Heap verwalten nach dem 
Reset nicht initialisiert werden. Das würde erklären, warum es nach dem 
Reset nicht klappt, wenn das Teil länger aus ist aber doch.

Möglichkeit 1: In deinem Heapcode fehlt die Initialisierung der 
Variablen oder der Aufruf einer Funktion die das für dich tut.

Möglichkeit 2: Dein Startupcode ruft die Initialisierungroutine des 
Compilers nicht auf in der die Variablen mit ihren Startwerten gefüllt 
werden.

Möglichkeit 3: Der Heapcode verlässt sich auf darauf, dass static 
Variablen mit 0 initialisiert sind (was in C auch richtig ist), aber der 
Startupcode setzt den Datenbereich dafür nicht auf 0.
Gast #5355879
Lesenswert?

hi

ich nutze gerne heap_4

heap 1 gibt den speicher nie wieder frei. damit funktioniert quasi 
vPortFree() nicht



was sagt dein .map file wo  "ucHeap" liegt ?

das ist das array mit dem heap - memory mit der größe 
"configTOTAL_HEAP_SIZE "

1
static uint8_t ucHeap[ configTOTAL_HEAP_SIZE ];
Gast #5355897
Lesenswert?

Es kann doch nicht so schwer sein ein Breakpoint auf den Resethandler zu 
setzen und nach zu sehen was passiert. Es gibt in heap_1.c doch sowieso 
nur die eine Variable (xNextFreeByte) die für den Heap verantwortlich 
ist. Das sollte wesentlich schneller gehen als uns, ohne deine Code zu 
kennen, raten zu lassen.
#5356870
Lesenswert?

FreebeerRTOS schrieb:
> Ich benutze heap_1.c . Oder empfiehlt sich ein anderes Heap-Management?

Solange du in deinem Code keine Betriebssystemobjekte (also Tasks, 
Queues, Semaphoren etc.) dynamisch erzeugst und wieder freigibst, ist 
das kein Problem.

Die anderen Heap-Varianten sind mehr für den eben genannten Fall und die 
damit einhergehende Fragmentierung des Heaps gedacht.
(Firma: SEGGER) #5356898
Lesenswert?

FreebeerRTOS schrieb:
> ich habe in meinem STM32F107 FreeRTOS implementiert (Das war ein Kampf
> o.O).

Gibt es in dem FreeRTOS Paket kein fertiges Projekt, was out of the box 
auf dem STTM32F107 läuft? Alternativ könntest du die Free Variante vom 
embOS benutzen, quasi das FreeEmbOS ;-).
https://www.segger.com/downloads/embos/embOS_CortexM_EmbeddedStudio_Trial
https://www.segger.com/downloads/embedded-studio

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren