Forum: Mikrocontroller und Digitale Elektronik FreeRTOS - Heap nach Reset


von FreebeerRTOS (Gast)


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?

von Einer K. (Gast)


Lesenswert?

Ich kann nur raten!
Der Statup Code, bzw. Init Code, ist kaputt.

von Mike R. (thesealion)


Lesenswert?

Ganz klar, an deinem Programm.

von M.K. B. (mkbit)


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.

von Johnny B. (johnnyb)


Lesenswert?

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

Generiere doch mal den Code samt FreeRTOS mit CubeMX und vergleiche mit 
Deinem Code.
Bei mir funktioniert der generierte Code mit CubeMX einwandfrei.

von FreebeerRTOS (Gast)


Lesenswert?

Danke für die Tipps.
CubeMX probier ich gerade aus. Ich wusste gar nicht dass es das auch für 
Linux gibt ;-) .

von FreebeerRTOS (Gast)


Angehängte Dateien:

Lesenswert?

Jetzt habe ich das Startup-File und das Linkerskript von CubeMX genommen 
aber das Problem bleibt (Dateien angehängt).

Ich benutze heap_1.c . Oder empfiehlt sich ein anderes Heap-Management?

von FreebeerRTOS (Gast)


Angehängte Dateien:

Lesenswert?

Hier das Startup-File.

von 312313132131 (Gast)


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 ];

von 312313132131 (Gast)


Lesenswert?

was hast du mit den ISR :

SVC_Handler
PendSV_Handler

gemacht?

schau mal bitte nach

ggf poste ein archiv mit deinem code

von 312313132131 (Gast)


Lesenswert?

ich habe in der

FreeRTOSConfig.h dazu 2 defines:

#define vPortSVCHandler        SVC_Handler
#define xPortPendSVHandler     PendSV_Handler

von temp (Gast)


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.

von A.. P. (arnonym)


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.

von Til S. (Firma: SEGGER) (til_s)


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

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.