ARM Einstieg - Fragethread

Gast #3847464
Lesenswert?

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
Program Memory Usage   :  1984 bytes   12,1 % Full
2
Data Memory Usage     :  1624 bytes   79,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.
Gast #3847534
Lesenswert?

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.
Gast #3847733
Lesenswert?

Lothar schrieb:
> Das ASF mit den ursprünglich mal für größere ARM (SAM4) gedachten
> structs.
1
 /* -------- TC_CTRLA : (TC Offset: 0x00) (R/W 16) Control A -------- */
2
#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__))
3
typedef union {
4
  struct {
5
    uint16_t SWRST:1;          /*!< bit:      0  Software Reset                     */
6
    uint16_t ENABLE:1;         /*!< bit:      1  Enable                             */
7
    uint16_t MODE:2;           /*!< bit:  2.. 3  TC Mode                            */
8
    uint16_t :1;               /*!< bit:      4  Reserved                           */
9
    uint16_t WAVEGEN:2;        /*!< bit:  5.. 6  Waveform Generation Operation      */
10
    uint16_t :1;               /*!< bit:      7  Reserved                           */
11
    uint16_t PRESCALER:3;      /*!< bit:  8..10  Prescaler                          */
12
    uint16_t RUNSTDBY:1;       /*!< bit:     11  Run in Standby                     */
13
    uint16_t PRESCSYNC:2;      /*!< bit: 12..13  Prescaler and Counter Synchronization */
14
    uint16_t :2;               /*!< bit: 14..15  Reserved                           */
15
  } bit;                       /*!< Structure used for bit  access                  */
16
  uint16_t reg;                /*!< Type      used for register access              */
17
} TC_CTRLA_Type;
18
#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */
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.
Gast #3847803
Lesenswert?

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.
Gast #3847837
Lesenswert?

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.
Gast #3848574
Lesenswert?

Ich habe jetzt die Compiler/Linker Flags gemäß dieses Artikels 
http://www.mikrocontroller.net/articles/ARM_GCC#Code-Gr.C3.B6.C3.9Fe_optimieren 
hier gesetzt, was jedoch kaum Änderung bringt.

Wenn ich im Linker Menü die newlib-nano wähle, sinkt der Speicherbedarf 
auf
1
Program Memory Usage   :  600 bytes   3,7 % Full
2
Data Memory Usage     :  544 bytes   26,6 % Full
 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.
Persönliche Seite #3848603
Lesenswert?

F. schrieb:
> Wenn ich im Linker Menü die newlib-nano wähle, sinkt der Speicherbedarf
> auf
1
Program Memory Usage   :  600 bytes   3,7 % Full
2
> Data Memory Usage     :  544 bytes   26,6 % Full

ATSAMD20E14: 16k Flash, 2k RAM

gerad mal schnell getestet:
- armcc Lib, 0x100 Bytes Stack:
  Program Size: Code=348 RO-data=192 RW-data=4 ZI-data=356

- armcc MicroLib, 0x100 Bytes Stack:
  Program Size: Code=144 RO-data=192 RW-data=4 ZI-data=260
Gast #3849072
Lesenswert?

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.
Angehängte Dateien:
Gast #3849237
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren