Forum: Mikrocontroller und Digitale Elektronik Aufruf externer Maschinenprogramme für die kein Quelltext vorhanden ist


von Wolfgang (Gast)


Lesenswert?

Ich möchte auf einem Prozessor LM3S... (Arm-Cortex), der bereits 
Maschinenprogramm enthält, per C Unterprogramme aufrufen (ab 0x4000). 
Die numerischen Adressen und die Funktionen sind bekannt. Wie bekommt 
man das hin?

von Peter II (Gast)


Lesenswert?

Wolfgang schrieb:
> Wie bekommt
> man das hin?

einfach ein Funktionszeiger anlegen und ihn auf die Adresse setzen.

Im Prinzip so wie man Funktionen aus einen dynamisch geladenen DLL 
aufruft.

von Wolfgang S. (wolfgangs)


Lesenswert?

Sorry, ich vergaß zu erwähnen, dass die Startadressen in Tabellenform am 
Anfang des Bereiches abgelegt sind. Irgendwie bekomme ich keinen 
Funktionszeiger hin, der die abgelegte Adresse verwendet. Problem: wie 
schreibt man das? Einfache Funktionszeiger auf numerische Adressen 
bekomme ich hin.

von stefan us (Gast)


Lesenswert?

Schau mal dort: 
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.faqs/ka3750.html

Ich nehme an, dass man das Prinzip nicht nur auf primitive Variablen 
sondern auch auf Arrays von Pointern anwenden kann.

von Peter II (Gast)


Lesenswert?

Wolfgang Sch. schrieb:
> Problem: wie
> schreibt man das? Einfache Funktionszeiger auf numerische Adressen
> bekomme ich hin.

verstehe das Problem nicht. Ob es nun eine Konstante ist oder der Wert 
irgendwoher kommt ist doch das gleiche.

von K.K. (Gast)


Lesenswert?

So bekommt man das hin:
1
int (*fn) (void) = (void*) *((int*)(volatile void*)0x4000);
2
fn();

Natürlich musst du noch die Datentypen und Parameter anpassen!

von Peter II (Gast)


Lesenswert?

K.K. schrieb:
> So bekommt man das hin:
> int (*fn) (void) = (void*) *((int*)(volatile void*)0x4000);
> fn();
>
> Natürlich musst du noch die Datentypen und Parameter anpassen!

oder gleich ein Typedef verwenden, dann ist das sogar noch lesbar
1
typedef void(*fnT)(int);
2
3
fnT fn = (fnT)0x4000;

(ich hoffe das stimm so, funktionspointer kommen nicht so oft vor)

von Wolfgang S. (wolfgangs)


Lesenswert?

Danke!!!!!!!!!!!!!!!

Funkt auf Anhieb!

von K.K. (Gast)


Lesenswert?

Peter II schrieb:
> fnT fn = (fnT)0x4000;

Leider falsch denn die Adresse der Funktion steht dort und nicht die 
Funktion selbst.

> Irgendwie bekomme ich keinen Funktionszeiger hin, der die abgelegte
> Adresse verwendet

von Route_66 H. (route_66)


Lesenswert?

Wolfgang Sch. schrieb:
> Sorry, ich vergaß zu erwähnen, dass die Startadressen in Tabellenform am
> Anfang des Bereiches abgelegt sind.

K.K. schrieb:
> Leider falsch denn die Adresse der Funktion steht dort und nicht die
> Funktion selbst.

...und deshalb funktioniert es wohl.

von Karl H. (kbuchegg)


Lesenswert?

Route 66 schrieb:

> K.K. schrieb:
>> Leider falsch denn die Adresse der Funktion steht dort und nicht die
>> Funktion selbst.
>
> ...und deshalb funktioniert es wohl.

Äh nein.
In der Version von Peter II fehlt ein *
In der Version von KK ist er vorhanden.

Wenn da meherer Adresse abgelegt sind, würde ich sowieso hergehen und 
mir eine struct mit Adresszeigern bauen, so dass ich dann mit einem 
Pointer auf so ein struct Objekt, welchen ich auf 0x4000 setze dann in 
vernünftiger Form die Aufrufe machen kann, ohne mir erst mal die 
Funktionsadressen umkopieren zu müssen.
Und ja: typedef sind beim Arbeiten mit Funktionszeigern immer eine 
extrem gute Idee. Die Syntax ufert sonst ganz schnell aus.

von Wolfgang S. (wolfgangs)


Lesenswert?

Also,

ich habe die Version von K.K. verwendet.

Das funktioniert erstaunlicherweise auch mit weitergeleiteten 
Interrupts, die erst im gezeigerten Programm initialisiert werden.
Weiterleitung:

void Timer0A_IRQHandler__(void)
  {
  int (*fm) (void) = (void*) *((int*)(volatile void*)0x408c);
  fm();
  }



(in startup_lm3s.h)
Prozessor: LM3S9B92
COOCOX-IDE

Nochmals vielen Dank an alle!

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.