Hallo,
ich wollte mich mal ein bisschen in die Toolchain ARM-GCC einarbeiten
und versuche ein kleines Minimalbeispiel zum laufen zu bringen:
startup.S
1 |
|
2 | .syntax unified
|
3 | .weak ResetHandler
|
4 |
|
5 |
|
6 | @ Vektor-Tabelle
|
7 | .section .isr_vectors
|
8 | .align 2
|
9 | .long __stack__start
|
10 | .long ResetHandler
|
11 |
|
12 |
|
13 | @ Startup Code
|
14 | .text
|
15 | .align
|
16 |
|
17 | movs r0, #0
|
main.c
1 |
|
2 |
|
3 | void ResetHandler() {
|
4 |
|
5 | }
|
6 |
|
7 | void main() {
|
8 |
|
9 | }
|
link.ld
1 |
|
2 |
|
3 | ENTRY(main)
|
4 |
|
5 | MEMORY
|
6 | {
|
7 | FLASH ( rx ) : ORIGIN = 0x08000000, LENGTH = 64K
|
8 | RAM ( xrw ) : ORIGIN = 0x20000000, LENGTH = 20K
|
9 | }
|
10 |
|
11 |
|
12 | __stack__size = 1024;
|
13 | __stack__start = ORIGIN(RAM) + LENGTH(RAM);
|
14 | __stack__end = __stack__start - __stack__size;
|
15 |
|
16 |
|
17 | SECTIONS
|
18 | {
|
19 |
|
20 | .isr_vectors :
|
21 | {
|
22 | KEEP(*.isr_vectors);
|
23 |
|
24 | *(.isr_vectors)
|
25 | *(.isr_vectors*)
|
26 | } > FLASH
|
27 |
|
28 |
|
29 | .text :
|
30 | {
|
31 | *(.text)
|
32 | *(.text*)
|
33 | } > FLASH
|
34 | }
|
Der Kompiler und Linker-Aufruf sieht wie folgt aus:
1 | arm-none-eabi-gcc -ffreestanding -nostdlib -Wall -Werror -mthumb -mcpu=cortex-m3 -c main.c startup.S
|
2 |
|
3 | arm-none-eabi-ld -T link.ld main.o startup.o -o main.elf
|
Und die Ausgabe von arm-none-eabi-nm -n main.elf
1 | 00000400 A __stack__size
|
2 | 08000000 T ResetHandler
|
3 | 0800000c T main
|
4 | 20004c00 A __stack__end
|
5 | 20005000 A __stack__start
|
Warum starten die Funktionen direkt bei 0x08000000? Sollte die .text
Section nicht erst NACH der .isr_vectors Section kommen und damit .text
erst bei 0x08000008 anfangen?
Ich hoffe ihr könnt mir helfen.
Grüße
Tim