Forum: Compiler & IDEs Adressen bzw. Speicherbelegung von Variablen auflisten


von Karsten W. (lsmod)


Lesenswert?

Hallo,

ich arbeite gerade daran eine größere Anzahl von Werten im EEPROM zu 
sichern.
Gibt es eine Möglichkeit beim avr-gcc irgendwie aufzulisten, auf welcher 
Adresse welche Variable vom Compiler abgelegt wird?

Das kann durchaus auch Mal für statische RAM-Variablen interessant sein.

von Bitflüsterer (Gast)


Lesenswert?

Ja, das geht. Schau mal in's Handbuch. Ich bin fauler als Du.

von Karsten W. (lsmod)


Lesenswert?

Aha - die Idee ist ja nicht schlecht.
Aber hier finde ich leider nichts.
Nur z.B. 
http://gcc.gnu.org/onlinedocs/gcc-4.7.3/gcc/Named-Address-Spaces.html#Named-Address-Spaces

Kann mir nur vorstellen das es etwas mit dem Linker zu tun hat?
Vielleicht gibt dies aber auch ein externes Programm wie avr-objdump 
her?
Habe gerade Mal -t ausprobiert, aber da kommt eher kryptisches Zeug raus 
...

Natürlich habe ich vorher auch schon den Goggel befragt, der hat aber 
auch nichts zu dem Problem ausgespuckt.

: Bearbeitet durch User
von Falk B. (falk)


Lesenswert?

@ Karsten M. (lsmod)

>ich arbeite gerade daran eine größere Anzahl von Werten im EEPROM zu
>sichern.

Dann tu das.

>Gibt es eine Möglichkeit beim avr-gcc irgendwie aufzulisten, auf welcher
>Adresse welche Variable vom Compiler abgelegt wird?

Sicher, im MAP-file. Aber das ist eher nice to know, nix womit man aktiv 
im Programm hantiert. Aud feste Adressen schreibt man in einem 
C-Programm nur ganz selten. Lass die Variablenverwaltung wie sie ist, 
beim Compiler.

>Das kann durchaus auch Mal für statische RAM-Variablen interessant sein.

Warum?

Ach, das map-file generiert AVR-Studio beim Aufruf vom avr-gcc, welche 
Kommandozeilenoptionen das sind, sagt dir die Hilfe oder das Handbuch.

von Karsten W. (lsmod)


Lesenswert?

Danke - das ist schon Mal ein Anfang.

>>Gibt es eine Möglichkeit beim avr-gcc irgendwie aufzulisten, auf welcher
>>Adresse welche Variable vom Compiler abgelegt wird?
>
> Sicher, im MAP-file. Aber das ist eher nice to know, nix womit man aktiv
> im Programm hantiert. Aud feste Adressen schreibt man in einem
> C-Programm nur ganz selten. Lass die Variablenverwaltung wie sie ist,
> beim Compiler.

Es gibt verschiedene Gründe warum dies interessant ist.

1. Man verwendet verschiedene Programme die auf die gleichen Werte im 
EEPROM zugreifen.
Z.B. flashed man zuerst eine Kalibrier-Software und danach die 
eigentliche Betriebs-Firmware die mit den Werten arbeitet.
Hier wäre es schön das ganze Mal checken zu können.

2. Man möchte das EEPROM auslesen und danach die gespeicherten Werte 
wiederfinden.
(Dies ist mein aktuelles Poblem.)

>>Das kann durchaus auch Mal für statische RAM-Variablen interessant sein.
>
> Warum?

Warum nicht?

Zugegeben - hier fällt mir zur Zeit keine konkrete Anwendung ein. :-)

> Ach, das map-file generiert AVR-Studio beim Aufruf vom avr-gcc, welche
> Kommandozeilenoptionen das sind, sagt dir die Hilfe oder das Handbuch.

Leider arbeite ich nicht mit AVR-Studio, sondern direkt mit dem avr-gcc 
in Linux.
Gibt es dort auch eine Komponente die map-files erstellen kann?

: Bearbeitet durch User
von Karsten W. (lsmod)


Lesenswert?

Ich habe jetzt auf Grund Eurer Tips schon Mal was gefuden:

http://www.nongnu.org/avr-libc/user-manual/using_tools.html

Controlling the linker avr-ld

    -Map mapfile

Print a linker map to mapfile.

    --cref

Output a cross reference table to the map file (in case -Map is also 
present), or to stdout.

Bis jetzt ist es mir aber nicht gelungen mit diesen Optionen irgendwie 
eine MAP-Datei zu erzeugen ...

von Bitflüsterer (Gast)


Lesenswert?

Würdest Du bitte mal "avr-gcc map-file" in die Suchmaschine Deiner Wahl 
eingeben?

von Karsten W. (lsmod)


Lesenswert?

Jetzt habe ich die Lösung:

Man muss in die Aufruf-Parameter vom gcc folgendes hinzufügen:
 -Wl,-Map,main.map,--cref

Dann wird eine main.map erstellt, in der wirklich viel zu finden ist.
Zu meinem Glück auch eine Liste der Variablen im EEPROM mit ihren 
Adressen. :-)
Das sieht dann so aus:

Memory Configuration

Name             Origin             Length             Attributes
text             0x0000000000000000 0x0000000000002000 xr
data             0x0000000000800060 0x000000000000ffa0 rw !x
eeprom           0x0000000000810000 0x0000000000010000 rw !x
fuse             0x0000000000820000 0x0000000000000400 rw !x
lock             0x0000000000830000 0x0000000000000400 rw !x
signature        0x0000000000840000 0x0000000000000400 rw !x
default        0x0000000000000000 0xffffffffffffffff


.eeprom         0x0000000000810000       0xca
 *(.eeprom*)
 .eeprom        0x0000000000810000       0xca main.o
                0x0000000000810000                EE_S0Count
                0x00000000008100c0                EE_S0Pointer
                0x00000000008100c1                EE_Lifetime
                0x00000000008100c5                EE_Reset_WR2
                0x00000000008100c7                EE_Reset_WR1
                0x00000000008100c9                EE_Kontrast
                0x00000000008100ca                __eeprom_end = .

Danke für die Inspiration ...

Konkrete Hinweise sind natürlich immer besser als dumme Kommentare. ;-)
Wie soll man auf die richtigen Keywords kommen wenn man die Lösung noch 
nicht Mal erahnen kann?
Aber nun ist ja hier alles zusammen.

: Bearbeitet durch User
von Wolfgang (Gast)


Lesenswert?

Karsten M. schrieb:
> Zu meinem Glück auch eine Liste der Variablen im EEPROM mit ihren
> Adressen. :-)

Und, willst du jetzt nach jedem Compilerlauf dein Kalibrierprogramm ggf. 
umschreiben?

von Karsten W. (lsmod)


Lesenswert?

Wolfgang schrieb:
> Karsten M. schrieb:
>> Zu meinem Glück auch eine Liste der Variablen im EEPROM mit ihren
>> Adressen. :-)
>
> Und, willst du jetzt nach jedem Compilerlauf dein Kalibrierprogramm ggf.
> umschreiben?

Nein - natürlich nicht.
So wie ich bereits erfolgreich gegoogelt habe kann man alle 
EEPROM-Definitionen in ein struct packen.
Dieses wird dann in unterschiedlichen Programmen auch identisch erzeugt 
bzw. abgelegt.

Mit dem MAP-File kann man dies nun komfortabel kontrollieren.

von Falk B. (falk)


Lesenswert?

@ Karsten M. (lsmod)

>Gibt es dort auch eine Komponente die map-files erstellen kann?

avr gcc, wer sonst? Hier mal eine Kommandozeoe aus dem AVR Studio. Ich 
tippe mal auf -Map=LEDmodul.map

avr-gcc -mmcu=atmega8 -Wl,-Map=LEDmodul.map cmd_terminal.o functions.o 
globals.o interrupt.o main.o serial_flash.o tlc5940.o uart.o     -o 
LEDmodul.elf

von Karsten W. (lsmod)


Lesenswert?

Ja genau.
Hier noch ein Hinweis wie man dies in ein makefile eingebaut bekommt:

http://forums.devshed.com/programming-42/modify-makefile-build-map-file-862796.html

LDFLAGS=-Wl,-Map=$@.map

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.