Forum: Mikrocontroller und Digitale Elektronik STM32F4xx malloc & free


von Günther (Gast)


Lesenswert?

Hallo!

Kann ich bei meinem Cortex M4 (STM32F4xx) dynamisch Speicher allokieren?
Was muss ich in der IAR Workbench einstellen, um Heap anzulegen und die 
Funktionen "malloc" und "free" nutzen zu können?!?

Vielen Dank für die Hilfe!

Viele Grüße
Günther

von Random .. (thorstendb) Benutzerseite


Lesenswert?

Für gewöhnlich legt man das im startup fest. Malloc/free sind allerdings 
recht "teuer", eine eigene Speicherverwaltung ggf. aus fixen 
Blockgrössen (n x blocksize) macht da mehr Sinn.

In meinem Projekt, wo ständig irgendwelche sende- und empfangsbuffer 
benötigt werden, nutze ich das. Wobei es zwei Sendebuffer mit fester 
Grösse gibt, einen für die kurzen Antworten (den muss ich mir für nen 
re-request merken) und einen für die langen.

von Günther (Gast)


Lesenswert?

Random .. schrieb:
> Für gewöhnlich legt man das im startup fest.

Wo/wann/wie beim Startup? Mit welchen Befehlen?

Random .. schrieb:
> Malloc/free sind allerdings recht "teuer"

Teuer im Bezug auf Flash/RAM Ressourcen, oder Rechenzeit?

Den Overhead finde ich nicht so schlimm:
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0067d/Cihfiabf.html

von Walter T. (nicolas)


Lesenswert?

Günther schrieb:
> Kann ich bei meinem Cortex M4 (STM32F4xx) dynamisch Speicher allokieren?

Generell erst einmal: Ja.

Günther schrieb:
> Was muss ich in der IAR Workbench einstellen, um Heap anzulegen und die
> Funktionen "malloc" und "free" nutzen zu können?!?

Da kann ich nicht weiterhelfen. Beim GCC schreibe ich einfach 
malloc/free in den Quelltext, binde stdlib.h ein und schon geht alles.

Natürlich nicht bei zeitkritischen Funktionen - ich nutze die nur in 
Funktionen, die nicht-zyklisch aufgerufen werden.

von Random .. (thorstendb) Benutzerseite


Lesenswert?

Walter T. schrieb:
> Da kann ich nicht weiterhelfen. Beim GCC schreibe ich einfach
> malloc/free in den Quelltext, binde stdlib.h ein und schon geht alles.

*rofl+ MAGIC :-)

Da ich mit MDK-ARM unterwegs bin, kenne ich mich mit IAR weniger aus. 
Aber ich habe mal in das Pack geschaut:
STM32F4xx_DFP\2.6.0\Drivers\CMSIS\Device\ST\STM32F4xx\Source\Templates\i 
ar\linker\stm32f401xc_flash.icf

In den .icf files steht was von stack / heap. Ob man das da von hand 
ändern muss oder es einen GUI Dialog gibt, musst nun anders rausfinden 
:-)

> Teuer im Bezug auf Flash/RAM Ressourcen, oder Rechenzeit?
Rechenzeit. Erstmal muss der den Speicher verwalten, und nen passenden 
Block "finden". Je nach Grösse der allocierten Blöcke fragmentiert sich 
der Speicher, was die lib durch Aufräumen in den Griff bekommen kann. 
Trotzdem dauert das "eher länger".

Besser man macht sich über das eigene Speichermanagement einmal sauber 
Gedanken, und implementiert das ohne malloc/free.

Für ein anderes Projekt unter Windows, wo sau viele strings gelesen und 
verarbeitet werden (~40MB XML) hat mir ein eigenes Speichersystem den 
Geschwindigkeitsfaktor >1000 gebracht.

von Walter T. (nicolas)


Lesenswert?

Random .. schrieb:
> Walter T. schrieb:
>> Da kann ich nicht weiterhelfen. Beim GCC schreibe ich einfach
>> malloc/free in den Quelltext, binde stdlib.h ein und schon geht alles.
>
> *rofl+ MAGIC :-)

Beim AVR-GCC übrigens auch.

von Günther (Gast)


Lesenswert?

Random .. schrieb:
> stm32f401xc_flash.icf

Die Datei habe ich auch. Ebenso *_ram.icf und *_sram.icf, in denen mehr 
oder weniger das Gleiche steht.
Heap ist mit 0x200 definiert, also 512 Byte...
Muss mal die malloc/free-Funktionen testen...

von Stephan (Gast)


Lesenswert?


von Stephan (Gast)


Lesenswert?

Ahhh Sorry
das war falsche MC, aber das setting könnte doch gleich sein.

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.