www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Speicheranzeige im ProgrammersNotepad


Important announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Markus P. (sebastianwurst)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
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...

Autor: Klaus Wachtler (mfgkw)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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).

Autor: Markus P. (sebastianwurst)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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...

Autor: Klaus Wachtler (mfgkw)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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

Autor: Markus P. (sebastianwurst)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
.text belegt kein RAM.

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

Autor: hp-freund (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert

Beitrag #2658560 wurde vom Autor gelöscht.
Autor: Markus P. (sebastianwurst)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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?

Autor: Uwe S. (de0508)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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:
#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)

Autor: Klaus Wachtler (mfgkw)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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"? :-)

Autor: Markus P. (sebastianwurst)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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?

Autor: Markus P. (sebastianwurst)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
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...

Autor: Klaus Wachtler (mfgkw)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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.

Autor: Markus P. (sebastianwurst)
Datum:
Angehängte Dateien:
  • preview image for PN.jpg
    PN.jpg
    51,6 KB, 48 Downloads

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Ah, sorry... Ich mache erst "Make Clean" dann "Make All" (s.Anhang)

Autor: Klaus Wachtler (mfgkw)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Also wird es irgendwo ein Makefile geben.
Dadrin musst du mal nach avr-size suchen.

Autor: Uwe S. (de0508)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
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.
Autor: Uwe S. (de0508)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Hallo,

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

.

Autor: Markus P. (sebastianwurst)
Datum:
Angehängte Dateien:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
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

Autor: Markus P. (sebastianwurst)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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...

Autor: Uwe S. (de0508)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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:
CFLAGS = -g -O$(OPT) \

Das bläht dein Programm so auf.

Dann vergleiche die avr-size Ausgaben noch mal.

Autor: Klaus Wachtler (mfgkw)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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:

# 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

Autor: Markus P. (sebastianwurst)
Datum:
Angehängte Dateien:
  • preview image for PN.jpg
    PN.jpg
    37,9 KB, 66 Downloads

Diesen Beitrag bewerten:
lesenswert
nicht 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

Autor: Markus P. (sebastianwurst)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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.

Autor: Markus P. (sebastianwurst)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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 ...

Autor: Uwe S. (de0508)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Ich denke Du hast die gesamte Zeile gelöscht ?

Nein !! nur "-g" .

Zum Überprüfen..

Autor: Klaus Wachtler (mfgkw)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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.

Autor: Markus P. (sebastianwurst)
Datum:
Angehängte Dateien:

Diesen Beitrag bewerten:
lesenswert
nicht 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:
Size after:
Hexfiles/MEGA644_P.elf  :
section    size      addr
.data    1572   8388864
.text   59048         0
.bss     2520   8390436
Total   63140

Autor: Uwe S. (de0508)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
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 ?

Autor: Markus P. (sebastianwurst)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
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

Autor: Uwe S. (de0508)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Fine, poste bitte noch die avr-size Ausgaben.

Danke.

Autor: Markus P. (sebastianwurst)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
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 --------


Autor: Uwe S. (de0508)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Hallo Markus,

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

Autor: Markus P. (sebastianwurst)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel




Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder GIF-Format hochladen.
Siehe Bildformate
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken erkennst du die Nutzungsbedingungen an.

webmaster@mikrocontroller.netImpressumNutzungsbedingungenWerbung auf Mikrocontroller.net