Forum: Compiler & IDEs dynamischer Speicher oder nicht


von Matthias K. (gidarrnmatze)


Lesenswert?

hallo zusammen,

mich beschäftigt gerade folgende Frage:
Ich möchte auf meinem Mikrocontroller Messwerte einlesen.

Dazu möchte ich mir ein "struct" erstellen.
z.b.
1
struct umweltdaten{         /* deklariert den Strukturtyp */
2
    int   Temp1;
3
    int   Temp2;
4
    int   Temp3;
5
    .... usw.
6
7
  };
Da die messung nur jede Std erfolgen soll, war meine Überlegung diesen 
benötigten Speicher für diesen Struct dynamisch mit malloc anzufordern 
und nach der Messung wieder freizugeben. Somit beanspruche ich nicht 
ständig den Speicherbedarf der Variablen

Ist dies sinnvoll und gibt es hierzu Erfahrungen?

Danke Euch
Matthias

von Peter II (Gast)


Lesenswert?

Matthias Kugler schrieb:
> Somit beanspruche ich nicht
> ständig den Speicherbedarf der Variablen

und was bringt es dir? Nur weil du den speicher nicht nutzt muss er 
drozdem mit strom versorgt werden. Welche vorteile erhoffst du dir? Oder 
Bezahlst du den speicher nach dauer der aktiven Nutzung?

von Oliver (Gast)


Lesenswert?

Kommt darauf an, was du in der Zwischezeit mit dem Speicher machst, was 
mit den Messdaten überhaupt passiert, usw.

Wenn der Speicher ansonsten nur leer rumsteht, brauchst du keine 
dynamische Speicherverwaltung, wenn er allerdings zwingend benötigt 
wird, weil ansonsten dein Programm nicht läuft, hast du eh ein 
generelles Problem, und dein malloc wird häufiger mal keinen freien 
Speicher finden.

Eine andere Lösung wäre, die Struct-Variable local in einer Funktion 
anzulegen, die dann jede Stunde aufgerufen wird.

Oliver

von Karlo (Gast)


Lesenswert?

Nicht nur, dass dir die malloc() Lösung keinen Vorteil bringt, sie 
bringt sogar noch Nachteile.
1) der malloc() - Code muss dazugelinkt werden => mehr Flashverbrauch
2) Du siehst im Mapfile nicht mehr genau, wieviel RAM denn nun 
verbraucht wird

von Matthias K. (gidarrnmatze)


Lesenswert?

hallo zusammen,
danke für Eure Anmerkungen, ich habe noch nichts mit der 
Speicherverwaltung gemacht und versuche, das alles zu begreifen.

wie sieht arbeitet das system dann, wenn ich eine struktur variable in 
einer Funktion angelege??
ist dieser Speicher dann ständig reserviert für den Aufruf?

von Falk B. (falk)


Lesenswert?

@ Matthias Kugler (gidarrnmatze)

>wie sieht arbeitet das system dann, wenn ich eine struktur variable in
>einer Funktion angelege??

Grammatik?

>ist dieser Speicher dann ständig reserviert für den Aufruf?

Siehe Grundlagen von C, in jedem Lehrbuch nachlesbar. Lokale Variablen, 
welche nicht als static deklariert werden, werden beim Aufruf der 
Funktion auf dem Stack angelegt und am Ende der Funktion "gelöscht", 
weil der Stack einfach freigegeben wird.

von Matthias K. (gidarrnmatze)


Lesenswert?

@falk : Korrekt, nicht nur Grammatik, auch Wortwahl ist schlecht. ich 
hab sehr schlampig geschrieben. Sorry.

Das  lokale Variablen nur innerhalb der Funktion leben weiß ich, ich 
versuche nur den Unterschied zwischen dem malloc zu verstehen.

Wenn ich doch eine Funktion Aufrufe, muss ich mir doch auch Speicher 
zuweisen lassen oder? Habe ich dann nicht die selben Probleme bzw. 
Gefahren wie bei malloc?

von Falk B. (falk)


Lesenswert?

@ Matthias Kugler (gidarrnmatze)

>Wenn ich doch eine Funktion Aufrufe, muss ich mir doch auch Speicher
>zuweisen lassen oder?

Kommt drauf an. Wenn deine lokalen und globalen Variablen nicht 
ausreichend sind, dann schon.

>Habe ich dann nicht die selben Probleme bzw.
>Gefahren wie bei malloc?

Nö. Denn globale Variablen werden direkt beim Programmstart angelegt und 
bleiben so. Ausserdem giubt dir der Compiler an, wieviel RAM dafür 
grbaucht wird. Bei dynamischen Variablen in Funktion und Speicher über 
malloc sieht das der Compiler nicht.

von DirkB (Gast)


Lesenswert?

Matthias Kugler schrieb:
> struct umweltdaten{         /* deklariert den Strukturtyp */
>     int   Temp1;
>     int   Temp2;
>     int   Temp3;
>     .... usw.
>
>   };

Bei solchen Variablennamen ist ein Array sinnvoller.
Eine struct nimmt man, wenn man Variablen verschiedener Typen zusammen 
fassen will.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

DirkB schrieb:
> Eine struct nimmt man, wenn man Variablen verschiedener Typen zusammen
> fassen will.

Das tut man auch, wenn die Variablen ein unterschiedliche Bedeutung 
haben - einfaches Beispiel ist ein RGB-Wert, den legt man in einer 
Struktur ab, und nicht in einem Array.

Bei einem Array ist die Information, welche Bedeutung ein Element hat, 
nicht explizit durch den Namen gegeben, sondern müsste an anderer Stelle 
dokumentiert werden -- was war noch mal Grün? Farbe[0]? Oder doch besser 
Farbe.Gruen?

von Rosa-Kleidchen (Gast)


Lesenswert?

Nun, ich habe bei speicherarmen Plattformen vermieden, dynamischen 
Speicher zu verwenden. Ich habe durch sinnvolle Aufteilung von globalen 
(Heap) und lokalen (Stack) Variablen mein Speichermanagement selbst 
gebaut. Das gibt eine hohe Laufzeitsicherheit.
Rosa

von Dr. Sommer (Gast)


Lesenswert?

Rosa-Kleidchen schrieb:
> Nun, ich habe bei speicherarmen Plattformen vermieden, dynamischen
> Speicher zu verwenden. Ich habe durch sinnvolle Aufteilung von globalen
> (Heap)
Das macht keinen Sinn. Wenn du keinen dynamischen Speicher hast, hast du 
keinen Free Store, d.h. keinen Heap. Globale Variablen landen im 
Automatic Storage, d.h. in .bss (0-initialisierte) oder .data 
(nicht-null-initialisierte).

Rosa-Kleidchen schrieb:
> mein Speichermanagement selbst
> gebaut.
Eher das ganz normale "statisch" vom Compiler&Linker verwendet.

Rosa-Kleidchen schrieb:
> Das gibt eine hohe Laufzeitsicherheit.
ja.

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.