www.mikrocontroller.net

Forum: Compiler & IDEs Zeiger auf Funktion


Autor: Dirk Broßwick (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Dirk Broßwick (Gast)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Martin Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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/...


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

jeweils Quellcodedateien timer0.*

Martin Thomas

Autor: Dirk Broßwick (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ...

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Autor: Dirk Broßwick (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ...

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

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.