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.
Ja, das geht. Schau mal in's Handbuch. Ich bin fauler als Du.
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
@ 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.
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
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 ...
Würdest Du bitte mal "avr-gcc map-file" in die Suchmaschine Deiner Wahl eingeben?
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
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?
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.
@ 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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.