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
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
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!!
>#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
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
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
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
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
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
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!!
Eine eigene Frage?
Dieser Thread ist über 21 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.