mikrocontroller.net

Forum: FPGA, VHDL & Co. Xilinx SDK, #define __


Autor: Flo J. (Firma: HS Kempten) (flogzmo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Servus,

die Frage bezieht sich zwar auf C Code aber ich denke in Sachen Xilinx 
Programme bin ich hier richtiger.

In den von den Xilinx Tools automatisch erstellten .c und .h Files 
tauchen viele #defines auf. z.b.
#ifdef __PPC__
#define CACHEABLE_REGION_MASK 0x80308000
#endif

oder
#ifndef __PLATFORM_CONFIG_H_
#define __PLATFORM_CONFIG_H_

Bedingte defines verstehe ich. Aber was bedeutet __ vor und nach dem 
PPC.

gruß

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Flo J. schrieb:
> Bedingte defines verstehe ich. Aber was bedeutet __ vor und nach dem
> PPC.
Syntaktisch garnichts.

Viele Leute und Hersteller beginnen und beenden Bezeichner mit '_' oder 
'__', wenn diese intern vordefiniert sind oder nur intern benutzt werden 
sollen. Der Unterstrich zählt als Bestandteil des Bezeichners (quasi ein 
Buchstabe).
__PPC__
dürfte z.B. vom Compiler genau dann gesetzt werden, wenn du auf einer 
Powerpc-Architektur kompilierst.
Andere Beispiele sind z.B.
__LINE__ und __FILE__
(aktuelle Quelltext-Datei/-Zeile).

Autor: Flo J. (Firma: HS Kempten) (flogzmo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Okay, vielen Dank.

In diesem Zug gleich noch eine Frage :P
struct netif {
/** pointer to next in linked list */
struct netif *next;
...
/** This function is called by the network device driver
*  to pass a packet up the TCP/IP stack. */
err_t (* input)(struct pbuf *p, struct netif *inp);
...

Dass in einem struct Namens netif wiederum ein Pointer desselben Typs 
netif auftaucht ist mir neu, aber erst recht verstehe ich nicht was in 
der Zeile mit err_t passiert. Funktionsaufruf mit Rückgabewert in einer 
struct Definition?

edit: Und mich stört das Leerzeichen zwischen * und input. Ein Pointer 
sieht für mich so aus: *input

Autor: max (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
mmn ist das ein function-pointer. da kannst du dann die 
callback-funktion definieren die aufgerufen wird, sobald ein package 
ankommt.

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Flo J. schrieb:
>
struct netif {
> /** pointer to next in linked list */
> struct netif *next;
> ...
> /** This function is called by the network device driver
> *  to pass a packet up the TCP/IP stack. */
> err_t (* input)(struct pbuf *p, struct netif *inp);
> ...
>
> Dass in einem struct Namens netif wiederum ein Pointer desselben Typs
> netif auftaucht ist mir neu,
Das ist eine verkettete Liste. Jede Struktur zeigt einfach auf die 
nächste Struktur in der Liste. Möglich ist das, da Zeiger immer 
diegleiche Größe haben (auf 32-Bit-Systemen meist 4 Bytes), d.h. die 
Sache läuft nicht 'rekursiv', wie man vermuten könnte. Ein Zeiger auf 
ein Byte braucht genauso viel Platz, wie ein Zeiger auf eine riesige 
Datenstruktur.

> aber erst recht verstehe ich nicht was in
> der Zeile mit err_t passiert. Funktionsaufruf mit Rückgabewert in einer
> struct Definition?
Jein, wichtig ist das linke Klammerpaar. Damit wird eine Zeigervariable 
namens 'input' vereinbart. Der Rest drumherum bildet den Zeigertyp, der 
ist hier: Funktion mit zwei Argumenten und Rückgabewert err_t.

Beispiel:
int eine_funktion(int a, char b) {
  /* ... */
}

int (*zeiger_auf_eine_funktion)(int a, char b);
zeiger_auf_eine_funktion = &eine_funktion;

Wobei der Adressoperator ('&') da auch wegfallen darf. Danach bewirken 
folgende Anweisungen dasselbe:
int ergebnis;
ergebnis = eine_funktion(1, 2);
ergebnis = (*zeiger_auf_eine_funktion)(1, 2);
Analog darf auch hier der Verweisoperator ('*') entfallen, es reicht, 
einfach zu schreiben:
ergebnis = zeiger_auf_eine_funktion(1, 2);


> edit: Und mich stört das Leerzeichen zwischen * und input. Ein Pointer
> sieht für mich so aus: *input
Leerzeichen, Zeilenumbrüche etc. fallen in C unter 'Leerraum'. Hier ists 
egal, ob und wo ein Leerzeichen steht.

Autor: Flo J. (Firma: HS Kempten) (flogzmo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Daumen Hoch! Danke dir Sven für die ausführliche Erklärung.
Gruß Flo

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]
  • [vhdl]VHDL-Code[/vhdl]
  • [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.