Aufruf externer Maschinenprogramme für die kein Quelltext vorhanden ist

#3799356
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.
Gast #3799465
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)
#3800618
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.
#3801866
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!

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren