www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Probem mit Zeiger in C


Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Guten Abend,
Frage an die C Spezialisten:
Ich versuche mit der API von Wiznet einen W3100A Ethernet Chip zu
steuern. Hier ist meine Klippe an der ich
scheitere:

#define SEND_DATA_BUF[0] (*((volatile u_char xdata *)(0xC000))) //
Internal Tx buffer address of W3100A
#define  RECV_DATA_BUF[0] (*((volatile u_char xdata *)(0xE000))) //
Internal Rx buffer address of W3100A

u_char *SBUFBASEADDRESS[4]; // Maximun Tx memory base address by each
channel
u_char *RBUFBASEADDRESS[4]; // Maximun Rx memory base address by each
channel


    SBUFBASEADDRESS[0] = (u_char xdata *)0x0C000; // Set Base Address
of Tx memory for channel #0 von mir
    RBUFBASEADDRESS[0] = (u_char xdata *)0x0E000; // Set Base Address
of Rx memory for channel #0 von mir

 //   SBUFBASEADDRESS[0] =  SEND_DATA_BUF[0]; // Set Base Address of Tx
memory for channel #0
 //   RBUFBASEADDRESS[0] =  RECV_DATA_BUF[0]; // Set Base Address of Rx
memory for channel #0
 //   Diese geben einen Fehler!!

   printf("\nPointer:%x",SBUFBASEADDRESS[0]); //Druckt immer 0x4C4D
aus

Die Zeiger sind nicht wie erwartet. Ich muß mit SBUFBASEADDRESS[0] auf
0xC000 zeigen.
Die mit // weggenommenen Zeilen sind von der Original API und rufen
einen Fehler im C-Compiler hervor.
WARUM??
Wie sag ich es meinem Prozessor? Ich steh mit den Zeigern seit jeher
auf Kriegsfuß.

Danke,
Gruß

Thomas

Autor: ElMachel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

als erstes würd ich mal die defines so schreiben:
#define SEND_DATA_BUF  (*((volatile u_char xdata *)(0xC000)))
#define  RECV_DATA_BUF (*((volatile u_char xdata *)(0xE000)))

Ist xdata ein Datentyp? Wenn nicht gehört der auch noch weg.

cu
ElMachel

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
xdata bedeutet daß es sich um eine externe Speicherzelle handelt, in
diesem Falle Register im Modul das ich ansteuere (wird wie ein Speicher
angesprochen).
Ich versuche es heute abend mal und poste mein Ergebnis.
Danke erst mal!!

Autor: T.Stütz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>#define SEND_DATA_BUF[0] (*((volatile u_char xdata *)(0xC000)))

>u_char *SBUFBASEADDRESS[4];

>SBUFBASEADDRESS[0] =  SEND_DATA_BUF[0]; // Set Base Address of Tx

1. SBUFBASEADDRESS sollte als "u_char xdata *SBUFBASEADDRESS[4]"
definiert sein (bekommt ja auch eine Addresse in diesen
Speicherbereich)

2. Definiere SEND_DATA_BUF lieber per
#define SEND_DATA_BUF ((volatile u_char xdata *)(0xC000))

damit kannst du den Sendepuffer als Array ansprechen
(2.Zeichen ist z.B: "SEND_DATA_BUF[1]")

3. Die Zeile "SBUFBASEADDRESS[0] =  SEND_DATA_BUF[0];" ist absoluter
Blödsinn (sorry), es wird nämlich der Inhalt des ersten Bytes im
Sendepuffer in einen Zeiger umgewandelt und gesichert.

zusammen mit 2. schreibst du dann lieber

"SBUFBASEADDRESS[0] = &SEND_DATA_BUF[0];"

Gruss

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
danke für die Hilfe, vielleicht ist mein Kompiler Müll. Was du als
Blödsinn bezeichnest ist original aus der API von Wiznet die mit dem
Keil Compiler laufen soll. Deine Vorschläge und alle meine Klimmzüge
geben immer Fehlermeldungen. Definiert hab ich:

u_char xdata *SBUFBASEADDRESS[4];
#define SEND_DATA_BUF    ((volatile u_char xdata *)(0xC000))

Zuweisen wollte ich dann
SBUFBASEADDRESS[0] = &SEND_DATA_BUF[0];

Fehler der kommt:
Error: illegal expression
Error: lvalue required
Error: syntax error; found '0' expecting ';'
in genau dieser Zeile mit der Zuweisung. Ich benutze den Demo Compiler
von Wickenhäuser.
Ist zum Ausrasten, wieso will der nicht so wie ich?? Was mach ich
falsch, wieso soll der Keil Compiler das machen?
Kann das mal einer mit nem anderen Compiler nachstellen?
Gute Nacht und danke!!

Thomas

Autor: Yagan Z. Dongobar (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Thomas,

leider kenne ich Deinen Compiler nicht, aber die Deklaration von
Zeigern und Speicherbereichen auf absoluten Adressen ist in C nicht
standardisiert und kann von Compiler zu Compiler unterschiedlich sein.

Auch benutzt der Keil-Compiler wegen der verschiedenen Adressräume der
8051-Architektur proprietäre Erweiterungen der C-Syntax, die anderen
Compilern Schwierigkeiten bereiten können.

Es könnte schon helfen, im Handbuch Deines Compilers nachzusehen, wie
absolute Adressen gehandhabt werden (und die #defines entsprechend
anzupassen).

Ciao, Yagan

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Yagan,
danke für den Hinweis. Ich habe die Doku schon durchgesehen aber nichts
gefunden was mir hilft.
Na ja, dann muß ich mir da irgendwie behelfen. Ist für mich auf jeden
Fall interessant zu wissen daß es da unterschiedliche Standards gibt,
ich werde dann mal die Beispiele die beim Compiler dabei waren
durchforsten ob ich etwas vergleichbares finde und wie es da realisiert
wurde.

Cheers

thomas

Autor: Yagan Z. Dongobar (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Thomas,

da ich den Compiler noch nicht kannte, habe ich mir die Demo von
wickenhauser.de heruntergeladen. Die Syntax der absoluten Adressen ist
tatsächlich vollkommen anders als bei Keil.

In Deinem Fall könnte vielleicht folgendes helfen:

Statt
#define SEND_DATA_BUF[0] (*((volatile u_char xdata *)(0xC000)))

schreibe:
extern far uchar SEND_DATA_BUF[] @ 0xC000;

Dann müsste die Zuweisung:

SBUFBASEADDRESS[0] = &SEND_DATA_BUF[0];

funktionieren und in SBUFBASEADDRESS[0] als Zeiger die Adresse 0xC000
drin stehen.

Ciao, Yagan

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Yagan,
danke für die Bemühung den Compiler herunterzuladen.
Leider funktioniert dein Vorschlag auch nicht. Ich habe folgendes erst
mal versucht:

extern far uchar SEND_DATA_BUF[] @ 0xC000;

printf ("\nInhalt: %x", SEND_DATA_BUF[0]);
printf ("\naddress: %x", &SEND_DATA_BUF[0]);

Damit drucke ich mir die Adresse und den Inhalt aus und erwarte als
Adresse C000.
Der Inhalt ist aber 9 und address 0. Habe alle mögliche schon versucht,
Adresse C000 kommt NIE heraus.
Weitere Ideen? Oder ist ein Fehler in meinem printf Test?

Schönen Vatertag,
Gruß

Thomas

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schluss mit dem Mist, ich brauch die Zeiger gar nicht als Variablen. Die
Speicherbereiche die ich nutzen will sind fest vergeben, ich definier
die Werte als Konstanten und habe dann kein Problem mehr.
So hab ich das Problem zwar nicht gelöst, komem aber mit meinem Projekt
weiter.

Schönen Abend noch und Danke trotzdem!!

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.