Forum: Compiler & IDEs Wie viel RAM benutzt meine Applikation?


von Der Heinz (Gast)


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

von (prx) A. K. (prx)


Lesenswert?

42

von Peter II (Gast)


Lesenswert?

woher soll denn der linker den RAM verbrauch kennen?

von Der Heinz (Gast)


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

von (prx) A. K. (prx)


Lesenswert?

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

- Linker Mapfile
- arm-none-eabi-objdump

von (prx) A. K. (prx)


Lesenswert?

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

Hu?? Wer, wenn nicht der Linker, könnte ihn denn sonst kennen?

von Peter II (Gast)


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.

von Peter II (Gast)


Lesenswert?

A. K. schrieb:
> Hu?? Wer, wenn nicht der Linker, könnte ihn denn sonst kennen?

niemand. siehe vorheriges Post.

von Ma (Gast)


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?

von Rolf Magnus (Gast)


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.

von Ma (Gast)


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.

von Der Heinz (Gast)


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

von Udo S. (urschmitt)


Lesenswert?

Der Heinz schrieb:
> Leider weiß ich keinen Ansatz

Einen Ansatz habe ich:
Lese mal die Doku zu deinem Linker.

von Ma (Gast)


Lesenswert?

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.

von Udo (Gast)


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

von Ma (Gast)


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.

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.