Forum: Mikrocontroller und Digitale Elektronik Unrealistische Recourcenauslastung bei leerem Projekt


von F. K. (superpcfan)


Angehängte Dateien:

Lesenswert?

Ich habe mir vom Microchip Studio 7 ein leeres GCC C Projekt für einen 
ATSAMC21E15A anlegen lassen. Dabei war ich irritiert bis geschockt, wie 
viele Systemrecourcen von einem leeren Projekt aufgefressen werden.

Die 2kB Flash könnte ich noch halbwegs verstehen für Reset 
"rumgeplänkel", auch wenn ich das schon arg viel finde alleine für das 
resetten, wenn der Flash eh nur 32kB groß ist.

Aber die 53% SRAM schießen den Vogel ab. Für den Fall, dass das ein 
Anzeigefehler wäre, habe ich einfach mal versucht 3kB RAM zu 
deklarieren. Der compiler hat direkt gemeckert, dass das da nicht rein 
passt....

Was macht GCC da?! Das kann doch nicht sein?! (siehe Anhang)
Muss ich noch irgendwo rumfummeln, damit GCC weiß was es tun soll?

: Gesperrt durch Moderator
von Oliver S. (oliverso)


Lesenswert?

F. K. schrieb:
> Was macht GCC da?!

Vermutlich compiliert und linkt der einfach all das zusammen, was an 
deinem Programm zu compilieren und linken ist. Auch wenn es ja nur 
wenige Zeilen im main () sind, sagt das nichts darüber aus, was sich 
dahinter verbirgt.

Allerdings dürfte eine release-Build mit eingeschalteter Optimierung das 
Problem entschärfen.

Oliver

von F. K. (superpcfan)


Lesenswert?

Also das hatte ich bisher noch bei keinem Projekt oder Controller. Ich 
musste weder auf Release umstellen noch an der Optimierung rumfummeln.

Ich habe alle Optimierungsstufen mit Debugbuild und Releasebuild 
durchprobiert. Das Ergebnis ist immer dasselbe wie im Screenshot.
Daran liegt es wohl nicht.

von Harald K. (kirnbichler)


Lesenswert?

Man könnte ins Mapfile sehen, um rauszufinden, wo der Speicher bleibt.

von Ingo L. (corrtexx)


Lesenswert?

Lass mal die Systeminit weg ;)

von F. K. (superpcfan)


Angehängte Dateien:

Lesenswert?

Ingo L. schrieb:
> Lass mal die Systeminit weg ;)

Hab ich schon, ändert leider auch nix

Das MapFile ist im Anhang. Ich habe leider keine Erfahrung wie man das 
lesen muss.

von Harald K. (kirnbichler)


Lesenswert?

F. K. schrieb:
> Aber die 53% SRAM schießen den Vogel ab. Für den Fall, dass das ein
> Anzeigefehler wäre, habe ich einfach mal versucht 3kB RAM zu
> deklarieren.

Wie groß hast Du denn Stack und Heap konfiguriert?

von F. K. (superpcfan)


Lesenswert?

F. K. schrieb:
> Muss ich noch irgendwo rumfummeln, damit GCC weiß was es tun soll?

Harald K. schrieb:
> Wie groß hast Du denn Stack und Heap konfiguriert?

Jetzt kommen wir dem Problem näher! Bei diesem Controller muss ich den 
Stack definieren? Danach such ich mal!

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

F. K. schrieb:
> Dabei war ich irritiert bis geschockt, wie viele Systemrecourcen von
> einem leeren Projekt aufgefressen werden.
Das Projekt ist ja auch nicht "leer", sondern es hinterlässt ist ein 
komplett initialisiertes System, wenn SystemInit() ausgeführt wurde.

Was kommt raus, wenn du das SystemInit() weglässt?

F. K. schrieb:
> Also das hatte ich bisher noch bei keinem Projekt oder Controller.
Auf welche Controller und welche Toolchains beziehst du dich da?

: Bearbeitet durch Moderator
von Ingo L. (corrtexx)


Lesenswert?

Lothar M. schrieb:
> Was kommt raus, wenn du das SystemInit() weglässt?

F. K. schrieb:
> Ingo L. schrieb:
>> Lass mal die Systeminit weg ;)
>
> Hab ich schon, ändert leider auch nix
Kann ich garnich glauben, dass sich nichts ändert...

von F. K. (superpcfan)


Angehängte Dateien:

Lesenswert?

Ingo L. schrieb:
> Kann ich garnich glauben, dass sich nichts ändert...

Siehe Anhang :)

von Oliver S. (oliverso)


Lesenswert?

Dann lass das #include "sam.h" auch noch weg.

Olivr

von Ingo L. (corrtexx)


Lesenswert?

F. K. schrieb:
> Siehe Anhang :)
Krass, dann kann es ja nur noch an der sam.h liegen...

von Harald K. (kirnbichler)


Lesenswert?

F. K. schrieb:
> Jetzt kommen wir dem Problem näher! Bei diesem Controller muss ich den
> Stack definieren?

Bei welchem denn nicht?

von F. K. (superpcfan)


Angehängte Dateien:

Lesenswert?

Nope, auch das ändert nix (siehe Anhang)

von F. K. (superpcfan)


Lesenswert?

Harald K. schrieb:
> Bei welchem denn nicht?

Lothar M. schrieb:
> F. K. schrieb:
>> Also das hatte ich bisher noch bei keinem Projekt oder Controller.
> Auf welche Controller und welche Toolchains beziehst du dich da?

Ich habe AtTinys, AtMegas, AtxMegas und AtSams in C und Assembler mit 
GCC programmiert und musste bisher nie am Stack rumspielen. Das war 
immer geeignet voreingestellt.

von Ingo L. (corrtexx)


Lesenswert?

F. K. schrieb:
> Nope, auch das ändert nix (siehe Anhang)
Haste mal n Rebuild mit Clean vorher gemacht? Ich kanns eigentlich nicht 
verstehen...

von F. K. (superpcfan)


Lesenswert?

Ingo L. schrieb:
> F. K. schrieb:
>> Nope, auch das ändert nix (siehe Anhang)
> Haste mal n Rebuild mit Clean vorher gemacht? Ich kanns eigentlich nicht
> verstehen...

Jup, Clean und Rebuild auf Projekt und Solution Ebene ändert auch 
nichts.

von Harald K. (kirnbichler)


Lesenswert?

F. K. schrieb:
> Das war immer geeignet voreingestellt.

Ah, "geeignet". Vielleicht ist hier der Stack/Heap einfach größer 
eingestellt?

Und hast Du zwischenzeitlich mal ins Mapfile gesehen?

von Ingo L. (corrtexx)


Lesenswert?

Schau mal in den Assembler, da siehste eigentlich gleich was los ist, 
irgendwo muss der Code ja sein...

von F. K. (superpcfan)


Lesenswert?

Im Assembler File ändert sich nichts, egal was ich in der Main 
auskommentiere.
Deswegen habe ich den verdacht, das der Compiler "irgendeine andere 
main.c" verwendet, als die die im Projektexplorer gelistet (und von mir 
geöffnet) ist.
Nur wo die sein soll, weiß ich noch nicht.

Für das MapFile muss ich erstmal zu lesen verstehen. Das dauert noch nen 
Moment.

von Harald K. (kirnbichler)


Lesenswert?

Ingo L. schrieb:
> Schau mal in den Assembler

Im Assemblerlisting wird nur der Code des übersetzten C-Moduls 
drinstehen, also nichts relevantes.
Weder der verwendete Startupcode noch der Code der gelinkten Libaries 
wird da zu finden sein.

Mapfile. Notfalls hier als Anhang posten.

von Ingo L. (corrtexx)


Lesenswert?

Harald K. schrieb:
> Mapfile. Notfalls hier als Anhang posten.
Hat er ja gemacht

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

F. K. schrieb:
> Nope, auch das ändert nix (siehe Anhang)
Dann liegts am Startup-Code, der zur main() gehört. Dieser Begriff 
taucht im map-File auch sehr oft auf.

Harald K. schrieb:
> Und hast Du zwischenzeitlich mal ins Mapfile gesehen?
Da findet sich schon mal die Erklärung fürs RAM (der Stack nimmt sich 
0x400 = 1024 Bytes). Und dort findet man viele Device_Startup Einträge.

: Bearbeitet durch Moderator
von F. K. (superpcfan)


Lesenswert?

Harald K. schrieb:
> Im Assemblerlisting wird nur der Code...

Also ich kann sagen, dass im AssemblerFile die SystemInit() drin bleibt, 
selbst wenn ich "SystemInit" und "sam.h" in der Main auskommentiere.

Als Gegentest habe ich in die Main mal eine Funktion eingefügt, um zu 
schauen ob das überhaupt das AssemblerFile ändert. -> jup!

Wo kommt der StartUp Code denn her, wenn ich aus der Main alles 
auskommentiere?

von Harald K. (kirnbichler)


Lesenswert?

Ingo L. schrieb:
> Hat er ja gemacht

Muss ich übersehen haben.

Oh, und das ist ... sehr schön akademisch.

Aber, was vielleicht schon ein Indiz ist, ist dieser Abschnitt hier:

(Pfade der Lesbarbeit halber gekürzt)
1
Linker script and memory map
2
3
LOAD /arm-none-eabi/6.3.1/thumb/v6-m/crti.o
4
LOAD /arm-none-eabi/6.3.1/thumb/v6-m/crtbegin.o
5
LOAD /arm-none-eabi/lib/thumb/v6-m/crt0.o
6
LOAD Device_Startup/startup_samc21.o
7
LOAD Device_Startup/system_samc21.o
8
LOAD main.o
9
START GROUP
10
LOAD /arm-none-eabi/lib/thumb/v6-m\libm.a
11
END GROUP
12
START GROUP
13
LOAD /arm-none-eabi/6.3.1/thumb/v6-m\libgcc.a
14
LOAD /arm-none-eabi/lib/thumb/v6-m\libc.a
15
END GROUP
16
LOAD /arm-none-eabi/6.3.1/thumb/v6-m/crtend.o
17
LOAD /arm-none-eabi/6.3.1/thumb/v6-m/crtn.o

Neben dem Startupcode (crt*.o) und dem Spezialkram für die 
Initialsierung (startup_samc21/system_samc21) werden hier also noch 
libgcc, libc und libm gelinkt.

Warum um alles in der Welt libm?

: Bearbeitet durch User
von F. K. (superpcfan)


Lesenswert?

Harald K. schrieb:
> Warum um alles in der Welt libm?

Ich habe dem Microchip Studio nur gesagt ein GCC C Projekt für den 
ATSAMC21E15A anzulegen.

Was das Studio da treibt versuche ich gerade zu verstehen :)

von Ingo L. (corrtexx)


Lesenswert?

Harald K. schrieb:
> Warum um alles in der Welt libm?
Offensichtlich benötigt der Startup die, warum auch immer... Aber dann 
braucht man sich auch nicht wundern, dass schon soviel belegt ist.

F. K. schrieb:
> Also ich kann sagen, dass im AssemblerFile die SystemInit() drin bleibt,
> selbst wenn ich "SystemInit" und "sam.h" in der Main auskommentiere.
Seltsam

von Hugo H. (hugo_hu)


Lesenswert?

F. K. schrieb:
> Ich habe dem Microchip Studio nur gesagt ein GCC C Projekt für den
> ATSAMC21E15A anzulegen.

Du spielst doch auch mit dem ASF - oder sehe ich das falsch? Ist da noch 
etwas aktiviert?

Beitrag #7447042 wurde von einem Moderator gelöscht.
Beitrag #7447044 wurde von einem Moderator gelöscht.
von Oliver S. (oliverso)


Lesenswert?

Harald K. schrieb:
> Warum um alles in der Welt libm?

Na ja, weil man die vielleicht auch mal braucht, und sich ansonsten 
jemand beschwert, wenn die nicht defaultmässig dazugelinkt wird?

All diese Systemlibs "verbrauchen" aber keinen Speicherplatz, wenn man 
nichts daraus aufruft.

Oliver

von F. K. (superpcfan)


Lesenswert?

Hugo H. schrieb:
> Du spielst doch auch mit dem ASF - oder sehe ich das falsch? Ist da noch
> etwas aktiviert?

Ich weiß nicht genau was du meinst. Das Projekt ist als C Projekt 
angelegt. Etwas anderes habe ich nicht angeklickt. Wo soll etwas 
aktiviert sein?

von F. K. (superpcfan)


Lesenswert?

Also die Einstellung für die Stackgröße habe ich nun gefunden und 
angepasst...in einer Datei die "Flash" heißt. :P Damit habe ich schon 
15% Ram freibekommen.

Jetzt sind aber immer noch 1,3kB vom Ram belegt. Abzüglich meines Stacks 
sind das immer noch etwa 1kB (25%) die für "nichts" schon belegt sind.
Gibt es noch einen anderen großen Brocken? Ich kann mir nicht 
vorstellen, dass die Libs und Includes schon bevor sie genutzt werden 
den Ram in dieser Größenordnung für nichts belegen?!

von Falk B. (falk)


Lesenswert?

F. K. schrieb:
> Jetzt sind aber immer noch 1,3kB vom Ram belegt. Abzüglich meines Stacks
> sind das immer noch etwa 1kB (25%) die für "nichts" schon belegt sind.

Hat das Ding USB? Vielleicht wird das "unsichtbar" initialisiert und das 
1kB wird dafür als Puffer benötigt.

von Hugo H. (hugo_hu)


Lesenswert?

F. K. schrieb:
> Ich weiß nicht genau was du meinst.

Ich habe gesehen, dass Du Dich in anderen Threads mit dem ASF 
beschäftigt hast und dachte, Du könntest das auch hier aktiv haben. Ist 
wohl nicht so ... und hat wohl mit SAM-speziellen Voreinstellungen 
(Startup etc.) zu tun.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

F. K. schrieb:
> Jetzt sind aber immer noch 1,3kB vom Ram belegt
Mir ist da die Zeile aufgefallen:
1
.data.impure_data
2
                0x20000008      0x428 c:/ ... libc.a(lib_a-impure.o)
Und ich habe damit den Beitrag "Speicherverbrauch der libc optimieren?" 
gefunden.

: Bearbeitet durch Moderator
von F. K. (superpcfan)


Lesenswert?

Falk B. schrieb:
> Hat das Ding USB? Vielleicht wird das "unsichtbar" initialisiert und das
> 1kB wird dafür als Puffer benötigt.

Nein, USB hat er nicht. Ich habe stattdessen versucht die includes für 
Can auszukommentieren. Hat nichts gebracht.

Lothar M. schrieb:
> Und ich habe damit den Beitrag "Speicherverbrauch der libc optimieren?"
> gefunden.

Der Tip sieht vielversprechend aus. Das schient hier das gleiche Problem 
zu sein. Jetzt muss ich mal schauen wie ich die libc dazu überreden 
kann, mir den Speicher zurückzugeben. :)

von Adam P. (adamap)


Lesenswert?

F. K. schrieb:
> Lothar M. schrieb:
>> Und ich habe damit den Beitrag "Speicherverbrauch der libc optimieren?"
>> gefunden.
>
> Der Tip sieht vielversprechend aus. Das schient hier das gleiche Problem
> zu sein. Jetzt muss ich mal schauen wie ich die libc dazu überreden
> kann, mir den Speicher zurückzugeben. :)

Also laut dem Beitrag in den Linker Flags einfach hinzufügen:
--specs=nano.specs

Dann komme ich auf 32 bytes (0,8%). Testweise mit Stack = 0 Byte.

von F. K. (superpcfan)


Lesenswert?

Ich suche gerade die richtige Stelle. Unter "Linker - Miscellaneous", 
hat GCC die Option "--specs=nano.specs" nicht haben wollen. :)

von F. K. (superpcfan)


Lesenswert?

Hab Sie, ist unter Linker - Generals sogar eine Checkbox, die im 
hintergrund "--specs=nano.specs" aktiviert.

Flash 1,5% und RAM 7%...das klingt logisch. :)

Danke euch allen.

von Adam P. (adamap)


Angehängte Dateien:

Lesenswert?

F. K. schrieb:
> Ich suche gerade die richtige Stelle. Unter "Linker - Miscellaneous",
> hat GCC die Option "--specs=nano.specs" nicht haben wollen. :)

Bei mir tuts.

F. K. schrieb:
> Hab Sie, ist unter Linker - Generals sogar eine Checkbox, die im
> hintergrund "--specs=nano.specs" aktiviert.

Tatsache, das hatte ich gar net gesehen.

: Bearbeitet durch User
von Ingo L. (corrtexx)


Lesenswert?

F. K. schrieb:
> Flash 1,5% und RAM 7%...das klingt logisch
Damit kann man doch gut leben...

Beitrag #7447253 wurde von einem Moderator gelöscht.
Beitrag #7447274 wurde von einem Moderator gelöscht.
Beitrag #7447294 wurde von einem Moderator gelöscht.
Beitrag #7447321 wurde von einem Moderator gelöscht.
Beitrag #7448303 wurde von einem Moderator gelöscht.
Beitrag #7450099 wurde von einem Moderator gelöscht.
Beitrag #7450155 wurde von einem Moderator gelöscht.
Beitrag #7450170 wurde von einem Moderator gelöscht.
Beitrag #7450198 wurde von einem Moderator gelöscht.
Beitrag #7450225 wurde von einem Moderator gelöscht.
Beitrag #7450273 wurde von einem Moderator gelöscht.
Beitrag #7450317 wurde von einem Moderator gelöscht.
Beitrag #7450379 wurde von einem Moderator gelöscht.
Beitrag #7450545 wurde von einem Moderator gelöscht.
Beitrag #7450573 wurde von einem Moderator gelöscht.
Beitrag #7450587 wurde von einem Moderator gelöscht.
Beitrag #7450618 wurde von einem Moderator gelöscht.
Beitrag #7450655 wurde von einem Moderator gelöscht.
Beitrag #7450678 wurde von einem Moderator gelöscht.
Beitrag #7450687 wurde von einem Moderator gelöscht.
Beitrag #7450693 wurde von einem Moderator gelöscht.
Beitrag #7450714 wurde von einem Moderator gelöscht.
Beitrag #7450746 wurde von einem Moderator gelöscht.
Beitrag #7450959 wurde von einem Moderator gelöscht.
Beitrag #7450961 wurde von einem Moderator gelöscht.
Beitrag #7450965 wurde von einem Moderator gelöscht.
von Rbx (rcx)


Lesenswert?

Zwei Probleme hier:

1) Erreichbarkeit? -> wohl eher null
2) Thema selbst aber spannend
3) nun folgt aus 1) dass 2 diskutieren eher schlecht geht (+ 
Kollateralschäden)

Vom technischen her:
Wenn man Code einsparen möchte, war bei C schon immer ein Hexeditor die 
erste Wahl. Das ist aber schon lange her, und da könnte man auch mal 
fragen, wieso kann der Compiler den unnützen Hintergrund nicht selber 
wegknipsen?

Und bei ARM: Assembler da ist wohl eher für eingeschlafene Füsse, 
abtörnend langweilig, wirklich sehr uninspirierend, und dann noch andere 
Sachen, teils undokumentierter Hintergrund, teils Produktvielfalt: 
Welcher ARM, welches Betriebssystem, welcher Workflow?

Was dann auf die eigentliche Frage hinausfläuft:
Welches sind die gängigen Workflows?

Beitrag #7450978 wurde von einem Moderator gelöscht.
Beitrag #7450981 wurde von einem Moderator gelöscht.
Beitrag #7450997 wurde von einem Moderator gelöscht.
Beitrag #7451017 wurde von einem Moderator gelöscht.
Beitrag #7451030 wurde von einem Moderator gelöscht.
Beitrag #7451086 wurde von einem Moderator gelöscht.
Beitrag #7451101 wurde von einem Moderator gelöscht.
Beitrag #7451126 wurde von einem Moderator gelöscht.
von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Moby, ich rate dir nochmals dringend, zum Arzt zu gehen. Du machst dich 
kaputt. Nicht, dass mich das irgendwie stören würde. Aber wenn dir wer 
bei deinem Problem hilft, dann ist hier endlich Ruhe.

: Bearbeitet durch Moderator
Dieser Beitrag ist gesperrt und kann nicht beantwortet werden.