Wie viel RAM benutzt meine Applikation?

Gast #3352060
Lesenswert?

Guten Tag,

Ich wollte mal nachfragen, mit welcher Option / unter welcher 
Linker-Datei ich nachschauen kann, wie viel RAM mein kompiliertes 
Programm benutzt. Denn der RAM auf meinem Entwickler-Board ist sehr 
knapp gegeben und ich will ja schließlich rausfinden wie viel ich davon 
benutze, bevor er ich weitere, optionale Dinge implementiere.

Gruß, Heinz
Gast #3352077
Lesenswert?

Peter II schrieb:
> woher soll denn der linker den RAM verbrauch kennen?

Hallo Peter II,

Beim zusammensetzen des Programms muss doch der GCC irgendwie wissen, 
wie viel RAM gesammt verbraucht wird. Denn wenn ich die Optimierung -Os 
wegfallen lasse, meldet er mir, dass der RAM des Boards nicht ausreicht.

Vllt. sollte ich noch sagen, dass ich den arm-none-eabi-gcc benutze, 
samt Eclipse auf Linux.

Gruß, Heinz
Gast #3352085
Lesenswert?

Der Heinz schrieb:
> Beim zusammensetzen des Programms muss doch der GCC irgendwie wissen,
> wie viel RAM gesammt verbraucht wird

nein muss er nicht. Weil zum Ram der Stack gehört und diese kann er 
nicht überblicken. (recursive funktionen!)

und es reicht schon ein

malloc( rand(100) );

schon geht es auch nicht mehr.


oder ein
1
void foo( const int a ) {
2
   int x[a];

Der Linken kennt maximal, die globalen und static variablen aber nicht 
mehr.
Gast #3352105
Lesenswert?

Er weiß nur, wieviel RAM Du statisch verwendest. Für Stack und Heap wird 
wenn überhaupt nur ein Bereich vorgesehen (je nach Compiler/Linker/OS). 
Wieviel davon Du verbrauchst weiß der Compiler/Linker nicht.
Den Stackverbrauch kannst Du (fast) nur zur Laufzeit ermitteln oder mit 
entsprechenden Analysetools. Eine gern verwendete Methode ist das 
Initialisieren des RAMs im Startup mit einer Magic Number (z.B. 0xAFFE) 
und dann zur Laufzeit (z.B. mit dem Debugger) zu schauen, wieviele Affen 
noch da sind.

Um welche Architektur geht es denn?
Gast #3352125
Lesenswert?

Der Heinz schrieb:
> Beim zusammensetzen des Programms muss doch der GCC irgendwie wissen,
> wie viel RAM gesammt verbraucht wird.

Er weiß, wieviel durch statisch allokierte Variablen verbraucht wird. 
Was du noch dynamisch machst (malloc und co) und was der Stack braucht, 
ergibt sich erst zur Laufzeit des Programms.

> Vllt. sollte ich noch sagen, dass ich den arm-none-eabi-gcc benutze,
> samt Eclipse auf Linux.

Den statischen Anteil kannst du dir mit dem Tool arm-none-eabi-size 
ausgeben lassen.
Gast #3352144
Lesenswert?

"arm-none-eabi-gcc" hab' ich übersehen.

In Deinem Linkerskript wird wahrscheinlich eine (Mindest-)Größe für 
Stack und Heap angegeben. Falls Du kein malloc, new, o.ä. verwendest, 
könntest Du den Heap auf 0 runterschrauben und den RAM anderweitig 
verwenden.
Gast #3352157
Lesenswert?

Hallo Ma,

Das hört sich sehr interessant an.
Mein Board hat einen USB-Anschluss, dem eigentlich einen bestimmten 
Bereich im RAM zugewiesen ist. Da ich aber kein USB benutze, möchte ich 
diesen Bereich im Speicher "losreißen" und ihn als statischen RAM 
verwenden (für globale Variablen oder ähnliches), bzw. dazu mappen. Das 
selbe sollte auch mit dem Heap passieren. Leider weiß ich keinen Ansatz, 
wie ich das realisieren könnte.
Kennt sich damit jemand aus?

Gruß, Der Heinz
Gast #3352172
Lesenswert?

Ma schrieb:
> Ohne Dein Linkerskript zu kennen, kann Dir da niemand helfen.
> Und ohne den Prozessor zu kennen, kann Dir auch niemand sagen, ob Dein
> Vorhaben (USB-Speicherbereich verwenden) realisierbar ist.

Was meinst du mit Linkerscript? Bin grad verwirrt
Gast #3352232
Lesenswert?

Das Linkerscript ist eine Datei, die dem Linker sagt, was er tun soll...
z.B. Welche Speicher gibt es, an welchen Adressen sind die, welche 
Segmente sollen in welchen Speicher, etc.

Dem gcc (bzw. ld) wird per -T oder --script gesagt, wo er die Datei 
findet - schau einfach mal in Dein Makefile.

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