Unrealistische Recourcenauslastung bei leerem Projekt

Gast #7446941
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?

Angehängte Dateien:
#7446946
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

Gast #7446951
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.

Moderator (Firma: Titel) Persönliche Seite #7446971
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?

Gast #7447005
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.

Gast #7447023
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.

Moderator (Firma: Titel) Persönliche Seite #7447028
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.

Gast #7447029
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?

#7447032
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?

Beitrag #7447042 wurde von einem Moderator gelöscht.
Beitrag #7447044 wurde von einem Moderator gelöscht.
Gast #7447075
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?!

Gast #7447106
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. :)

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

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.
#7450975
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.
Dieser Beitrag ist gesperrt und kann nicht beantwortet werden.