Hallo, ich muß in meiner Diplomarbeit einen ARM7 Controller (Philips LPC2138) steuern. Dabei sollen mehrere Peripherieboards (A/D Wandler, Temperatursensoren, Relays, MMC-Cardreader, ...) über I2C angesteuert werden. Die Boards sind alle von Bipom, falls jemand das was sagt. Zum debuggen benutze ich den Tantino von Hitex, der über USB mit dem PC verbunden ist und über JTAG mit dem Board. Zum programmieren benutze ich HiTOP5. Ich habe schon ein paar Beispielprogramme für alle Boards dabei. Diese muß ich allerdings erstmal in HiTOP einbinden. Ich habe erstmal probiert das Relayboard (PCF8574) zu testen, dabei kam es zu folgenden Problemen: erstes Problem: .\Obj\i2c.o: In function `I2C_Config': .\src/i2c.c:41: undefined reference to `__udivsi3' i2c.c (Auszug): void I2C_Config(unsigned long clk_bus) { CURRENT_I2C_CLK = clk_bus; /* Initialize I2C bus */ PINSEL0 |= 0x50; /* Configure SCL and SDA pins */ I2CONCLR=0x6C; /* Clear all flags */ I2CONSET=0x40; /* Enable I2C */ I2SCLH = I2SCLL = I2C_CLK(clk_bus)/2; /* Configure CLK of I2C BUS */ } i2c.h(Auszug): #define I2C_CLK(clk) (uint16_t)((FOSC*PLL_M/VPBDIV_VAL)/(clk)) zweites Problem: .\Obj\main.o: In function `main': .\Src/main.c:79: undefined reference to `siprintf' .\Src/main.c:89: undefined reference to `siprintf' main.c(Auszug): uart0Puts("\n\rSwitch RELAYS ON..."); if (WritePCF8574(0,0x00) == I2C_SUCCESS) uart0Puts("PASSED"); else uart0Puts("FAILED"); SoftDelay(DELAY); ec = ReadPCF8574(0,&dataByte); siprintf(string,"\n\rExpander = 0x%02X, ec = %d",dataByte,ec); uart0Puts(string); SoftDelay(DELAY); Ich habe die "stdio.h" eingebunden, und er findet sie wohl auch, zumindet gibt es keine Fehlermeldung dass er sie nicht findet. Warum findet er diese Funktion nicht? Zum ersten Fehler, ich habe mit der Varialben "__udivsi3" garnichts zu tun und finde sie auch nirgends. Warum dann diese Fehlermeldung? Ich bin noch recht neu im Bereich Mikrocontroller und I2C Bus, aber ich habe mich eingelesen, und es ich muß da jetzt irgendwie durch, ist ja eine Diplomarbeit ;-). Also bitte sagt mir nicht ich soll erstmal mit einem kleineren Projekt anfangen, oder die Finger davon lassen, diese Möglichkeit steht nicht zur Debatte. Ich weiß auch dass die Beispiele nicht sehr gut programmiert sind, aber ich dachte es ist einfach so ein Beispiel zu verstehen, als es komplett neu zu programmieren (falls es denn läuft). Danke schon mal für die Hilfe.
>.\src/i2c.c:41: undefined reference to `__udivsi3' Vieleicht mal #include "math.h" >siprintf(string,"\n\rExpander = 0x%02X, ec = %d",dataByte,ec); siprintf() kenn ich nicht. Könnte sprintf() sein ;)
siprintf macht fast das gleiche wie sprint. Aber ich habe es auch schon mit sprintf oder printf probiert, immer die gleiche Fehlermeldung.
Welche brauche ich denn noch dafür? Eigentlich doch nur die stdio.h, oder?
Höhö, und sowas nennt sich Diplomand... ;) Es geht nicht um die Include-Dateien, sondern um die Dateien die gelinkt werden, schau mal beim Aufruf des Linkers nach. Ist das ein makefile? Wie Du sehen kannst, wurden Deine Quellen ja bereits in Objektdateien übersetzt.
Ja, ich bin Diplomand, habe aber nie behauptet dass ich viel Ahnung von Mikrocontrollern habe, hoffe aber es kommt noch. Nächste Frage, was ist ein Makefile? Und kannst Du mir vielleicht auch sagen wie ich an den Linker rankomme? Weiß zwar was ein Linker ist und was er macht, aber diese (doofe) Programm ist total neu und auch nicht das Beste, aber es wurde mir halt vorgesetzt und jetzt muß ich mich da irgendwie durchbeißen. Ja, ich habe bereits Objektdateien, aber was bedeutet das für mich?
Also so wie es aussieht, fehlt die komplette Laufzeitbibliothek. Selbst die einzelne Division kann nicht gelinkt werden. Die Hitex-Tools kenne ich nicht, aber da wird scheinbar nicht mit einem Makefile gearbeitet. Das Linkerscript scheint die Datei mit der Endung .LD zu sein, aber ich schätze, da muss/sollte man auch nichts drin editieren. Schaue Dir mal eines der Examples an. Insbesondere suche mal nach Optionen/Einstellungen für den Linker. Da muss irgendwo die Laufzeitbibliothek/Runtimelibrary angegeben/angeklickt werden. Wenn Du das Projekt von null weg erstellt hast, ist's gut möglich, dass diese eben noch fehlen.
>Ja, ich habe bereits Objektdateien, aber was bedeutet das für mich?
Das der Compiler den Code übersetzen konnte.
Nur beim linken findet er dein siprintf() nicht
weil du die libc.a nicht dazugelinkt hast.
Normalerweise passiert das im makefile:
LDFLAGS += -lc
Das musst du bei deinem HiTOP auch irgendwo eintragen.
Wahrscheinlich musst du libc.a irgendwo bei den Libraries
eintragen die dazugelinkt werden sollen. Wo kann ich dir
leider nicht sagen.
Danke, jetzt läuft es, naja, es kommen zumindest keine Fehlermeldungen mehr. Ich habe einfach jeweils einen Haken bei "use gcc library", "use c library" und "use math library". Danke nochmal, alleine wäre ich da wohl nie drauf gekommen.
Das hat nichts mit Mikrocontrollern, oder I²C zu tun, sondern mit C... lege Dir mal ein gutes Grundlagenbuch zu (ist nicht böse gemeint). C hat einige Fallstricke...
Ja, das weiß ich. Das ist das große Problem, habe zwar im Studium schon mal c++ gemacht, aber auch nur ein bisschen und beim Mikrocontrollern das gleiche, nur mit ARMs habe ich noch nie was zu tun gehabt. Aber Bücher hab ich genug, nur die helfen auch nicht immer.
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.