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!!
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.