mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik arm code mit arm-elf-gcc compilieren


Autor: Soeren G. (moeren)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aslo folgendes, ich habe mir einen LPC2148 bestellt, ist zwar noch nicht 
da, wollte aber schonmal was testweise compilieren, hab bisher immer nur 
avr atmega's verwendet und hab es mit dem AVR-GCC compiliert.
Das sah immer wie folgt aus:

%avrdir%\bin\avr-gcc.exe -c %progdir%\main.c -o %progdir%\main.o -Os -g 
-mmcu=%2
%avrdir%\bin\avr-gcc.exe %progdir%\main.o -o %progdir%\main.elf -mmcu=%2
%avrdir%\bin\avr-objcopy.exe -j .text -j .data -O ihex 
%progdir%\main.elf %progdir%\main.hex

Nicht wundern über die Variablem, ich hab mir dafür ne schöne Batch 
geschriebn. Jedenfalls dachte ich, ist ja auch nen GCC also müsste es so 
funktionieren.

%armdir%\bin\arm-elf-gcc.exe -c %progdir%\main.c -o %progdir%\main.o -Os 
-g -mmcu=%2
%armdir%\bin\arm-elf-gcc.exe %progdir%\main.o -o %progdir%\main.elf 
-mmcu=%2
%armdir%\bin\arm-elf-objcopy.exe -j .text -j .data -O ihex 
%progdir%\main.elf %progdir%\main.hex

Jedoch sagt er mir nach dem mir dann der er -mmcu.. net kennt, also hab 
ich erstmal testweise rausgenommen und bekomme dann aber bem 2ten Befehl 
die meldung vom Linker:

d:/programme/winarm/bin/../lib/gcc/arm-elf/4.1.1/../../../../arm-elf/lib 
\libc.a(
exit.o): In function `exit':
exit.c:(.text+0x28): undefined reference to `_exit'

Ich habe für das Prog folgenden Code verwendet

#include <arch/philips/lpc214x.h>
 
int main( void )
{
  int i;
  GPIO0_IODIR |= ( 1<<25 ); // Pin 25 auf Ausgang
  GPIO0_IOSET  = ( 1<<25 ); // Pin 25 auf HIGH schalten
 
  for( i = 0; i < 300000; i++ ){ // Etwas warten
    asm volatile("nop");
  }
 
  GPIO0_IOCLR = ( 1<<25 );  // Pin 25 auf LOW schalten
 
  while( 1 ){  // Endlos-Schleife
  }
  return 0;
}

Habe mir auch das ARM-elf-GCC-Tutorial angeschaut, allerdings konnte mir 
das nicht helfen, aber es verwieß auf das AVRC-GCC-Tutorial, aber alles 
was ich daraus gewinnen konnte war ja schon in meiner Batch datei, 
deshalb weiß ich jetzt nicht wirklich weiter.

Wenn der ARM-GCC mmcu nicht kennt muss ich ihm ja irgendwie anders sagen 
was für ein ARM es ist.

Kann mir jemmand helfen ?
Danke im Voraus,
MfG Sören

Autor: Mario (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Sören,
es sieht so aus, dass Du keine Start-Datei (crt0.s) eingebunden hast.
Dort ist exit definiert. Nimm das Beispiel lpc2106_blink_switch und 
tausche die Datei main.c gegen Deine einfach aus und compiliere dieses 
dann.
Gruß Mario

Autor: Soeren G. (moeren)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hab mit diesen .S dateien noch nie gearbeitet, wie bind ich die ein 
?

Autor: Mario (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ist ein Assembler-File - es wird zum initialisieren des LPCbla 
benötigt.
Ebenfalls ist ein Linker-File (LPC2106-ROM.ld) erforderlich. Beide 
Dateien sind im Ordner build. Compilieren bitte mit make nicht mit einer 
selbstgebastelten BAT-Datei. Hier der Link zum Blink-Projekt.
Zuerst mal ohne Veränderungen mit "make all" in der Console compilieren, 
damit Du sicher bist, dass der Compiler richtig installiert ist.

http://www.siwawi.arubi.uni-kl.de/avr_projects/arm...

Autor: Soeren G. (moeren)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die Antwort.

Und was den Batchfile angeht, den hab ich geschrieben weil ich auch von 
makefiles keine Ahnung hab.
So, ich benutzt den Dev-Cpp und hab gnuarm als compiler eingestellt wenn 
ich nun versuch das projekt zu compilieren sagt er mir:
Compiler: arm gcc
Führt  make... aus
make.exe -f "Makefile" all
Das System kann den angegebenen Pfad nicht finden.

ECHO ist ausgeschaltet (OFF).

"-------- begin (mode: ROM_RUN) --------"

arm-elf-gcc (GCC) 4.1.0
Copyright (C) 2006 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

"-f" ist syntaktisch an dieser Stelle nicht verarbeitbar.

make.exe: *** [sizebefore] Error 255

Ausführung beendet

Wobei ich mich jetzt frage welche datei er nicht findet, weil make kann 
es ja nicht sein weil das danach nen fehler liefert.

Autor: Soeren G. (moeren)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
komisch, ich bin nicht berechtigt meinen eigenen Beitrag zu editieren?

Naja egal, also ich hab mal die pfade im compiler überprüft und mir ist 
aufgeallen das der Pfad zu den utils falsch war. Jetzt konnte er es 
compilieren.

Wenn ich das Programm nu anpassen will das es auch unterm LPC2148 läuft 
muss ich ja sicher die angabe "SUBMDL" im makefile anpassen und den 
richtigen header angeben.
Muss ich auch noch die ld oder s datei gegen irgendeine austauschen ? 
oder sollte das so gehen?

Autor: Mario (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
richtig SUBMDL = LPC2148
die crt0.s ist für alle LPC21xx gleich.
die .ld-datei muss natürlich für den LPC2148 genommen werden.
im Beispiel unten einfach alles was 2138 heißt in 2148 umbenennen.
Es läuft aber auch ohne Änderungen auf dem LPC2148 da die 
Speicherdimensionen von beiden gleich sind.

http://www.siwawi.arubi.uni-kl.de/avr_projects/arm...

Autor: Soeren G. (moeren)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hmm fast, aber jetzt sagt er mir "cannot find -lnewlib-lpc" und ich hab 
nach ner newlib gesucht, hab aber weder ne .a noch ne .lib irgendwo 
gefunden. Was nun ?

Autor: Martin Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das letztgenannte Beispiel sollte newlib-lpc auskommen. Testweise im 
Makefile in die Zeile NEWLIBLPC = -lnewlib-lpc per Doppelkreuz davor 
auskommentieren.

newlib-lpc von Aelus kommt vorkompiert mit meinem WinARM-Packet und ist 
abgelegt im Standardsuchpfad. Es ist eine Sammlung von newlib-syscalls 
für LPC2000 (<23xx). Das Bespiel sollte zumindest planmäßig keine 
Abhängigkeit zu newlib-lpc aufweisen.

Autor: Soeren G. (moeren)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hat funktioniert, damit bedanke ich mich nochmal bei den Leuten die mir 
geholfen haben, endlich kann ich mal nen paar Testprogramme für den Arm 
schreiben und mal sehen was bei rauskommt.

Aber eins würde mich noch interessieren, nämlich, wo bekomme ich die 
libnewlibc-lpc.a eigentlich her ? hab se nirgendso gefunden.

MfG Sören

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

Bewertung
0 lesenswert
nicht lesenswert
Soeren G. wrote:
> Aber eins würde mich noch interessieren, nämlich, wo bekomme ich die
> libnewlibc-lpc.a eigentlich her ? hab se nirgendso gefunden.

Steht oben: fertige Library ist in meinem WinARM Packet enthalten 
(20060606 immer noch die aktuelle "offizielle" Fassung).

Ansonsten: google -> newlib-lpc -> erster Treffer ->
http://www.aeolusdevelopment.com/Articles/download.html

Von dort Quellcode herunterladen und selbst zusammenbauen. Makefiles 
liegen bei (sind aber recht "speziell", habe andere genutzt).

Funktion von newlib-lpc stellt aber gewisse Anforderungen an die 
Konfiguration der Toolchain (genauer der newlib). Dies ist einer der 
Gründe, warum die Konfiguration der Tools in WinARM so ist wie sie ist 
und etwas von der Konfiguration anderer vorgefertigter Packete (z.B. 
Yagarto) abweicht.

Autor: Soeren G. (moeren)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Achso, ich hatte gehofft das ich irgendwo die bereits compilierte .a 
runterladen kann. Naja ich hoffe ich bekomme die lib wenn ich sie 
brauche compiliert.

Aber trotzdem danke.

MfG Sören

Autor: Moritz Nöltner (mox-mox)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hmm, ist zwar schon ne weile her, dass der letzte Post kam, aber kann 
mir einer von euch sagen, wo die ganzen Dateien von der newlib-lpc dann 
hinmüssen, wenn man sie denn compiliert hat? Ich benutze GNU-ARM auf 
einem Ubuntu-System (nach diesem Tutorial installiert: 
http://wiki.ubuntuusers.de/GNU_arm-toolchain ), und hab ehrlich gesagt 
keinen blassen Schimmer, wo die Sachen hingehören.
(Ich weis, dass es einen Weg gibt, das rauszufinden, aber bis jetzt habe 
ich ihn nach einer ganzen Menge suchen nicht gefunden)
Gruß,
Mox

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.