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