www.mikrocontroller.net

Forum: Compiler & IDEs Funktionen und Prototypen


Autor: Donald Rumsfeld (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Ich habe gerade mit C Programmierung von AVRs angefangen. Ich verstehe
nur nicht, warum man in C Funktionsprototypen braucht (da es ja auch
ohne funzt)

Speziell bei den Interruptfunktionen z.B. SIGNAL(SIG_ADC) wird in
keinem Beispielprogramm ein Funktionsprototyp benutzt. Und ich wüsste
auch nicht, wie der aussehen würde, da z.B.

int SIGNAL(SIG_ADC);

vom Compiler mit einer Warnung, dass der Datenttyp von SIG_ADC nicht
angegeben ist beanstandet wird. So, das waren jetzt ja mehrere Fragen
aber auch für Teilantworten bin ich sehr dankbar

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ein anderes Wort für Funktionsprototyp ist Vorwärtsdeklaration.

Er ist dann erforderlich, wenn der Aufruf einer Funktion vor deren
eigentlicher Definition erfolgt. Dann nämlich ist die Funktion dem
Compiler noch unbekannt, und der Compiler kann weder die korrekte
Schreibweise des Funktionsaufrufs noch die Korrektheit der übergebenen
Parameter überprüfen.

Dasselbe trifft auf Funktionen zu, die außerhalb des Modules definiert
sind, in dem sie aufgerufen werden.

Das hat damit zu tun, daß C-Compiler "single-pass"-Compiler sind, die
den übergebenen Quelltext nur einmal analysieren. Andere
Programmiersprachen verwenden "multiple-pass"-Compiler, die im Falle
des Aufrufs einer Funktion sich ersteinmal deren Definition näher
ansehen.

Die spezifische Notation der Interruptfunktionen, wie sie in
gcc/gcc-avr implementiert werden, ist nicht Bestandteil von C als
Programmiersprache. Aller Wahrscheinlichkeit nach wird das mit recht
aufwendigen Makrokonstrukten realisiert.

Autor: Reiner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

"Ich habe gerade mit C Programmierung von AVRs angefangen. Ich
verstehe nur nicht, warum man in C Funktionsprototypen braucht (da es
ja auch ohne funzt)"

Das ist richtig, es funktioniert auch ohne.  Frühere C-Standards
kannten die Prototypen auch nicht.
Der Vorteil die Prototypen zu benutzen liegt darin, daß der Compiler
die Möglichkeit hat den Funktionsaufruf, den Rückgabewert und die
Parameter zu überprüfen.  Programmierfehler werden dadurch
eingeschränkt!  Hat man keinen Prototypen, kann man einer Funktion, die
z.B. einen Integer erwartet auch als Parameter einen Pointer
"unterjubeln" was sicher zu interessanten Ergebnissen führt.

Kurz gesagt,  man kann sich auch mit einer Rasierklinge ohne Griff
rasieren, sollte dabei aber sehr vorsichtig sein. ):-

Reiner

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Die spezifische Notation der Interruptfunktionen, wie sie in
> gcc/gcc-avr implementiert werden, ist nicht Bestandteil von C als
> Programmiersprache. Aller Wahrscheinlichkeit nach wird das mit recht
> aufwendigen Makrokonstrukten realisiert.

Es sind streng genommen zwei Makros, die hier mitspielen.

SIGNAL (bzw. neu jetzt ISR) deklariert dabei in der Tat sogar einen
Funktionsprototypen, an den das Attribut für die Interrupt-
Funktionalität angehängt wird.  In der darauffolgenden Zeile wird dann
sofort mit der Definition der Funktion begonnen.

Der zweite Makro ist der Vektorname, der löst in __vector_N auf, wobei
N die Nummer des Interruptvektors in der Vektortabelle ist.  Die
Vektortabelle selbst ist in der Bibliothek vordefiniert, wobei die
Applikation die Möglichkeit hat, ihre eigenen ISRs über diese Namen
,,aufzudrängeln''.

Autor: Donald Rumsfeld (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Soso
Vielen Dank für eure Antworten. Ja, das mit den Interrupts sind
garkeine Funktionen sondern MAkros und brauchen deshalb keine
Deklaration (scheinbar). Und das mit den Funktionen und deren
Prototypen habe ich jetzt (besonders dank Reiner) auch verstaden.

Sehr schön

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

kleine Ergänzung:
selbst wenn man eine isr als Funktion sieht (in manchen 'echten'
Embedded-C-Compilern wie z.B. CodeVision oder Keil sehen die nämlich
genau so aus wie ne normale Funktion, nur dass das Schlüsselwort
'interrupt' davor oder dahinter steht), ist eine
Prototypen-Deklaration nicht sinnvoll, da eine isr eh nicht aus dem
Programm heraus aufgerufen werden kann, sondern nur durch das
entsprechende Hardware-Ereignis.

Gruß

Johnny

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.