dynamischer Speicher oder nicht

#3254299
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
Gast #3254312
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
Gast #3254326
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
#3254586
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.
#3254989
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?
#3255031
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.
Persönliche Seite #3255500
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?
Gast #3258889
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
Gast #3259841
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren