arm code mit arm-elf-gcc compilieren

OP #880345
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
1
#include <arch/philips/lpc214x.h>
2
 
3
int main( void )
4
{
5
  int i;
6
  GPIO0_IODIR |= ( 1<<25 ); // Pin 25 auf Ausgang
7
  GPIO0_IOSET  = ( 1<<25 ); // Pin 25 auf HIGH schalten
8
 
9
  for( i = 0; i < 300000; i++ ){ // Etwas warten
10
    asm volatile("nop");
11
  }
12
 
13
  GPIO0_IOCLR = ( 1<<25 );  // Pin 25 auf LOW schalten
14
 
15
  while( 1 ){  // Endlos-Schleife
16
  }
17
  return 0;
18
}

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
Gast
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
Gast
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_projects/lpc_2106_blink_switch_20060629.zip
OP
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:
1
Compiler: arm gcc
2
Führt  make... aus
3
make.exe -f "Makefile" all
4
Das System kann den angegebenen Pfad nicht finden.
5

6
ECHO ist ausgeschaltet (OFF).
7

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

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

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

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

19
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.
OP
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?
Gast
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.
OP
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
Moderator Persönliche Seite
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.
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

Eine eigene Frage? Dieser Thread ist über 18 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.