Forum: Mikrocontroller und Digitale Elektronik ATSAMD09C13A start


von Alex Richard Moll (Gast)


Lesenswert?

Servus,

ich möchte mich von den 8Bit AVR verabschieden und in die Welt der ARM 
einsteigen. Es gibt nur einen Grund da alle meine Anwendungen super 
unter AVR zurecht kommen, meine Gier nach neuen Sachen.

Gibt es dazu gute Tutorials ohne Atmel Start oder ASF? Nach einfachem 
Übersetzen in Atmel Studio 7 ohne von mir eingefügten Code sind 25% des 
Flash und RAM belegt, ich möchte wissen warum. Also einfach alles.

Gruß
Alex

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Alex Richard Moll schrieb:
> ich möchte wissen warum.
1
arm-none-eabi-objdump --print-size --size-sort <name der ELF-Datei>

zeigt dir das.

Atmel START ist leider manchmal etwas aufgeblasen.

Weiß nicht, was der SAMD09 so an Ressourcen hat, mehr oder weniger der 
Standard bei diesen kleinen Atmel-ARMs (also das, was bei AVR der 
ATmega328 ist) wäre dort der SAMD21. Die sind gar nicht mal so klein.

Habe jetzt gerade gesehen, für nur wenig mehr Geld bekommt man schon ein 
SAME51 Curiosity Nano Board, das ist schon ein ziemlicher Bolide (1 MiB 
Flash, 256 KiB RAM).

: Bearbeitet durch Moderator
von Alex Richard Moll (Gast)


Angehängte Dateien:

Lesenswert?

Jörg W. schrieb:
> zeigt dir das.

Schlecht Ausgedrückt von mir.. Im .lss file sehe ich natürlich was 
gemacht wird und was den Speicher belegt, hätte eher sagen sollen was 
nützt das? Gibts da gute Erklärungen? Auch zum Programmieren selbst, 
habe es noch nicht mal geschafft eine LED zum Blinken zu bringen.. Denke 
das liegt an meiner Falschen Clock Einstellung..

Jörg W. schrieb:
> Habe jetzt gerade gesehen, für nur wenig mehr Geld bekommt man schon ein
> SAME51 Curiosity Nano Board, das ist schon ein ziemlicher Bolide (1 MiB
> Flash, 256 KiB RAM).

Das ist jetzt eher weniger das Problem, aktuell reichen mir die 8kb zum 
Testen. Hab mir einen Sockel gekauft, mit dem man das ganze schön auf 
ein Breadboard bekommt um es dann mit einem Atmel-ICE zu Flashn, dass 
funktioniert auch soweit. Sogar das debuggen (hier geht dann die LED 
sogar an?).
1
int main(void)
2
{
3
    /* Initialize the SAM system */
4
    SystemInit();
5
6
  PM->APBBMASK.reg |= PM_APBBMASK_PORT;
7
    PORT->Group[0].DIRSET.bit.DIRSET = PORT_PA05;
8
9
    while (1)
10
    {
11
      PORT->Group[0].OUTSET.bit.OUTSET = PORT_PA05;
12
    for(uint16_t x = 0; x < 0xFFFE; x++);
13
    PORT->Group[0].OUTCLR.bit.OUTCLR = PORT_PA05;
14
    for(uint16_t x = 0; x < 0xFFFE; x++);
15
    }
16
}

Hab mal das .lss file angehängt, falls es jemanden einfach mal 
Interessiert.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Ich mag diese Disassemblies nicht so, viel Blahblah, wobei die 
eigentlichen Kernaussagen im Wortreichtum untergehen. Häng doch mal 
bitte das ELF-File an. Dann kann ich da selbst mit objdump reinschauen.

8 KiB sind für einen ARM allerdings wirklich wenig. In der AVR-Welt wäre 
das wohl in etwa, wenn man seine Experimente auf einen ATtiny10 
beschränken würde.

von Alex Richard Moll (Gast)


Angehängte Dateien:

Lesenswert?

Jörg W. schrieb:
> 8 KiB sind für einen ARM allerdings wirklich wenig. In der AVR-Welt wäre
> das wohl in etwa, wenn man seine Experimente auf einen ATtiny10
> beschränken würde.

Das stimmt natürlich, mit Bootloader wird da vermutlich nicht viel ^^

Wie öffnest du .elf files? Atmel Studio bringt einen Fehler und 
Notepad++ zeigt keinen Lesbaren Inhalt, habe gesehen man braucht einen 
Extra Editor.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Alex Richard Moll schrieb:
> Wie öffnest du .elf files?

Man "öffnet" sie nicht, sondern schaut sie sich mit verschiedenen Tools 
an.

Korrektur zu obigem Kommando, nicht objdump sondern nm:
1
000001c0 00000010 T SystemInit
2
00000278 00000010 T atexit
3
20000438 00000018 b object.8672
4
00000260 00000018 t register_fini
5
00000288 00000034 T __libc_fini_array
6
00000218 00000048 T __libc_init_array
7
000001d0 00000048 T main
8
00000000 0000008c T exception_table
9
000000f0 000000d0 T Reset_Handler
10
000002c4 000000f4 T __register_exitproc
11
20000008 00000428 d impure_data

'd' (oder 'D') sind initialisierte Daten, belegt daher RAM (für die 
Daten selbst) und Flash (für die Initialwerte).

'b' (oder 'B') sind bss-Daten, also solche, die mit 0 vorbelegt werden, 
belegt nur RAM.

'T' ist Code ('text'), belegt Flash. Die 'exception_table' dabei enthält 
die Interruptvektoren, 140 Bytes. Die größten Funktionen allein 
(__register_exitproc und Reset_Handler) machen schon mal 500 Byte aus. 
Im Reset_Handler ist dabei auch der Initialisierungscode für die Daten 
enthälten (Kopieren aus dem Flash, Ausnullen von bss).

Wofür dieses 'impure_data' da ist, müsste ich auch erst nachschauen – 
kannst du ja selbst mal danach gugeln. Das ist ja mit mehr als 1 KiB 
schon ein ziemlicher Klopper, sowohl im RAM als auch Flash.

von Alex Richard Moll (Gast)


Lesenswert?

Jörg W. schrieb:
> Korrektur zu obigem Kommando, nicht objdump sondern nm:

Dachte schon, objdump zeigt ja den Assembler Code.

Danke dir für die schöne Erklärung, mein Browser ist eh schon voll mit 
"ARM" und "SAMD09" Suchbegriffen (:

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

https://community.platformio.org/t/why-impure-data-appears-on-custom-build-and-eats-1k-memory-need-fix/11353

Hilft jetzt nicht direkt, aber zeigt zumindest Hinweise auf die 
Linker-Kommandozeile. Keine Ahnung, wie man das in Atmel Studio ändert 
und/oder warum der Kram da überhaupt rein kommt. In meinen eigenen 
SAMD-Projekten habe ich sowas nicht, aber ich nehme auch kein Studio, 
und ich nehme keine newlib_nano.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Alex Richard Moll schrieb:
> objdump zeigt ja den Assembler Code

Nicht ganz, es dumpt alle möglichen Inhalte aus dem ELF-File. 
Disassembly ist nur eine der Optionen.

von Alex Richard Moll (Gast)


Lesenswert?

Auf der Seite bin ich auch gerade :D

Gut zu wissen. Wie viel Speicher belegt dann deine Initialisierung?

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

https://embdev.net/topic/129813

Hat irgendwas mit errno und Reentranz zu tun.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Alex Richard Moll schrieb:
> Auf der Seite bin ich auch gerade :D
>
> Gut zu wissen. Wie viel Speicher belegt dann deine Initialisierung?
1
000000a6 0000007a T Reset_Handler
2
00002314 00000044 T __libc_init_array

Also so reichlich 128 Byte.

Keine Ahnung, was in deinem Code dafür verantwortlich sein könnte, dass 
impure_data da reinkommt. Vielleicht der SystemInit()-Kram.

von Alex Richard Moll (Gast)


Angehängte Dateien:

Lesenswert?

128Byte ist im Gegensatz auf jeden Fall nicht viel.

Mit den Optionen -nostartfiles, -nodefaultlibs, -nostdlib und ohne 
Programmcode bis auf
1
__attribute__((section(".ctors"))) void boot(void)
2
{}
 brauche ich 4 bytes aber trotzdem 1024byte RAM. Bringt mir natürlich so 
nichts ohne Interrupt Tabelle usw. aber des Test hat mich einfach 
Interessiert. Wenn ich es richtig sehe laut der nm.exe Ausgabe ist das 
der Stack der hier berechnet wird obwohl nicht verwendet.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Ja, vermutlich ist das auch in dem anderen ELF-File der Platz, der für 
den Stack reserviert ist.

Ich mag diese statisch allozierten Stacks gar nicht. Der Stackpointer 
sollte einfach am oberen Ende des RAMs beginnen, der Stack wächst dann 
von da nach unten. Damit hat man immer maximal Platz für den Stack – 
wenn es nicht reicht, ist es sowieso vorbei, dann würde auch ein zur 
Linkzeit vorbelegtes Stacksegment nicht helfen, maximal ändert sich die 
Art des Crashs (Hardfault statt zerstörter anderer Daten).

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Jörg W. schrieb:
> Ja, vermutlich ist das auch in dem anderen ELF-File der Platz, der für
> den Stack reserviert ist.

Ja:
1
Sections:
2
Idx Name          Size      VMA       LMA       File off  Algn
3
  0 .text         000003e0  00000000  00000000  00010000  2**2
4
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
5
  1 .relocate     00000434  20000000  000003e0  00020000  2**3
6
                  CONTENTS, ALLOC, LOAD, DATA
7
  2 .bss          00000040  20000434  00000814  00020434  2**2
8
                  ALLOC
9
  3 .stack        00000404  20000474  00000854  00020434  2**0
10
                  ALLOC

(Warum auch immer es 1028 Bytes sind und nicht 1024.)

Die Größe dieses für den Stack reservierten Bereichs wirst du irgendwo 
auswählen können.

: Bearbeitet durch Moderator
von Apollo M. (Firma: @home) (majortom)


Lesenswert?

Alex Richard Moll schrieb:
> Gibt es dazu gute Tutorials ohne Atmel Start oder ASF?

Sogar ziemlich reichlich unter bare-metal ARM programming ...

Hierzu gibt es auch für den SAMD09 Futter zum direkt loslegen.

https://github.com/ataradov/mcu-starter-projects

: Bearbeitet durch User
von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Alex Taradov, sagt mir noch was. War mal ein (etwas entfernter) Kollege 
von mir.

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.