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
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.
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
> 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''.
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
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
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.