Probem mit Zeiger in C

Gast #164631
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
Gast #164632
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
Gast #164633
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!!
Gast #164634
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
Gast #164635
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
Gast #164636
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
Gast #164637
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
Gast #164638
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
Gast #164639
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
Gast #164640
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren