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


von Soeren G. (moeren)


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
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

von Mario (Gast)


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

von Soeren G. (moeren)


Lesenswert?

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

von Mario (Gast)


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_projects/lpc_2106_blink_switch_20060629.zip

von Soeren G. (moeren)


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:
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.

von Soeren G. (moeren)


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?

von Mario (Gast)


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_projects/lpc_2138_uart_irq_20051008.zip

von Soeren G. (moeren)


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 ?

von Martin Thomas (Gast)


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.

von Soeren G. (moeren)


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

von Martin T. (mthomas) (Moderator) Benutzerseite


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.

von Soeren G. (moeren)


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

von Moritz N. (mox-mox)


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

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
Noch kein Account? Hier anmelden.