Forum: Compiler & IDEs variable im mapfile


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Gaehn... (Gast)


Lesenswert?

Moin,
irgendwie funktioniert mein Gehirn heute nicht so richtig...:

Im mapfile werden doch zur Compilezeit die bekannten "Objekte" angelegt?
Wenn es also z.B. eine Variable my_var gibt (von mir aus sogar global, 
außerhalb main), wird sie (zumindest im Debug) auch wirklich erzeugt. 
Dann muß doch zur Compilezeit schon RAM dafür zugewiesen werden und 
my_var im mapfile mit Speicheradresse und Speicherverbrauch auftauchen? 
Tut sie aber nicht...
Alle anderen Randbedingungen (arm-none-eabi-c++ usw.) sollten da ja 
wirklich keinen Einfluß bei dieser Grundsatzfrage haben.

von Andreas M. (amesser)


Lesenswert?

Nein.

Wenn die Variable nicht benutzt wird, dann wird der Linker diese nicht 
mit ins elf aufnehmen. Ausnahme: In der gleichen Datei sind noch andere 
statische oder globale Variablen, die im gleichen Segment 
(.bss/.data/.rodata) liegen, welche irgendwo referenziert werden. (Der 
Linker kann keine Sections aus einer Datei zerstückeln)

Wenn die Variable eine statische Konstante ist, dann könnte der Compiler 
diese eventuell schon entsorgen.

Wenn man zusätzlich noch LTO benutzt dann kann es noch anders laufen: 
der Linker könnte die Variable wegoptimieren, obwohl sie referenziert 
wird :-)

: Bearbeitet durch User
von Gaehn... (Gast)


Lesenswert?

Danke, die Argumente kann ich nachvollziehen. Aber konkret hier sollte 
ja nichts davon zutreffen:
1
#include <stdint.h>
2
3
int main (void)
4
   {
5
      uint32_t loc_var1;
6
      uint32_t loc_var2 = 8;
7
8
      loc_var1++;
9
      loc_var2++;
10
      uint32_t addr = reinterpret_cast<uint32_t>(&loc_var1);
11
      addr++;
12
   }

Es gibt eine Warnung, daß loc_var1 uninitialisiert verwendet wird, was 
ja auch gut und richtig ist.

Aber alle 3 Variablen werden aus Sicht des Compilers und Linkers auch 
verwendet (nach meinem Verständnis, und unused_warnings gibt es auch 
nicht). Es ist also klar, daß es diese 3 Variablen im Programm verwendet 
werden und somit garantiert Speicher brauchen. Und daher hätte ich 
erwartet, daß sie im mapfile auftauchen.
Da sie das aber nicht tun, hatte ich bisher wohl eine falsche 
Vorstellung der statischen "Speicherauslastungsberechnung".

von Μαtthias W. (matthias) Benutzerseite


Lesenswert?

Das sind alles lokale Variablen die auf dem Stack angelegt werden. Die 
tauchen im mapfile nicht auf.

von dummschwaetzer (Gast)


Lesenswert?

wenn du sie als static initialisierst, sollten sie da sein

von Gaehn... (Gast)


Lesenswert?

Ah, ..., natürlich. Dann kann ich das ja nur im Degubber sehen.
Ich habe daraufhin jetzt das hier gefunden: 
https://www.keil.com/support/man/docs/armclang_intro/armclang_intro_hla1474359990839.htm
Das bringt mich weiter.
Vielen Dank.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.