Einbinden von weiteren C-Files in WinARM

Gast #1302502
Lesenswert?

Hallo zusammen,

ich verwende einen LPC2103 und WinARM und habe mir das folgende Projekt 
als Beispiel genommen, um mit dem Controller zu starten:

http://ieee.ucsd.edu/news/item.php?id=104

Das Programm ist wohl das Beispielprogramm von Martin Thomas, nur für 
den LPC2103 angepasst.

Nun kann ich das Programm kompilieren und es läuft auch prima, nur eine 
Sache geht nicht: Das Einbinden von anderen C-Files. Ich habe jeweils 
das C-File und ein entsprechendes Headerfile, die an sich auch korrekt 
sind. Wenn ich eine Funktion aus diesen Dateien aufrufe, hängt sich der 
Controller aber irgendwie auf.

# List C source files here. (C dependencies are automatically 
generated.)
# use file-extension c for "c-only"-files
SRC = blinky.c
#SRC =

# List C source files here which must be compiled in ARM-Mode.
# use file-extension c for "c-only"-files
SRCARM = VIClowlevel.c interrupts.c

Egal ob ich meine spi.c an SRC oder SRCARM dranhänge, das Compilieren 
klappt und beim Aufruf einer Funktion aus spi.c steigt der Controller 
dann aus. Das Problem habe ich mit allen c-Files, daher glaube ich 
nicht, dass es die Files selber sind.

Ich mache doch noch irgendwas beim Einbinden falsch, oder?
Gast #1303730
Lesenswert?

Natürlich habe ich das #include in meinem Hauptprogramm drin, sonst 
würde das Kompilieren ja bereits scheitern. Ich habe das Gefühl der 
Linker würde die Sachen nicht richtig verknüpfen und meiner Meinung nach 
müsste sich das Problem im Makefile finden lassen. Aber momentan komme 
ich da einfach nicht weiter.
Gast #1303892
Lesenswert?

Ich verwende das Makefile nicht mehr. Statt dessen verwende ich Eclipse 
mit entsprechendem Plugin, mit dem man keine Makefile mehr braucht.

Was sagt die MAP-Datei? Eventuell liegt der Startupcode an der falschen 
Stelle? Kannst du per JTAG debuggen?
Gast #1304065
Lesenswert?

Ich habe die map-Datei mal angehängt, vielleicht kannst du damit etwas 
anfangen. Auf Eclipse möchte ich mittelfristig auch irgendwann wechseln, 
nur momentan wäre mir ein funktionierendes Projekt für WinARM lieber.

Debuggen kann ich mangels JTAG leider nicht.
Angehängte Dateien:
Moderator Persönliche Seite #1304521
Lesenswert?

Das makefile basiert auf einer ziemlich alten Vorlage von mir und wenn 
ich dass richtig sehe, wurden auch einige Optionen verändert. Im 
Map-File finde ich auf Anhieb kleinen Hinweis, was aber nichts heißen 
mag, nur drübergeflogen.

Der Code von der im ersten Beitrag verlinkten Seite benutzt die 
gcc-Attributes zur Deklaration der Interruptserviceroutienen. Hatte 
damit öfter Probleme (andere wohl auch) und empfehle, stattdessen lieber 
eigene entry/exit-Macros oder noch besser einen Assembler-Wrapper zu 
verwenden.

Am Besten alle Projektdateien zusammenpacken (Quellcodes, startup-code, 
linker-script und makefile), so dass man ein make all darauf loslassen 
kann. Damit kann man (zumindest ich) dann mehr anfangen als mit 
herausgepickten Teilinformationen wie makefile und/oder map-file. Habe 
allerdings keine Hardware mit LPC2103 zum Test am "lebenden" Objekt 
(Zusendungen sind willkommen ;-) ).

Vielleicht noch hilfreich (obwohl hier ja das gcc-Forum ist): der 
Simulator von Keils uVision/RV-MDK (auch der der Eval.-Version) kann 
auch mit den von der GNU-Toolchain generierten elf-Dateien umgehen. Das 
ist ein sehr brauchbares Werkzeug, um v.a. Startprobleme auch ohne 
JTAG-Hard-/Software zu analysieren.
Gast #1305154
Lesenswert?

Hallo Martin,

anbei einmal das ganze Projekt.

Es wäre super, wenn du mir sagen könntest, wo das Problem liegt bzw. wie 
man es behebt. Ich bin auch gerne bereit, danach vielleicht zwei 
Blink-Blinkbeispiele (einmal mit, einmal ohne Interrupts) entsprechend 
zu kommentieren und dir zur Verfügung zu stellen - für den LPC2103 gibt 
es ja auf deiner Seite leider noch keine Beispiele. Vielleicht bleibt ja 
auch noch eine Platine für den LPC2103 übrig. ;-)

Danke jedenfalls schonmal.
Angehängte Dateien:
Moderator Persönliche Seite #1305191
Lesenswert?

Sodenn ich das jetzt im User-Manual auf die Schnelle richtig nachgesehen 
habe: PINSEL1 |= (1<<6) in initSP1 aufgerufen aus main schaltet Pin 0.19 
auf Funktion MISO und dieser ist damit kein GPIO-Pin mehr. Die 
Umschaltung des Pins über FIO in der Timer-ISR bewirkt dann nichts. 
Wahrscheinlich läuft das Programm, man sieht halt nur nichts mehr 
blinken. Testweise LED an anderen Pin, Code anpassen und nochmal 
ausprobieren. Falls es immer noch nicht klappt, einfach nochmal melden.
Gast #1305265
Lesenswert?

Leider ist es das nicht, das Problem habe ich auch mit anderen 
c-Dateien, die nicht auf den Pin der LED zugreifen. Ansonsten 
funktioniert das aber, zuerst die SPI-Pins zu initialisieren und danach 
trotzdem wieder auf die alte IO-Funktionalität zu wechseln. Das hatte 
ich schon getestet. Also kurzum: Egal welche Funktion ich aus einer 
externen c-Datei aufrufe, der Controller verabschiedet sich.
Gast #1308577
Lesenswert?

Danke, Martin. Momentan klappt das Kompilieren noch nicht (Fehler in 
Zeile 541 des Makefiles, Separator oder so fehlt.), aber das liegt wohl 
daran, dass es für Codesourcery geschrieben ist. Ich installiere mir mal 
die Toolchain und berichte dann.
Gast #1312468
Lesenswert?

Ganz lieben Dank, Martin. Nachdem ich Codesourcery installiert habe und 
einige Anpassungen vorgenommen habe, bis das richtige make ausgeführt 
wurde, funktioniert das Kompilieren jetzt problemlos und das Einbinden 
externer Dateien auch.
Gast #1321112
Lesenswert?

Habe bisher mit Codesourcery G++ lite und unxutils gearbeitet.
Habe jetzt einen neuen Rechner mit Vista und habe es mit cs-make 
probiert.
Da kommt allerdings direkt Gemecker.
Der Ausdruck:
1
@if [ 'x${VERBOSE}' = x ];

wird nicht erkannt.

Fehlermeldung ist:
1
"'x'" kann syntaktisch an dieser Stelle nicht verarbeitet werden.
2
cs-make: *** [gcc/startup.o] Error 255

Hat einer eine Idee, wie das in cs-make heißen muss?
Moderator Persönliche Seite #1321543
Lesenswert?

Hat wenig bis garnichts mit dem Problem des OP zu tun. Bitte in neuem 
Thread mit mehr Kontext, also Minimalbeispiel um Problem 
nachzuvollziehen und evtl. Korrekturen testen zu können.
Wie auch immer, mögliche Ursachen:
- genutzte shell unterschiedlich, vorher wahrscheinlich ein "unixoide" 
Shell, nun MS Windows cmd.com (wahrscheinlich)
- unterschiedliche Versionen von Make (unwahrscheinlich)

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