mikrocontroller.net

Forum: Compiler & IDEs USB Host in C, was bedeuten diese Zeilen


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: HyperMario (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Freunde des C proggens

Hab hier einen kleinen Ausschnitt aus einem C programm und steh voll auf 
dem Schlauch. Kann mir einer sagen was das bedeutet. (Kommentare von 
mir)
// HID callback class declare
typedef struct{
  void(*DeviceInit)();
  void(*ReportReceived)(uint8_t* rptData);
} TUSBHostHIDHandler;

// HID callback class define
TUSBHostHIDHandler USBHost_HIDHandler = {
  HidDevInit,
  HidDevReportReceived
};

// Pointer to struct ?
TUSBHostHIDHandler* USBHost_HIDHandlerPtr = &USBHost_HIDHandler;


Das sind so genannte callbacks hinter denen eine compilierte lib von 
Mikroe
steckt.

Autor: Sven B. (scummos)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das sind zwei Function Pointer, die in einem struct gruppiert sind.

Autor: HyperMario (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sven B. schrieb:
> Das sind zwei Function Pointer, die in einem struct gruppiert sind.

Danke, das bedeutet wohl das damit 2 Funktionen aufgerufen werden.
Warum ist das in einer struct und nicht einzeln?

Autor: Jim M. (turboj)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
HyperMario schrieb:
> Warum ist das in einer struct und nicht einzeln?

Eventuell braucht man das mehrmals, z.B. einmal für die Maus und einmal 
für die USB Tastatur.

Autor: Sven B. (scummos)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
HyperMario schrieb:
> Sven B. schrieb:
>> Das sind zwei Function Pointer, die in einem struct gruppiert sind.
>
> Danke, das bedeutet wohl das damit 2 Funktionen aufgerufen werden.
> Warum ist das in einer struct und nicht einzeln?

Das musst du wohl den Autor dieses Codes fragen. Wahrscheinlich fand er 
es praktischer so, weil die Funktionen ja irgendwie zusammen gehören.

Autor: HyperMario (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank das macht es etwas klarer.


Jim M. schrieb:
> Eventuell braucht man das mehrmals, z.B. einmal für die Maus und einmal
> für die USB Tastatur.

Stimmt, da wird später zwischen Maus und Keyboard unterschieden.
Verstehe ich das richtig das er sich eine Struktur mit Funktionspointern 
aufbaut um die später mehrfach zu verwenden?

Also z.B das er sich eine macht wo die Maus callbacks reinlaufen und 
eine für das keyboard. Ist das richtig?


und was meint dieser Teil?
  // Pointer to struct ?
  TUSBHostHIDHandler* USBHost_HIDHandlerPtr = &USBHost_HIDHandler;

Das verstehe ich so das im hinteren Teil die Adresse von der Struktur 
geholt wird in der die die Functionspointer liegen.

Wofür braucht man das? Man muss doch doch nur die Funktionen aufrufen 
und was bedeutet TUSBHostHIDHandler* ?

Autor: Theor (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
HyperMario schrieb:
> Sven B. schrieb:
>> Das sind zwei Function Pointer, die in einem struct gruppiert sind.
>
> Danke, das bedeutet wohl das damit 2 Funktionen aufgerufen werden.

Nein, das bedeutet es so nicht.
Aber siehe zunächst meine Antwort auf Deine zweite Frage.

> Warum ist das in einer struct und nicht einzeln?

Strukturen sind, mal ganz grob gesprochen, genau was das Wort sagt: 
Dinge, die sich aus mehreren anderen Dingen zusammensetzen.

Ein Auto ist ein Beispiel für eine Struktur aus Sitzen, 
Zigarettenanzünder, etcpp. und nicht zu vergessen, dem Motor.

Ein Buch ist ein Beispiel für eine Struktur aus Kapiteln, Absätzen, 
Sätzen, Haupt- und Nebensätzen etcpp.

(Beachte, dass ich die Beispiele auf zwei unterschiedliche Arten 
beschrieben habe. Vielleicht denkst Du darüber mal nach, was der 
Unterschied ist).

Wenn also Strukturen vorliegen, dann weil sie unterscheidbare 
Einzelteile habe.
In der Umkehrung verwendet man Strukturen, wenn man Einzelteile 
zusammenfügen will. Natürlich. :-)

Bei der Programmierung gibt es nun häufig Fälle in denen mehrere 
Variablen beteiligt sind, wenn es gilt einen Vorgang durchzuführen.
Man nehme etwa einen Ringpuffer.
Da gibt es einen Lesezeiger, einen Schreibzeiger und den Puffer selbst.
Es bietet sich nun an, diese drei Variablen in einer Struktur 
organisatorisch zusammenzufassen.
Das hat drei Vorteile:

1. Wenn man einen Puffer anlegt so sind alle notwendigen 
Teilelemente damit erzeugt. Die Variablen für den Lese- und den 
Schreibzeiger und der Puffer selbst. (Das gibt noch ein besonderes 
Problem, aber das lasse ich hier mal weg).

2. In dem besonderen Fall, dass man mehrere Puffer anlegt, sind durch 
die Zusammenfassung aller Teilelemente, die Puffer insgesamt klar 
unterscheidbar, d.h. man sieht beim lesen, was sich worauf bezieht.

3. Textuell, also in der Organisation des Quellcodes sind immer alle 
notwendigen Elemente beisammen . Man muss also nicht erst immer gucken 
wo man diese oder jene Variable deklariert bzw. definiert hat (und wie 
sie heissen).


So. Ich komme nun auf die erste Frage zurück.

Dein Beispiel legt eine Struktur von Zeigern auf Funktionen an. Mit so 
einem Zeiger kann man zwei Dinge tun.
1. Man kann den Zeiger ändern, d.h die Funktion ändern und damit das 
beeinflussen was geschieht.
2. Man kann diese Funktion(en) aufrufen, damit sie tut, was sie eben tun 
soll.

Aber: In C geht es nicht, wenn man zwei (oder mehr) Funktionszeiger in 
der Struktur hat, dass alle Funktionen auf einen Schlag aufgerufen 
werden - und damit gleichzeitig oder nacheinander ausgeführt werden.

Die Antwort auf die erste Frage ist also: Nein. Das geht nicht.

Was mittlerweile in C wohl geht, ist, die Werte mehrerer 
Mitgliedervariablen der Struktur in einer Anweisung zu setzen.
Man kann auch schon immer, eine Struktur komplett kopieren oder 
initialisieren.

Aber aufrufen bzw. ausführen kann man die Funktionen, auf welche die 
Zeiger zeigen nicht auf einen Schlag - d.h. nicht mit einer 
einzelnen Anweisung. Dazu sind so viele Anweisungen nötig, wie es Zeiger 
auf Funktionen in der Struktur gibt.

Autor: HyperMario (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke erstmal für die Antwort, verstehe ich so das Strukturen dazu da 
sind es dem Progger/Leser leichter zu machen. Dem Prozessor ist das 
egal.


Theor schrieb:
> Die Antwort auf die erste Frage ist also: Nein. Das geht nicht.
>
> Was mittlerweile in C wohl geht, ist, die Werte mehrerer
> Mitgliedervariablen der Struktur in einer Anweisung zu setzen.
> Man kann auch schon immer, eine Struktur komplett kopieren oder
> initialisieren.
>
> Aber aufrufen bzw. ausführen kann man die Funktionen, auf welche die
> Zeiger zeigen nicht auf einen Schlag - d.h. nicht mit einer
> einzelnen Anweisung. Dazu sind so viele Anweisungen nötig, wie es Zeiger
> auf Funktionen in der Struktur gibt.

Ein Funktion zur Zeit, soweit so klar.


Aber was macht diese Zeile?
 // Pointer to struct ?
   TUSBHostHIDHandler* USBHost_HIDHandlerPtr = &USBHost_HIDHandler;

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

Bewertung
0 lesenswert
nicht lesenswert
Die deklariert einen Pointer (USBHost_HIDHandlerPtr) und initialisiert 
ihn mit der Adresse der Strukturinstanz USBHost_HIDHandler.

Das ist stinknormales C und macht effektiv dasselbe wie das hier:
int x = 4;

int *y = &x;

Statt "int" wird in Deinem Beispiel halt der Strukturtyp 
"TUSBHostHIDHandler" verwendet.

Autor: HyperMario (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Rufus Τ. F. schrieb:
> Die deklariert einen Pointer (USBHost_HIDHandlerPtr) und initialisiert
> ihn mit der Adresse der Strukturinstanz USBHost_HIDHandler.

Danke, ist jetzt klar.

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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.