Forum: Mikrocontroller und Digitale Elektronik Speicheranzeige im ProgrammersNotepad


von Markus P. (sebastianwurst)


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...

von Klaus W. (mfgkw)


Lesenswert?

.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).

von Markus P. (sebastianwurst)


Lesenswert?

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...

von Klaus W. (mfgkw)


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

von Markus P. (sebastianwurst)


Lesenswert?

.text belegt kein RAM.

Dann bin ich ja noch Meilenweit vom Max entfernt, oder wie siehts Du 
das?

von hp-freund (Gast)


Lesenswert?


von Markus P. (sebastianwurst)


Lesenswert?

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?

von Uwe (de0508)


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)

von Klaus W. (mfgkw)


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"? :-)

von Markus P. (sebastianwurst)


Lesenswert?

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?

von Markus P. (sebastianwurst)


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...

von Klaus W. (mfgkw)


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.

von Markus P. (sebastianwurst)


Angehängte Dateien:

Lesenswert?

Ah, sorry... Ich mache erst "Make Clean" dann "Make All" (s.Anhang)

von Klaus W. (mfgkw)


Lesenswert?

Also wird es irgendwo ein Makefile geben.
Dadrin musst du mal nach avr-size suchen.

von Uwe (de0508)


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 ?

von Uwe (de0508)


Lesenswert?

Hallo,

was avr-size 'kann', kannst Du Dir im 'shell' mit
1
avr-size --help
 ausgeben lassen.

.

von Markus P. (sebastianwurst)


Angehängte Dateien:

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

von Markus P. (sebastianwurst)


Lesenswert?

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...

von Uwe (de0508)


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.

von Klaus W. (mfgkw)


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

von Markus P. (sebastianwurst)


Angehängte Dateien:

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

von Markus P. (sebastianwurst)


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.

von Markus P. (sebastianwurst)


Lesenswert?

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 ...

von Uwe (de0508)


Lesenswert?

Ich denke Du hast die gesamte Zeile gelöscht ?

Nein !! nur "-g" .

Zum Überprüfen..

von Klaus W. (mfgkw)


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.

von Markus P. (sebastianwurst)


Angehängte Dateien:

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

von Uwe (de0508)


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 ?

von Markus P. (sebastianwurst)


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

von Uwe (de0508)


Lesenswert?

Fine, poste bitte noch die avr-size Ausgaben.

Danke.

von Markus P. (sebastianwurst)


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 --------

von Uwe (de0508)


Lesenswert?

Hallo Markus,

was macht das Programm eigentlich ?
Es braucht doch einiges an Speicher (Flash) und Ram (SRAM).

von Markus P. (sebastianwurst)


Lesenswert?

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...

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.