Datum:
Hi, wenn ich mein Programm mit PorgrammersNotepad kompiliere bekomme ich als Ausgabe dieses:
Size after: Hexfiles/MEGA644_P.elf : section size addr .data 1572 8388864 .text 59048 0 .bss 2520 8390436 .debug_aranges 480 0 .debug_pubnames 10225 0 .debug_info 40423 0 .debug_abbrev 7606 0 .debug_line 19764 0 .debug_frame 2416 0 .debug_str 6813 0 .debug_loc 11288 0 .debug_ranges 552 0 Total 162707 |
Ich benutze ein Atmega 644p der hat ja bekanntlich - 65536 FlashSpeicher - 2048 EEPROM - 128 PageSize Doch was sagt mir jetzt genau die Ausgabe vom ProgrammersNotepad. Ist:
.text 59048 0 |
der Flash Speicherbedarf? Was ist .data und .bss? Vielen Dank für die Hilfe...
Datum:
.text ist belegte Größe des Programms, .data die Größe der globalen und statischen Variablen, die zu initialisieren sind, und .bss dto. die nicht zu initiliasierenden (bzw. zu 0).
Datum:
Wenn ich dann .text + .data + .bss nehme komm ich auf den Gesamtplatzbedarf der bei meinem A644p nicht über 65536b kommen darf. Oder? Ich glaube nämlich, dass ich da am Ende des Speichres bin...Shit...
Datum:
.text belegt kein RAM, aber .data und .bss sehr wohl. Zuzüglich dynamischer Verbrauch durch Stack und ggf. Heap. Also: .bss: nur Flash .data: erst im Flash, beim Starten muß der Inhalt ins RAM .bss: nur zur Laufzeit im RAM Stack + Heap: kommt zur Laufzeit im RAM dazu
Datum:
.text belegt kein RAM. Dann bin ich ja noch Meilenweit vom Max entfernt, oder wie siehts Du das?
Datum:
Beitrag #2658560 wurde vom Autor gelöscht.
Datum:
Ich hab mich eben auch vertan mit Flash und RAM .text belegt Flash-Speicher und Flash Speicher hat der A644p von 65536b. Und somit ist mein Atmega voll. Oder liege ich da falsch?
Datum:
Hallo Markus, könntest Du mir den Trick verraten? wie geht das oder ist das gemeint ? Markus P. schrieb: > wenn ich mein Programm mit PorgrammersNotepad kompiliere ... Ich verwende im Makefile folgende Zeilen, die Du auch auf einer CMD Zeile eingeben könntest:
#HEXSIZE avr-size --target=ihex $(TARGET).hex #ELFSIZE avr-size -C --mcu=atmega644p --common --target=elf32-avr $(TARGET).elf |
Vielleicht sind diese Zusammenfassungen der Datenbereichte, die Klaus trefflich erklärt hat, einfacher zu lesen. Anm.: nicht alle
avr-size |
haben einen Parameter '-C'. So sieht die z.B. die Ausgabe für ein Projekt mit einem attiny861 aus:
AVR Memory Usage ---------------- Device: attiny861 Program: 3992 bytes (48.7% Full) (.text + .data + .bootloader) Data: 47 bytes (9.2% Full) (.data + .bss + .noinit) EEPROM: 80 bytes (15.6% Full) (.eeprom) |
Datum:
Markus P. schrieb: > Dann bin ich ja noch Meilenweit vom Max entfernt Speicher misst man nicht in Meilen, deshalb bin ich mit der Frage überfordert. > oder wie siehts Du > das? Du hast 64kB Flash. Da müssen .data und .text reinpassen: .data 1572 .text 59048 --------- 60620 Das passt noch, wird aber vielleicht irgendwann eng, wenn du noch mehr vernaschst. Dann hast du 4 kB RAM. Da muß rein: .data, .bss, Stack, Heap: .data 1572 .bss 2520 --------- 4092 4kB sind 4096 Byte, 4092 brauchst du für .data und .bss. Bleiben 4 Byte für Stack und Heap. Was meinst du mit "meilenweit"? :-)
Datum:
Uwe S. schrieb: > > Program: 3992 bytes (48.7% Full) > (.text + .data + .bootloader) > > Data: 47 bytes (9.2% Full) > (.data + .bss + .noinit) > > EEPROM: 80 bytes (15.6% Full) Diese Darstellung habe ich garnicht... Hast du das auch mit dem PorgammersNotepad erzeugt?
Datum:
Danke Klaus für die ausführliche Erklärung!!! Wenn mir jetzt noch einer Verraten kann wie ich diese Kompilierungsanzeige hinbekomme:
AVR Memory Usage ---------------- Device: attiny861 Program: 3992 bytes (48.7% Full) (.text + .data + .bootloader) Data: 47 bytes (9.2% Full) (.data + .bss + .noinit) EEPROM: 80 bytes (15.6% Full) (.eeprom) |
Diese Zeilen:
#HEXSIZE avr-size --target=ihex $(TARGET).hex #ELFSIZE avr-size -C --mcu=atmega644p --common --target=elf32-avr $(TARGET).elf |
erzeugen eine Fehlermeldung: /usr/bin/sh: -c: line 1: syntax error near unexpected token `;' /usr/bin/sh: -c: line 1: `if [ -f Hexfiles/MEGA644_P.elf ]; then echo; echo Size before: ; ; echo; fi' make.exe: *** [sizebefore] Error 258 Wäre nett wenn mir jemand hilft...
Datum:
Dazu musst du verstehen was du eigentlich machst (ich verstehe es nicht, weil ich anders arbeite). Du redest immer von ProgrammersNotepad, aber der kompiliert nicht, sondern ruft höchstens irgendwas anderes auf. Entweder direkt, oder über ein makefile. Und da wird irgendwo drin verdrahtet sein, wie kompiliert wird, gelinkt, etc. und dabei auch irgendwo ein Aufruf von avr-size. Wenn du diese Stelle findest, kannst du dort versuchen, mit der zusätzlichen Option -C diese Ausgabe zu bekommen.
Datum:
Angehängte Dateien:Ah, sorry... Ich mache erst "Make Clean" dann "Make All" (s.Anhang)
Datum:
Also wird es irgendwo ein Makefile geben. Dadrin musst du mal nach avr-size suchen.
Datum:
Vielleicht noch eine Hilfe
$(TARGET).hex |
und
$(TARGET).elf |
musst Du gegen deinen reale Dateinamen ersetzen. Wenn
TARGET = main |
ist, dann ergibt sich auch der Textersetzung:
avr-size -C --mcu=atmega644p --common --target=elf32-avr main.elf |
Wichtig, aber die Datei xyz.elf muss von deinem Makefile erzeugt werden und Du musst wissen wie sie heißt. Ok ?
Beitrag #2658583 wurde vom Autor gelöscht.
Datum:
Hallo, was avr-size 'kann', kannst Du Dir im 'shell' mit
avr-size --help |
ausgeben lassen. .
Datum:
Angehängte Dateien:Ja das avr-size wird so vergeben
SIZE = avr-size |
Deswegen hab ich's auch mal so ausprobiert, ohne zu wissen was ich da eigentlich mache...Glaub das passiert mir häufiger;-) #HEXSIZE SIZE --target=ihex $(TARGET).hex #ELFSIZE SIZE -C --mcu=atmega644p --common --target=elf32-avr $(TARGET).elf Ich habe das makefile mal angehängt, vielleicht schaut einer drüber und kann mir den entscheidenen Tip geben
Datum:
Uwe S. schrieb: > was avr-size 'kann', kannst Du Dir im 'shell' mitavr-size --help ausgeben lassen. Das klappt schon nicht, ich sehe einmal kurz die CMD - Box aufpoppen und ist dann sofort wieder weg...
Datum:
Hallo, Zwischen den Texten $(SIZE) und SIZE gibt es einen Unterschied: "avr-size" != "SIZE" . Also '$(SIZE)' nennt man ein Macro. Schalte auch mal dem Debug "-g" aus, d.h. den Text löschen:
CFLAGS = -g -O$(OPT) \ |
Das bläht dein Programm so auf. Dann vergleiche die avr-size Ausgaben noch mal.
Datum:
Markus P. schrieb: > Ja das avr-size wird so vergebenSIZE = avr-size > > Deswegen hab ich's auch mal so ausprobiert, ohne zu wissen was ich da > eigentlich mache...Glaub das passiert mir häufiger;-) > > #HEXSIZE > SIZE --target=ihex $(TARGET).hex > > #ELFSIZE > SIZE -C --mcu=atmega644p --common --target=elf32-avr $(TARGET).elf Du kannst nicht einfach irgendwas irgendwo in eine makefile schreiben. Das: SIZE --target=ihex $(TARGET).hex wird so nicht gehen. Zeig doch mal die Originalversion, die mal funktioniert hat. Da würde ich u.a. einen Abschnitt in dieser Art erwarten:
# Display size of file. HEXSIZE = $(SIZE) --target=$(FORMAT) $(TARGET).hex ELFSIZE = $(SIZE) -A $(TARGET).elf sizebefore: @if [ -f $(TARGET).elf ]; then echo; echo $(MSG_SIZE_BEFORE); $(ELFSIZE); echo; fi sizeafter: @if [ -f $(TARGET).elf ]; then echo; echo $(MSG_SIZE_AFTER); $(ELFSIZE); echo; fi |
Datum:
Angehängte Dateien:Größe habe ich im Anhang gepackt... Text ist wesentlich größer geworden, jedoch gesamt viel kleiner... Aber ich bekomme dann Warnungen: c:/winavr-20100110/lib/gcc/../../avr/include/util/delay.h:90:3: warning: #warning "Compiler optimizations disabled; functions from <util/delay.h> won't work as designed" Bezogen auf diese Textzeile die in der delay.h deklariert ist: #ifndef _OPTIMIZE_ # warning "Compiler optimizations disabled; functions from <util/delay.h> won't work as designed" #endif
Datum:
> Zeig doch mal die Originalversion, die mal funktioniert hat. > > Da würde ich u.a. einen Abschnitt in dieser Art erwarten: In der Originalversion ist nur diese Zeile so drin: HEXSIZE = $(SIZE) --target=$(FORMAT) $(TARGET).hex ELFSIZE = $(SIZE) -A $(TARGET).elf #HEXSIZE #SIZE --target=ihex $(TARGET).hex #ELFSIZE #SIZE -C --mcu=atmega644p --common --target=elf32-avr main.elf sonst ist das gleich geblieben.
Datum:
Ich bin estmal weg bis heute Abend. Vielen Dank schonmal für eure hilfe ich glaub das kriegt man noch in den Griff. Allein das CFLAGS = -g -O$(OPT) \ hat schon viel gebracht... Danke ich meld mich ...
Datum:
Ich denke Du hast die gesamte Zeile gelöscht ? Nein !! nur "-g" . Zum Überprüfen..
Datum:
Markus P. schrieb: > In der Originalversion ist nur diese Zeile so drin: > > HEXSIZE = $(SIZE) --target=$(FORMAT) $(TARGET).hex > ELFSIZE = $(SIZE) -A $(TARGET).elf > > #HEXSIZE > #SIZE --target=ihex $(TARGET).hex > > #ELFSIZE > #SIZE -C --mcu=atmega644p --common --target=elf32-avr main.elf > > sonst ist das gleich geblieben. So, und wenn du das hier: ELFSIZE = $(SIZE) -A $(TARGET).elf änderst zu: ELFSIZE = $(SIZE) -C -A $(TARGET).elf dann wirst du die gewünschte Ausgabe mit den % bekommen, falls dein avr-size das kann.
Datum:
Angehängte Dateien:Klaus Wachtler schrieb: > dann wirst du die gewünschte Ausgabe mit den % bekommen, falls dein > avr-size das kann. Da bin ich wieder, leider unterstützt mein avr-size wohl nicht die %-Anzeige. Kann ich da irgend nen "Update" machen? Oder habe ich da im makefile (s.Anhang) noch falsch gemacht? So ist die Anzeige:
Size after: Hexfiles/MEGA644_P.elf : section size addr .data 1572 8388864 .text 59048 0 .bss 2520 8390436 Total 63140 |
Datum:
Hallo Marcus, so sieht mein Makefile aus
ELFSIZE = $(SIZE) -C --mcu=$(MCU) --common --target=elf32-avr $(TARGET).elf |
Bei deinem Versuch stehen die Optionen -C und -A direkt zusammen und das macht Probleme. Diese Ergänzung sollte doch entscheident die Codegröße reduzieren: Mit den auskommentieren Zeilen "#" kann man mal spielen, ob der Parameter etwas bewirkt.
CFLAGS = -O$(OPT) \ -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums \ -Wall -Wstrict-prototypes \ -Wa,-adhlns=$(<:.c=.lst) \ $(patsubst %,-I%,$(EXTRAINCDIRS)) CFLAGS += -fno-inline-small-functions #CFLAGS += -finline-small-functions CFLAGS += -fno-split-wide-types #CFLAGS += -fno-tree-scev-cprop CFLAGS += -fno-move-loop-invariants #CFLAGS += -mcall-prologues CFLAGS += -ffunction-sections -fdata-sections CFLAGS += -Wl,--gc-sections CFLAGS += -Wl,--relax |
Ok ?
Datum:
ELFSIZE = $(SIZE) -C --mcu=$(MCU) --common --target=elf32-avr $(TARGET).elf |
Das hat geklappt ... prima danke...
CFLAGS = -O$(OPT) \ -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums \ -Wall -Wstrict-prototypes \ -Wa,-adhlns=$(<:.c=.lst) \ $(patsubst %,-I%,$(EXTRAINCDIRS)) |
Das hatte ich schon drin...
CFLAGS += -fno-inline-small-functions #CFLAGS += -finline-small-functions CFLAGS += -fno-split-wide-types #CFLAGS += -fno-tree-scev-cprop CFLAGS += -fno-move-loop-invariants #CFLAGS += -mcall-prologues CFLAGS += -ffunction-sections -fdata-sections CFLAGS += -Wl,--gc-sections CFLAGS += -Wl,--relax |
Das hat fast 20% gebracht... mit den Einstellungen oben war es am besten... Vor allem sieht man so viel besser / schneller (%-Anzeige) wenn man gerade eine Speicherfresser aufgebaut hat... Vielen Dank
Datum:
Fine, poste bitte noch die avr-size Ausgaben. Danke.
Datum:
Hier issa...
Linking: Hexfiles/MEGA644_P.elf avr-gcc -mmcu=atmega644p -I. -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=main.o -fno-inline-small-functions -fno-split-wide-types -fno-tree-scev-cprop -fno-move-loop-invariants -mcall-prologues -ffunction-sections -fdata-sections -Wl,--gc-sections -Wl,--relax -std=gnu99 main.o usart.o stack.o timer.o cmd.o base64.o networkcard/enc28j60.o httpd.o telnetd.o ntp.o wol.o http_get.o sendmail.o dnsc.o dhcpc.o infrared/rc5.o 1-wire/crc8.o 1-wire/ds18x20.o 1-wire/messung.o 1-wire/onewire.o udp_send/udp_send.o com74hc595.o R_TRIG.o relais.o --output Hexfiles/MEGA644_P.elf -Wl,-Map=Hexfiles/MEGA644_P.map,--cref -lm Creating load file for Flash: Hexfiles/MEGA644_P.hex avr-objcopy -O ihex -R .eeprom Hexfiles/MEGA644_P.elf Hexfiles/MEGA644_P.hex Creating load file for EEPROM: Hexfiles/MEGA644_P.eep avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" \ --change-section-lma .eeprom=0 -O ihex Hexfiles/MEGA644_P.elf Hexfiles/MEGA644_P.eep c:\WinAVR-20100110\bin\avr-objcopy.exe: --change-section-lma .eeprom=0x00000000 never used Creating Extended Listing: Hexfiles/MEGA644_P.lss avr-objdump -h -S Hexfiles/MEGA644_P.elf > Hexfiles/MEGA644_P.lss Creating Symbol Table: Hexfiles/MEGA644_P.sym avr-nm -n Hexfiles/MEGA644_P.elf > Hexfiles/MEGA644_P.sym Size after: AVR Memory Usage ---------------- Device: atmega644p Program: 54382 bytes (83.0% Full) (.text + .data + .bootloader) Data: 3553 bytes (86.7% Full) (.data + .bss + .noinit) Errors: none -------- end -------- |
Datum:
Hallo Markus, was macht das Programm eigentlich ? Es braucht doch einiges an Speicher (Flash) und Ram (SRAM).
Datum:
Das ist das AVR NET IO mit Ulrich Radigs Software und Peter Danniger SW.... Hausautomatisierung.... Habe da aber "bewusst" noch Speicherfresser drin. Die muss ich "nur" verbessern. Bin halt kein guter Programmierer...habs mir irgendwie selber bei gebracht...

