Forum: Mikrocontroller und Digitale Elektronik STM32 & GCC - Platzprobleme - Herangehensweise - *.lst und *.o Dateien.


von Uwe (Gast)


Lesenswert?

Hallo,

ich hab einen STM32 mit 64kb, leider stoße ich aufgrund von
SD Card Libarys und vermutlich der extensiven Nutzung der
Standard Lib von St ich hier an die Speichergrenze.

Gerne möchte ich wissen, welcher Programmteil besonders viel
Flashspeicher verbraucht.

Gcc erzeugt beim compilieren ja ganz viele *.lst und *.o Dateien.
Vielleicht ist das ja ein Anhaltspunkt :) Hoffe ich mal.
Neben dem Hauptprogramm (main.o) sind die "fetten Brocken" im Windows
Dateiordner:

*.o Dateien
1
 main.o (101kb) - Hauptprogramm
2
 ff.o (57kb) - SD Karte
3
 stm32f10x_tim.o (53kb) - Timerfunktionen
4
 //.... Alles weitere kleiner als (23kb)

Am Hauptprogramm kann ich wenig ändern, SD Karten Lib könnte ich
tauschen (mit viel Aufwand), Timerfunktionen könnte ich
ggf. nur über die Register realisieren, ohne die Std.Lib von ST.

Ist diese Herangehensweise oder Beurteilung richtig?

Gcc optimiert den Code schon hinsichtlich der Codegröße.
Ohne diese Option passt es garnicht auf den STM32.

Vielen Dank
Uwe

von Lasse S. (cowz) Benutzerseite


Lesenswert?

Du kannst den Compiler nicht genutzte Funktionen (bspw. von der ST-Lib) 
nicht mit compilieren lassen (-ffunction-sections).

Auf die Größe der .o Dateien kommt es aber nicht an, sicher, dass der 
Code nicht passt?

edit: Sollte das wirklich nicht passen: Nimm einfach 'nen größeren 
STM32.

Gruß
Lasse

von Olaf (Gast)


Lesenswert?

> Gerne möchte ich wissen, welcher Programmteil besonders viel
> Flashspeicher verbraucht.

Bitte ld dir ein mapfile zu erzeugen und liess es dir durch.

-Map=mapfile.txt

Olaf

von Uwe (Gast)


Lesenswert?

Hallo,

vielen Dank für die Info.
In der Makefile ist schon alles drin.

Wie genau ist den die *.map Datei aufgebaut.

- Archive member included because of file (symbol)
- Allocating common symbols
   = Alle globalen Variablen
- Discarded input sections
   = Alle gelöschten Funktionen
- Memory Configuration
- Linker script and memory map z.B.
    = Alle Funktionen
1
 .text.Delay    0x08000148       0x14 ROM_RUN/main.o
2
                0x08000148                Delay
    = und alle Variablen
1
     .data.TxBuffer2
2
                0x20000090       0x12 ROM_RUN/main.o
3
                0x20000090                TxBuffer2
- Ganz viele Einträge mit .debug...
    = ??
- .ARM.attributes
    = ??
- Cross Reference Table
    =  Zuweisung Funktionen und Dateien

Wie genau könnte ich denn damit den Code optimieren?

STM kann ich leider nicht wechseln, Kleinserie ist bereits
fertig. Drauf passt es schon noch, aber nur 4kb sind noch
frei. 20kb werden bestimmt noch kommen.

Viele Grüße
Uwe

von holger (Gast)


Lesenswert?

>Wie genau könnte ich denn damit den Code optimieren?

Welchen Code? Den, den keiner sehen kann?

Allgemeine Tips:
Unnötig aufgeblähte Strings eindampfen.
Eventuell nicht mehr benötigte Debug Strings entsorgen.
Alle Datentypen nur so gross wie nötig.

Wenn der Optimizer nichts mehr zu optimieren hat,
dann halt den nächstgrößeren uC nehmen oder externen
Speicher in Betracht ziehen (z.B. für Strings).

von Uwe (Gast)


Lesenswert?

Hallo,

Vielen Dank, geht mir einfach nur darum, wie ich ahand
der map file erkenne, welcher Teil des Programms welchen
Speicherplatz belegt.

Dann könnte ich zielgerichtet an diesen Teilen arbeiten.
Gibt es hier vielleicht schon eine Analyse Tool für Map
File oder ähnliches?

Bei diesen Infos:

Uwe schrieb:
> - Linker script and memory map z.B.
>     .text.Delay    0x08000148       0x14 ROM_RUN/main.o
>                 0x08000148                Delay
>     .data.TxBuffer2
>                 0x20000090       0x12 ROM_RUN/main.o
>                 0x20000090                TxBuffer2

z.B. 0x14 - Delay Funktion verbraucht 20 bytes (0x14)? und
wir gespeichert in bei der Adresse 0x08000148 ???
Variable TxBuffer2 18kb?

Danke & Viele Grüße
Uwe

von geb (Gast)


Lesenswert?

53kB für die Timerlib kommen mir schon sehr viel vor. Da wär es wohl zu 
überlegen, ob man nicht selbst die Register beschreibt. Generell ist die 
STM32 Lib zwar recht komfortabel, aber doch einigermaßen aufgebläht und 
wenn man sie außerhalb von Initialisierungen betreibt auch meist zu 
langsam.

Grüße

von Uwe (Gast)


Lesenswert?

Hallo,

Danke, Timer Funktionen werden ich wohl mal ersetzen.

Was ich noch nicht ganz verstehe, im GCC Tutorial steht
1
Speicherverbrauch nach Funktionen aufschlüsseln
2
3
    * Map File anschauen
4
          o dort sind alle globalen und statischen Variablen enthalten
5
          o Aus der Differenz der Anfangsadressen kann man die  Programmgröße der Funktionen berechnen

Ausschnitt meiner *.map File

Funktionen:
1
                0x20005000                _estack = 0x20005000
2
                0x08010000                _seeprom_emul = 0x8010000
3
                0x00000100                _Minimum_Stack_Size = 0x100
4
5
.text           0x08000000     0xa340
6
                0x08000000                . = ALIGN (0x4)
7
 *(.isr_vectorsrom)
8
 .isr_vectorsrom
9
                0x08000000      0x10c ROM_RUN/startup_stm32f10x_md.o
10
                0x08000000                g_pfnVectors
11
                0x0800010c                . = ALIGN (0x4)
12
 *(.text* .stub .gnu.linkonce.t.*)
13
 .text.__enable_irq
14
                0x0800010c        0x4 ROM_RUN/main.o
15
 .text.__disable_irq
16
                0x08000110        0x4 ROM_RUN/main.o
17
 .text.NVIC_SetPriority
18
                0x08000114       0x2c ROM_RUN/main.o
19
 .text.positiv  0x08000140        0x8 ROM_RUN/main.o
20
                0x08000140                positiv
21
 .text.Delay    0x08000148       0x14 ROM_RUN/main.o
22
                0x08000148                Delay
23
 .text.TIM3_IRQHandler
24
                0x0800015c       0x74 ROM_RUN/main.o
25
                0x0800015c                TIM3_IRQHandler
26
 .text.TIM4_IRQHandler
27
                0x080001d0       0xf0 ROM_RUN/main.o
28
                0x080001d0                TIM4_IRQHandler

Aus der Auflistung der Variablen:
1
 .bss.tmp1.6175
2
                0x2000070c        0x4 ROM_RUN/main.o
3
 .bss.file      0x20000710      0x224 ROM_RUN/log_to_sd.o
4
 .bss.logdata_schreibvorgang
5
                0x20000934        0x1 ROM_RUN/log_to_sd.o
6
 *fill*         0x20000935        0x3 00
7
 .bss.fatfs     0x20000938      0x230 ROM_RUN/log_to_sd.o
8
 .bss.fileinfo  0x20000b68       0x18 ROM_RUN/log_to_sd.o
9
 .bss.dir       0x20000b80       0x1c ROM_RUN/log_to_sd.o
10
 .bss.logdata_sicherung
11
                0x20000b9c        0x1 ROM_RUN/log_to_sd.o
12
 *fill*         0x20000b9d        0x1 00
13
 .bss.Fsid      0x20000b9e        0x2 ROM_RUN/ff.o
14
 .bss.FatFs     0x20000ba0        0x4 ROM_RUN/ff.o
15
 .bss.Timer1    0x20000ba4        0x4 ROM_RUN/sd_spi_stm32.o
16
 .bss.Timer2    0x20000ba8        0x4 ROM_RUN/sd_spi_stm32.o
17
 .bss.CardType  0x20000bac        0x1 ROM_RUN/sd_spi_stm32.o
18
 *fill*         0x20000bad        0x3 00
19
 .bss.pv.3724   0x20000bb0        0x4 ROM_RUN/sd_spi_stm32.o

Versteh ich das richtig, die Auflistung ist immer
.Name   Speicheradresse(?)      Speichergröße     Dateipfad
?

Alles 32 Bit Integer werden hier zumindest als 0x4 angegeben.
Das erkenne ich schon mal. Nur gibt das keinen Sinn. (4 für 32bit)
Die Differenz der Speicheadresse ergibt hier auch 4.

Danke
Uwe

von Lasse S. (cowz) Benutzerseite


Lesenswert?

4 Byte für 32Bit sind doch noch innerhalb der Toleranzgrenzen ;)

von Uwe (Gast)


Lesenswert?

Hallo,

Gibt es niemanden, der weiß wie man eine *.map File auswerten kann?
Ich finde hierzu auch nichts im Netz.

Viele Grüße
Uwe

von Uwe (Gast)


Lesenswert?

Hallo,

hab grad rausgefunden, das math.h (würde ich diese ersetzen) allein
8,6kb bringen würde. (verwendet wird - nur - cos sqrt atan2)

Viele Grüße
Uwe

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.