Ich bin gerade dabei in die ARM einzusteigen, genauer gesagt
ATSAMD20E14, und würde in dem Thread hier gerne die eine oder andere
anfallende Frage stellen.
Und zwar:
Beim Kompilieren eines leeren Projektes in ATMEL Studio bekomme ich
folgendes:
1
ProgramMemoryUsage:1984bytes12,1%Full
2
DataMemoryUsage:1624bytes79,3%Full
Etwas deprimierend wenn der Speicher gleich zu Beginn schon voll ist :).
Was füllt den da außer dem Startup Code den Speicher?
F.
F. schrieb:> Was füllt den da außer dem Startup Code den Speicher?
Das ASF mit den ursprünglich mal für größere ARM (SAM4) gedachten
structs. Atmel hält es scheinbar nicht für nötig für die M0 ein ASF lite
bereitzustellen. Oder man will die AVR vorher noch abverkaufen :-)
Also SAMD20 entweder direkt mit Registerzugriff programmieren ohne ASF.
Oder z.B. zu NXP wechseln, hier gibt es eine Standard-CMSIS für M3, M4
und für M0 eine Version die sogar mit 1k RAM läuft.
Meinst du die in den header-files(hier mal vom Timer)? Solange ich
nichts z.B. vom Typ TC_CTRLA_Type anlege sollten die ja nichts belegen
und wenn ich z.B. "__ASSEMBLY__" definiere ändert sich auch nichts
F.
F. schrieb:> Solange ich nichts ... anlege sollten die ja nichts belegen
system_init() legt aber schon reichlich an:
Beitrag "Erste Schritte mit ARM SAMD20"
Moby schrieb im Beitrag #3847549:
> Ach diese Träumereien immer.
Das war ein Scherz! Trotzdem kann man sich fragen, warum Atmel überhaupt
kleine ARM rausbringt, wenn die SW-Unterstützung so aussieht, und
Beispiele zur direkten Programmierung gibt es ja auch nicht, kann man
sich selber im Manual zusammen suchen.
Zeig doch einfach das Mapfile wenn du es selbst schon nicht lesen magst.
Alles andere ist doch nur wildes raten.
Die Ursache für den hohen RAM Bedarf kann der Stack sein (erste
Antwort), die libc einer älteren Toolchain oder ein Heap für malloc()
und Co.
Fast 2kB für Startup klingt eher nach abgeschalteter Optimierung. So
viel Speicher ist selbst für die ST Lib ungewöhnlich. Bei einem "leeren"
Projekt versteht sich. Ansonsten schlägt die schon ordentlich zu.
was schon mal nicht schlecht ist. Ohne den Startup Code brauchen .bss
und .text Segment jedoch immer noch je ca.500byte. Außerdem soll die
newlib-nano angeblich noch zu buggy sein.
Wie wärs, wenn du den ganzen Lib Kram weglässt, und nur startup uns
system hernimmst, in einem neuen, frischen Projekt?
Ohne die DriverLibs sollte im Chip dann noch Platz für dein Programm
sein :-)
A. K. schrieb:> Vielleicht wird der Stack fest> alloziert.
Hmmm. Also mit -nodefaultlibs -nostdlib bleiben 516byte im bss was genau
der größe des Stacks entspricht - also wird der Stack in der Tat fest
alloziert?
F.
Anscheinend löst das Linkerflag
–nostartfiles
(Do not use the standard system startup files when linking. The standard
system libraries are used normally, unless -nostdlib or -nodefaultlibs
is used.)
alle Probleme. Diese "standard system startup files" nutzen laut mapfile
die libc was zu hohem Speicherbedarf führt. Allerdings funktioniert die
1
__libc_init_array();
in der startup_samd20.c damit auch nicht mehr.
Anhang:
1. Mapfile: ohne flag -> Speicherbedarf hoch
2. Mapfile: -nostartfiles -> Speicherbedarf wie er sein soll :)
Nun die Frage ob diese standard system startup files bzw. die
__libc_init_array(); relevant sind?
F.
Das wird für C++ gebraucht damit die Konstruktoren korrekt funktionieren
bzw. überhaupt erst aufgerufen werden.
D.h. je nachdem wie das bei der Toolchain implementiert ist, werden
Konstruktoren gar nicht aufgerufen oder evtl. vorhandene
Initialisierungslisten werden ignoriert. Sofern sich das Programm
überhaupt linken läßt.