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?
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.
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.
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.
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.
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!
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)
Danke!!!!!!!!!!!!!!! Funkt auf Anhieb!
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
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.