Forum: Compiler & IDEs Unterschiede beim Aufruf der main()-Funktion aus einem Startup-File


von Florian (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

im angehängten Startupfile (Z. 134-140) kann die main()_Funktion
entweder direkt oder über "_start" aufgerufenen werden. Bei meinem
HelloWorld-Programm klappt aber nur ein direkter Aufruf der
main()-Funktion, wird "_start" aufgerufen passiert gar nichts.

Kann mir jmd. sagen, worin sich die beiden Aufrufvarianten
unterscheiden?
1
/* Beispiel */
2
3
.if (BEDINGUNG)
4
    LDR     R0,=main
5
    BX      R0
6
.else
7
    LDR     R0,=_start
8
    BX      R0
9
.endif

von bitfehler (Gast)


Lesenswert?

Was ist denn die Adresse von _start? Ich dachte, das wäre der Anfang des 
Initcodes und NICHT die Adresse von main? Das würde die Sache erklären.

von Florian (Gast)


Lesenswert?

Klar, beide Adressen sind unterschiedlich. Ich kann aber nicht 
nachvollziehen wo diese "_start"-Funktion herkommt bzw. was darin 
passiert, ich vermute aber es hat irgendwas mit der newlib-Bibliothek zu 
tun.

Die Initialisierung des MCUs führe ich innerhalb der main()-Funktion 
durch, daher brauche ich den "vorgeschalteten" Aufruf der 
_start()-Funktion eigentlich nicht.

Nichts desto trotz würde mich interessieren, für was diese 
_start()-Funktion gut sein soll und was darin passiert :)

von Bastler (Gast)


Lesenswert?

Event. unterscheidet sich der "non-" vom "RAM_MODE" dadurch, daß der 
Code erst noch ins schnelle RAM kopiert werden muß. Das macht event. 
_start() und Spring danach main() an.

von Florian (Gast)


Lesenswert?

_start scheint ein kompiler-spezifisches (CodeBench Lite) Symbol zu 
sein:

"For backwards compatibility with previous versions of CS3, on RAM and 
ROM profiles the symbol __cs3_start_asm is actually an alias for a 
symbol named _start. However, referencing or defining _start directly is 
now deprecated"

URL: 
http://doc.ironwoodlabs.com/arm-arm-none-eabi/html/getting-started/sec-cs3-startup.html

von Amateur (Gast)


Lesenswert?

Mit solchen Tricksereien sollte man vorsichtig sein.

In einem von einem 08/15-C-Compiler erzeugten Programm beginnt nur der 
sichtbare Code bei main().

Vorher wird schon einiges - unsichtbar - vorbereitet.

Nur zum Beispiel: Initialisierte Variablen oder beim PC das Zerlegen der 
übergebenen Parameter (argv und argc).

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.