Forum: Mikrocontroller und Digitale Elektronik FreeRTOS - Heap nach Reset


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von FreebeerRTOS (Gast)


Bewertung
0 lesenswert
nicht 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 Arduino Fanboy D. (ufuf)


Bewertung
0 lesenswert
nicht lesenswert
Ich kann nur raten!
Der Statup Code, bzw. Init Code, ist kaputt.

von Mike R. (thesealion)


Bewertung
1 lesenswert
nicht lesenswert
Ganz klar, an deinem Programm.

von M.K. B. (mkbit)


Bewertung
0 lesenswert
nicht 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)


Bewertung
1 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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:

Bewertung
0 lesenswert
nicht 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:

Bewertung
0 lesenswert
nicht lesenswert
Hier das Startup-File.

von 312313132131 (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
ich habe in der

FreeRTOSConfig.h dazu 2 defines:

#define vPortSVCHandler        SVC_Handler
#define xPortPendSVHandler     PendSV_Handler

von temp (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.