Forum: Mikrocontroller und Digitale Elektronik Probem mit Zeiger in C


von Thomas (Gast)


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

von ElMachel (Gast)


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

von Thomas (Gast)


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!!

von T.Stütz (Gast)


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

von Thomas (Gast)


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

von Yagan Z. Dongobar (Gast)


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

von Thomas (Gast)


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

von Yagan Z. Dongobar (Gast)


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

von Thomas (Gast)


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

von Thomas (Gast)


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!!

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
Noch kein Account? Hier anmelden.