Forum: Mikrocontroller und Digitale Elektronik Ablauf der dynamischen Speicherreservierung


von Pl L. (atmega169)


Lesenswert?

Moin!

Ich hab mal eine Frage bzgl. Mikrocontrollern, die es erlauben, Speicher 
per malloc anzufordern bzw. diesen auch wieder freizugeben.

1.)
Sehe ich das richtig, dass dynamische Speicheranforderungen immer im 
SRAM (z.B. bei den Atmegas) ausgeführt werden?

2.)
Was ist, wenn wie in folgendem Bildchen der Heap mittlerweile so groß 
geworden ist, dass er an den Stack heranreicht und eine neue 
Speicheranforderung nicht bedient werden kann:

http://www.abload.de/img/unbenanntyipv.png

Erhält man in diesem Fall einen Nullzeiger, wenn man mit malloc Speicher 
reservieren will?

3.)
Wie sieht das mit der Fragmentierung aus (Siehe 
http://www.mikrocontroller.net/articles/Heap-Fragmentierung)

Werden wieder freigegebene Bereiche auch wieder genutzt? Also wenn ich 
mit malloc 5 Einheiten Speicher anfordere und vorne im Heap ein freies 
Loch ist, wird das dann verwendet?
Oder ist irgendwann einfach Schicht im Schacht, weil man beim Stack 
ankommt und freigegebener SPeicher nicht wieder vergeben wird?


Danke für eure Hilfe!!

von Frank B. (foobar)


Lesenswert?

Pl Lp schrieb:
> 1.)
> Sehe ich das richtig, dass dynamische Speicheranforderungen immer im
> SRAM (z.B. bei den Atmegas) ausgeführt werden?

Wo denn sonst? EEPROM käme noch in Frage, ist aber meist relativ klein, 
sodaß das keinen Sinn macht.

> 2.)
> Was ist, wenn wie in folgendem Bildchen der Heap mittlerweile so groß
> geworden ist, dass er an den Stack heranreicht und eine neue
> Speicheranforderung nicht bedient werden kann:
>
> http://www.abload.de/img/unbenanntyipv.png
>
> Erhält man in diesem Fall einen Nullzeiger, wenn man mit malloc Speicher
> reservieren will?

Im Idealfall ja. Kann aber auch passieren, daß das Programm einfach 
abstürzt, weil du in den Stack schreibst, oder der Stack später größer 
wird und in den reservierten Speicher schreibt. Hängt vom Compiler ab.

> 3.)
> Wie sieht das mit der Fragmentierung aus (Siehe
> http://www.mikrocontroller.net/articles/Heap-Fragmentierung)
>
> Werden wieder freigegebene Bereiche auch wieder genutzt? Also wenn ich
> mit malloc 5 Einheiten Speicher anfordere und vorne im Heap ein freies
> Loch ist, wird das dann verwendet?
> Oder ist irgendwann einfach Schicht im Schacht, weil man beim Stack
> ankommt und freigegebener SPeicher nicht wieder vergeben wird?

Ja, freigegebener Speicher wird wieder genutzt. Die Fragmentierung 
bezieht sich darauf, wenn du z.B. 10 mal eine Einheit Löcher hast und 
sonst keinen freien Speicher mehr, und dann 5 Einheiten am Stück 
reservieren willst, daß das dann nicht geht. Wie in dem Artikel 
beschrieben können Handles ein Ausweg sein, oder bei größeren CPUs eine 
MMU.

von Pl L. (atmega169)


Lesenswert?

danke für deine Hilfe, hat mir gut weitergeholfen!

von klaus (Gast)


Lesenswert?

Pl Lp schrieb:
> Ich hab mal eine Frage bzgl. Mikrocontrollern, die es erlauben, Speicher
> per malloc anzufordern bzw. diesen auch wieder freizugeben.
>

Hängt davon ab wieviel dein C Runtime bereits implementiert. Ggf. muss 
man hier selbst Hand anlegen: Heap im Linker-Script reservieren, sbrk() 
implementieren ggf. mit Überlaufprüfung...

Grundsätzlich empfehlenswert ist malloc() auf Mikrocontrollern 
allerdings nicht. Bei sicherheitskritischer SW ist es verboten.

> 1.)
> Sehe ich das richtig, dass dynamische Speicheranforderungen immer im
> SRAM (z.B. bei den Atmegas) ausgeführt werden?

Alles eine Frage der Konfiguration im Linker-Script. RAM macht aber 
schonmal Sinn :-)

von Frank B. (foobar)


Lesenswert?

klaus schrieb:
> Grundsätzlich empfehlenswert ist malloc() auf Mikrocontrollern
> allerdings nicht. Bei sicherheitskritischer SW ist es verboten.

Verboten wäre zuviel gesagt. Es gibt z.B. die MISRA-Regeln, für Software 
in Autos:

http://computing.unn.ac.uk/staff/cgam1/teaching/0703/misra%20rules.pdf

Regel 118 sagt, man solle keine dynamische Speicherreservierung auf dem 
Heap verwenden. Allerdings sagt MISRA glaube ich auch, daß man in 
begründeten Ausnahmen von den Regeln abweichen darf. Die Regel mit der 
dynamischen Speicherreservierung sollte man aber eher nicht missachten, 
denn in reinem C kann man schnell man Speicher vergessen freizugeben, 
und es wird schnell nicht-deterministisch wenn Fragmentation hinzukommt. 
Als Ausnahme würde ich aber gelten lassen, beim Programmstart ein paar 
Bereiche für den Rest des Programmablaufs dynamisch zu reservieren.

BTW: Einige Regeln vom MISRA-Standard vestehe ich nicht. Wieso soll man 
kein atoi verwenden, oder keine Funktion aus time.h?

von U.R. Schmitt (Gast)


Lesenswert?

Pl Lp schrieb:
> Ich hab mal eine Frage bzgl. Mikrocontrollern, die es erlauben, Speicher
> per malloc anzufordern bzw. diesen auch wieder freizugeben.

ich würde mal behaupten, daß das nicht der Controller, sondern die 
C-Runtime ist.

Frank Buss schrieb:
> Wieso soll man
> kein atoi verwenden

Ich vermute mal weil du bei atoi keinerlei Anhaltspunkt hast ob es ein 
Parse Fehler oder Überlauf war oder ob halt 0 bzw. MIN oder MAX der Wert 
war.

Frank Buss schrieb:
> oder keine Funktion aus time.h
Hmm, Autos leben zum Teil ziemlich lange. und der Long Wert läuft 
irgendwann über. Siehe den BMW M1, da hat BMW die analogen 
Motorsteuergeräte Steuergeräte zugekauft, jetzt gibt es meines Wissens 
keine Pläne mehr, die Bauteile werden nicht mehr produziert und du hast 
einen tollen Youngtimer, der nicht mehr geht weil man praktisch keine 
Elektronik mehr kriegt.

von Olaf (Gast)


Lesenswert?

> Die Regel mit der dynamischen Speicherreservierung sollte man
> aber eher nicht missachten, denn in reinem C kann man schnell
> man Speicher vergessen freizugeben, und es wird schnell
> nicht-deterministisch wenn Fragmentation hinzukommt.

Das sind ja alles Probleme die sich vielleicht noch irgendwie loesen 
lassen, aber in einem Microcontroller habe ich doch immer genug 
Speicher, also kann ich ihn fest vergeben.
Und wenn ich nun aber doch nicht genug Speicher habe, was soll das 
Programm  machen wenn keiner mehr da ist? Soll dann das 
Zuendsteuergeraet im Auto solange warten bis wieder Speicher verfuegbar 
ist? :-)

Olaf

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.