www.mikrocontroller.net

Forum: Compiler & IDEs Einbinden von weiteren C-Files in WinARM


Autor: Christoph (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Christoph (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Keiner eine Idee? Eigentlich müssten andere doch auch schon vor dem 
Problem gestanden haben und es hinbekommen haben, gerade weil es ja das 
Makefile aus vielen der Beispiele von WinARM ist.

Autor: Tilo L. (katagia)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du hast schon in deinem Hauptprogramm ein "#include spi.h" drin stehen? 
Woher soll dein Hauptprogamm die Funktionen kennen?

Autor: Christoph (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Tilo L. (katagia)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Christoph (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: Christoph (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Und hier noch das Makefile. Wäre super, wenn du oder jemand anders mir 
erklären könnte, was ich eventuell ändern muss.

Danke schonmal.

Autor: Martin Thomas (mthomas) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Christoph (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: Martin Thomas (mthomas) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Christoph (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Martin Thomas (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Etwas zum Ausprobieren im Anhang.

Autor: Christoph (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Christoph (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Martin Thomas (mthomas) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Freut mich, dass es geholfen hat. Betr. Codesourcery G++ Installationen 
auf MS-Windows und "make": einfach statt make cs-make verwenden. 
Zumindest unter Windows sollte allein die CS G++ lite f. arm-eabi 
Installation für ein "cs-make all" reichen.

Autor: N00b (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
@if [ 'x${VERBOSE}' = x ];

wird nicht erkannt.

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

Hat einer eine Idee, wie das in cs-make heißen muss?

Autor: Martin Thomas (mthomas) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.