Forum: Compiler & IDEs Zeiger auf Funktion


von Dirk Broßwick (Gast)


Lesenswert?

Hallo,

Ich habe eine ISR in der ich eine andere Funktion aufrufen möchte. Da
sich die Funktion auch mal ändert zur laufzeit würde ich dies gerne als
Zeiger hinterlegen. Diesen Zeiger will ich mit hilfe ein Funktion
übergeben. Zweck ist es das man der ISR eine Funktion hinten dran hängt
(diese Funktion soll eine werte erhalten oder zurück geben). Das soll so
in etwa sein wie bei DOS, wo man sich in eine ISR mit "reinhängt". Die
Frage die sich stellt ist wie ich mit diesen Zeiger die Funktion
aufrufen kann, den Zeiger der Funktion bekommt man ja schnell raus.
Benutzten tut ich AVR-gcc und einen ATmega32. Viele Dank für eure hilf
oder denkanschupster.

MfG Dirk

von Dirk Broßwick (Gast)


Lesenswert?

äh ... sehe gerade, die Funktion die aufgerufen werden soll, bekommt
keine Parameter und keine Rückgabewert, da ist wohl das "k" verloren
gegangen :-)

von Karl H. (kbuchegg)


Lesenswert?

Das ist eigetlich sehr simpel.
Empfehlenswert bei Funktionszeigern ist es immer
sich einen typedef für den Funktionstyp anzulegen:

typedef void Fnct(void);

Das sagt nichts anderes aus, als das Fnct eine
Function ist, die nichts kriegt und nichts
liefert.

Ein Funktionszeiger ist dann:

Fnct* MyFnct;

So einem Pointer kann man dann die Adresse einer
geeigneten Funktion zuweisen:

void foo()
{
}

int main()
{
  MyFnct = foo;
}

Die Funktion wird dann über den Pointer auf-
gerufen:
  (*MyFnct)();

Da allerdings die Syntax hier eindeutig ist, kann
man sich die explizite Dereferenzierung sparen
und ganz einfach schreiben:

  MyFnct();

Tja, das wars dann auch schon. Die Aufrufkette
aufbauen ist jetzt dein Bier. Ist aber recht
simpel: Jede Funktion ruft am Ende über einen
Pointer die nächste auf. Mit Ausnahme der
Letzten natürlich.

von Martin Thomas (Gast)


Lesenswert?

Im Beispielcode von Atmel fuer den Butterfly gibt es ein ganz
brauchbares Beispiel fuer die Vorgehensweise. Allerdings keine
"Pointerkette" wie von K-H. Buchegger vorgeschlagen, nur "simples"
Array.

Original:
http://www.atmel.com/dyn/resources/prod_documents/AVR_Butterfly_application_rev06.zip


Portierung fuer avr-gcc auf:
http://www.siwawi.arubi.uni-kl.de/avr_projects/#bf_app

jeweils Quellcodedateien timer0.*

Martin Thomas

von Dirk Broßwick (Gast)


Lesenswert?

Danke für eure hilfe, mal wieder was gelernt ... wenn man ein beispiel
hat geht alles einfacher zu lernen :-) nochmal THX an Buchegger &
Martin Thomas ...

von Karl H. (kbuchegg)


Lesenswert?

Ob du`s glaubst oder nicht, aber Bücer zum
Thema Grundlagen der C Programmierung` sind
voll von Beispielen

von Dirk Broßwick (Gast)


Lesenswert?

hm ... aber in meinen büchern habe ich nix wirklich dazu gefunden, es
ist scheinbar eine art vorzugehen wie sie bei mikrocontroller üblich
ist, aber nicht auf den PC. Aber vielleicht habe ich auch nach den
falschen sachen gesucht, dann sieht man ja bekanntlich die eigentliche
lösung vor einem nicht mehr, auch wenn sie im buche steht ...

von Rolf Magnus (Gast)


Lesenswert?

Funktionszeiger sind nicht mikrocontrollerspezifisch, sondern werden
durchaus öfters verwendet, z.B. für Callback-Funktionen. Die sollten in
jedem halbwegs vernünftigen C-Buch beschrieben sein. Allerdings gibt es
viele Bücher, die nicht mal halbwegs vernünftig sind.

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.