mikrocontroller.net

Forum: Compiler & IDEs Aus Startup-Code C++ Funktion aufrufen (ARM)


Autor: Günther (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich habe in meinem Startup-Code (LPC2000) ein Problem. Und zwar möchte 
ich, bevor ich main aufrufe, eine andere Funtion starten, die 
dummerweise in C++ realisiert ist.
Im Startupcode gibts ja die Anweisungen

  ldr r12, =main
  mov lr, pc
  bx r12

nun möchte ich, bevor ich main aufrufe, eine andere Funktion starten 
namens init. Wenn ich folgendes schreibe:


  ldr r12, =init
  mov lr, pc
  bx r12

dann funktioniert dies zwar, völlig zuverlässig, aber nur, wenn init 
eine C-Funktion ist. Sobald ich init in einem cpp-File habe (und das 
habe ich, weil init auf bestimmte C++ Klassen zugreifen muss), dann 
meckert der Compiler (undefinied symbol).

Was  muss ich tun, damit er erkennt, was init ist? In C geht das ja 
auch.


Gruss

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Rauskriegen wie die Funktion heisst und diese aufrufen. Eine C++ 
Funktion void init() heisst auf Assembler-Ebene nicht einfach nur init, 
weil Parametertypen in den Namen reincodiert sind.

Alternativ: Diese Funktion mit extern "C" garnieren.

Autor: Günther (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
A.K.,
danke erstmal.
Wie finde ich den Namen der Funktion denn raus?
Und, wenn ich sie mit extern "C" garniere - kann sie dann dennoch C++ 
Code ausführen?

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Name: beispielsweise ins Mapfile reinsehen.
Kann dennoch C++ ausführen.

Autor: Günther (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank AK, funktioniert bestens!

Autor: Interessierte (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@guenther

Für Interessierte :)

Wie musstest du die Funktion denn nun aufrufen?

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Interessierte schrieb:
> @guenther
>
> Für Interessierte :)
>
> Wie musstest du die Funktion denn nun aufrufen?

Na genau so, wie im ersten Post. Er hat mit dem 'extern "C"' nur dafür 
gesorgt, dass die Funktion auch tatsächlich "init" heißt.

Autor: Günther (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, genau so habe ich es gemacht.
Mein Startup-Code lädt erst die Adresse der init-Funktion, so:

   ldr r12, =init
   mov lr, pc
   bx r12

und dann erst wird main gestartet:

   ldr r12, =main
   mov lr, pc
   bx r12

wobei die funktion init so aussieht:

extern "C" void init(void)
{
...
}

Gruss

Autor: Μαtthias W. (matthias) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

und ohne das extern "C" heißt die Funktion dann (bei einem 3.4.4 x86 
gcc) __Z4initv. Stichwort "Name mangling".

Matthias

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.