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
structumweltdaten{/* deklariert den Strukturtyp */
2
intTemp1;
3
intTemp2;
4
intTemp3;
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
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?
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
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
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?
@ 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.
@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?
@ 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.
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.
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?
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
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.