Speicheranzeige im ProgrammersNotepad

OP #2658536
Lesenswert?

Hi,
wenn ich mein Programm mit PorgrammersNotepad kompiliere bekomme ich als 
Ausgabe dieses:
1
Size after:
2
Hexfiles/MEGA644_P.elf  :
3
section             size      addr
4
.data               1572   8388864
5
.text              59048         0
6
.bss                2520   8390436
7
.debug_aranges       480         0
8
.debug_pubnames    10225         0
9
.debug_info        40423         0
10
.debug_abbrev       7606         0
11
.debug_line        19764         0
12
.debug_frame        2416         0
13
.debug_str          6813         0
14
.debug_loc         11288         0
15
.debug_ranges        552         0
16
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:
1
.text              59048         0
der Flash Speicherbedarf?
Was ist .data und .bss?

Vielen Dank für die Hilfe...
#2658553
Lesenswert?

.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
#2658565
Lesenswert?

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:
1
#HEXSIZE
2
avr-size --target=ihex $(TARGET).hex
3

4
#ELFSIZE 
5
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
1
avr-size
 haben einen Parameter '-C'.

So sieht die z.B. die Ausgabe für ein Projekt mit einem attiny861 aus:
1
AVR Memory Usage
2
----------------
3
Device: attiny861
4

5
Program:    3992 bytes (48.7% Full)
6
(.text + .data + .bootloader)
7

8
Data:         47 bytes (9.2% Full)
9
(.data + .bss + .noinit)
10

11
EEPROM:       80 bytes (15.6% Full)
12
(.eeprom)
#2658566
Lesenswert?

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"? :-)
OP #2658575
Lesenswert?

Danke Klaus für die ausführliche Erklärung!!!

Wenn  mir jetzt noch einer Verraten kann wie ich diese 
Kompilierungsanzeige hinbekomme:
1
AVR Memory Usage
2
----------------
3
Device: attiny861
4

5
Program:    3992 bytes (48.7% Full)
6
(.text + .data + .bootloader)
7

8
Data:         47 bytes (9.2% Full)
9
(.data + .bss + .noinit)
10

11
EEPROM:       80 bytes (15.6% Full)
12
(.eeprom)
Diese Zeilen:
1
#HEXSIZE
2
avr-size --target=ihex $(TARGET).hex
3

4
#ELFSIZE 
5
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...
#2658576
Lesenswert?

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.
#2658582
Lesenswert?

Vielleicht noch eine Hilfe
1
$(TARGET).hex
 und
1
$(TARGET).elf
 musst Du gegen deinen reale Dateinamen ersetzen.

Wenn
1
TARGET = main
 ist, dann ergibt sich auch der Textersetzung:
1
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 ?
OP #2658592
Lesenswert?

Ja das avr-size wird so vergeben
1
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
Angehängte Dateien:
#2658599
Lesenswert?

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:
1
CFLAGS = -g -O$(OPT) \

Das bläht dein Programm so auf.

Dann vergleiche die avr-size Ausgaben noch mal.
#2658618
Lesenswert?

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:

1
# Display size of file.
2
HEXSIZE = $(SIZE) --target=$(FORMAT) $(TARGET).hex
3
ELFSIZE = $(SIZE) -A $(TARGET).elf
4
sizebefore:
5
  @if [ -f $(TARGET).elf ]; then echo; echo $(MSG_SIZE_BEFORE); $(ELFSIZE); echo; fi
6

7
sizeafter:
8
  @if [ -f $(TARGET).elf ]; then echo; echo $(MSG_SIZE_AFTER); $(ELFSIZE); echo; fi
OP #2658621
Lesenswert?

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
Angehängte Dateien:
OP #2658626
Lesenswert?

> 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.
#2658643
Lesenswert?

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.
OP #2659209
Lesenswert?

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:
1
Size after:
2
Hexfiles/MEGA644_P.elf  :
3
section    size      addr
4
.data    1572   8388864
5
.text   59048         0
6
.bss     2520   8390436
7
Total   63140
Angehängte Dateien:
#2659233
Lesenswert?

Hallo Marcus,

so sieht mein Makefile aus
1
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.
1
CFLAGS = -O$(OPT) \
2
-funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums \
3
-Wall -Wstrict-prototypes \
4
-Wa,-adhlns=$(<:.c=.lst) \
5
$(patsubst %,-I%,$(EXTRAINCDIRS))
6

7
CFLAGS += -fno-inline-small-functions
8
#CFLAGS += -finline-small-functions
9
CFLAGS += -fno-split-wide-types
10
#CFLAGS += -fno-tree-scev-cprop
11
CFLAGS += -fno-move-loop-invariants
12
#CFLAGS += -mcall-prologues
13
CFLAGS += -ffunction-sections -fdata-sections
14
CFLAGS += -Wl,--gc-sections
15
CFLAGS += -Wl,--relax

Ok ?
OP #2660375
Lesenswert?

1
ELFSIZE = $(SIZE) -C --mcu=$(MCU) --common --target=elf32-avr $(TARGET).elf

Das hat geklappt ... prima danke...
1
CFLAGS = -O$(OPT) \
2
-funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums \
3
-Wall -Wstrict-prototypes \
4
-Wa,-adhlns=$(<:.c=.lst) \
5
$(patsubst %,-I%,$(EXTRAINCDIRS))
Das hatte ich schon drin...
1
CFLAGS += -fno-inline-small-functions
2
#CFLAGS += -finline-small-functions
3
CFLAGS += -fno-split-wide-types
4
#CFLAGS += -fno-tree-scev-cprop
5
CFLAGS += -fno-move-loop-invariants
6
#CFLAGS += -mcall-prologues
7
CFLAGS += -ffunction-sections -fdata-sections
8
CFLAGS += -Wl,--gc-sections
9
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
OP #2660384
Lesenswert?

Hier issa...
1
Linking: Hexfiles/MEGA644_P.elf
2
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
3

4
Creating load file for Flash: Hexfiles/MEGA644_P.hex
5
avr-objcopy -O ihex -R .eeprom Hexfiles/MEGA644_P.elf Hexfiles/MEGA644_P.hex
6

7
Creating load file for EEPROM: Hexfiles/MEGA644_P.eep
8
avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" \
9
  --change-section-lma .eeprom=0 -O ihex Hexfiles/MEGA644_P.elf Hexfiles/MEGA644_P.eep
10
c:\WinAVR-20100110\bin\avr-objcopy.exe: --change-section-lma .eeprom=0x00000000 never used
11

12
Creating Extended Listing: Hexfiles/MEGA644_P.lss
13
avr-objdump -h -S Hexfiles/MEGA644_P.elf > Hexfiles/MEGA644_P.lss
14

15
Creating Symbol Table: Hexfiles/MEGA644_P.sym
16
avr-nm -n Hexfiles/MEGA644_P.elf > Hexfiles/MEGA644_P.sym
17

18
Size after:
19
AVR Memory Usage
20
----------------
21
Device: atmega644p
22

23
Program:   54382 bytes (83.0% Full)
24
(.text + .data + .bootloader)
25

26
Data:       3553 bytes (86.7% Full)
27
(.data + .bss + .noinit)
28

29

30

31
Errors: none
32
-------- end --------

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren