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!!
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.
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 :-)
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?
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.
> 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.