Forum: Compiler & IDEs Frage zu Linkerscript für ARM-gcc


von Tobias P. (hubertus)


Lesenswert?

Hallo,
ich bin gerade dabei, mich mal in die ARM-Welt einzuarbeiten.
Als C/C++ IDE verwende ich Dev-Cpp, das ich nach dem Tutorial hier 
eingerichtet habe ("Dev-Cpp für ARM-gcc einrichten"). Nun, um den C- 
oder C++ Code zu linken und den richtigen Startup Code einzubinden, 
braucht man ja das richtige linker script (oder könnte man den 
Startup-Code auch in die Quelldateien rein nehmen?).
Gibts da irgendwo schon fertige Linkerscripts, die zu meinem Controller 
passen? Man muss die ja irgendwie in verschiedene 'sections' 
unterteilen, soviel ich aus der Datei rauslesen konnte.
Leider ist das ganze alles sehr kryptisch für mich, da ich den gcc und 
seine diversen Tools überhaupt nicht kenne. Am liebsten wäre mir ja eine 
IDE wie Crossworks oder sowas, aber die sind ja alle unbezahlbar...

Also, könnt ihr mir mit meinen Linkerscripts weiterhelfen? Wäre echt 
genial!

Grüsse
   Tobias

von let (Gast)


Lesenswert?

Ich würde vorschlagen mit einem fertigen Demoprojekt zu
beginnen. Solche Projekte findest du auf der WinARM
Seite zumindest für LPC, AT91S und STM32. Luminary hat eine eigene 
Beispielsammlung für die Toolchain von Codesourcery (GCC).

Die Crossworks IDE gibt es in einer non-commercial Version
für ~100€. Du solltest dir aber vorher diese 30 Tage Testversion
besorgen. Ich finde die Entwicklungsumgebung ist sehr gewöhnungs-
bedürftig.

von Tobias P. (hubertus)


Lesenswert?

Hallo let,

danke erstmal für die Info.
Hmm, die Crossworks IDE machte auf mich eigentlich einen guten Eindruck. 
Ich wollte mir erst die neuste Version kaufen, für eben diese 100 €. 
Aber dann habe ich von einem Freund erfahren, dass er noch Version 1.5 
hat und die ncht mehr braucht, also hab ich jetzt Version 1.5 
(Vollversion).
Das Problem ist jetzt das folgende:
Wenn ich da ein neues Projekt erstelle, dann kann ich den Zielprozessor 
angeben. Leider ist in der Liste mein LPC2468 nicht vorhanden. Kann ich 
dennoch für den '2468er Code erzeugen, wenn ich einfach ein 'leeres' 
Projekt erstelle und dann halt einfach den Startup-Code etwas anpasse?

Gruss
    Tobias

von let (Gast)


Lesenswert?

Was hast du denn bei einem leeren Projekt für einen Startup-Code?
Du kannst dir irgendeinen Controller der 23xx/24xx Reihe
aussuchen. Die unterscheiden sich zunächst nur in der Speichergröße.
Bei den 21xx Typen wird es etwas schwieriger Anpassungen vorzunehmen
da die einen anderen Interruptcontroller haben und die PLL anders
konfiguriert werden muß.

Wenn ich mich recht erinnere sind die ISRs bei Rowley 'naked functions'
die mit entry- und exit Makros versehen werden. Dann sollte es
genügen im Startcode die Adresse vom VIC zu ändern.
Deine ISRs müßtest du dann aber wohl von Hand beim VIC eintragen
weil ein evtl. vorhandenes 'install_irq()' nicht funktionieren
dürfte.
Wenn die PLL im Startcode initialisiert wird, ist es wohl das
Einfachste den asm Teil zu löschen und die PLL später in C
einzurichten.

Ansonsten: WinARM bzw. Yagarto funktioniert ganz prima mit Eclipse ;)

von Tobias P. (hubertus)


Lesenswert?

hallo let,
der Startupcode für ein 'Standard-Project' ist im Anhang.
Im Moment werde ich irgendwie nicht so richtig schlau daraus....

Tja, Yagarto habe ich mir in Eclipse einzurichten versucht. Gibt ein 
Tutorial auf der Seite von Yagarto.
Aber ich habs nach ca. 3 Stunden aufgegeben... Irgendwie lässt sich das 
Zeug nicht compilieren, anscheinend findet er den gcc nicht (obwohl ich 
den richtigen Pfad eingetragen habe). Und C++ Code geht offenbar gar 
nicht....
Ausserdem muss ich da ja immer von Hand ein Makefile schreiben?! DAS 
geht ja wohl gar nicht. Die ganze Syntax dafür kann ich mir ja nie 
merken... Da ist mir Rowley schon lieber. Neue Codedatei hinzufügen, auf 
compile klicken, und am Schluss habe ich eine fertige hex-Datei. Bei 
Eclipse hingegen - Code schreiben, makefile schreiben, linkerscript 
schreiben, ... mutet mir ziemlich kompliziert an. Oder habe ich was 
falsch verstanden?

Grüsse
   Tobias

von Tobias P. (hubertus)


Angehängte Dateien:

Lesenswert?

Ups, Anhang vergessen... ;)

von Tobias P. (hubertus)


Angehängte Dateien:

Lesenswert?

Und diese Datei wird auch noch verwendet im Standard-Project.

von let (Gast)


Angehängte Dateien:

Lesenswert?

Da fehlt die Unterstützung für den VIC und die PLL wird
auch nicht angetastet. Es werden also keine Interrupts
unterstützt und der Kern läuft nur mit 4MHz.

Mit C++ habe ich auf dem ARM7 noch nichts gemacht aber ich nehme
an das new und delete bei Yagarto nicht definiert sind. Auch
fehlt in den Beispielen von WinARM die ich mir angesehen habe die 
Initialisierung von Objekten.
Dynamische Speicherverwaltung ist auf einem µC ohnehin bedenklich.
Der Fehlende Code im Startcode sollte eigentlich kein Problem
sein.

Was man bei Yargarto & Co braucht ist eine solide Basis aus
Makefile, Startcode und Linkerscript. Das gibt es alles schon
fertig in den Beispielen. Wenn eine neue Datei hinzu kommt,
wird die einfach in das schon vorhandene Makefile eingetragen:
1
SRC += datei.c
Das ist es eigentlich alles.

Wegen Eclipse:
Du mußt den arm-elf-gcc bzw. arm-eabi-gcc (Codesourcery) von der
Kommandozeile aus aufrufen können, sonst stimmt der Pfad nicht.
Make muß natürlich auch gehen. Bei irgendeiner Yagarto Version
war/ist kein make dabei. Das ist in einem anderen Paket enthalten.

Ich habe mal ein Projekt für den LPC2368 angehängt. Das sollte
auf dem 2468 auch laufen. Wenn Yagarto richtig installiert ist
sollte sich das von der Kommandozeile direkt mit 'make'
übersetzen lassen (danach bitte ein 'make clean').
Um jetzt darauf basierend ein neues Projekt mit Eclipse anzulegen,
muß ein neues 'Makefile project' erzeugt werden. Anschließend
werden unter File->Import->File_system die Dateien und Ordner
des Demoprojekts in das neue Projekt kopiert.
Dann gibt es irgendwo auf der Eclipse Oberfläche einen Reiter
'Make targets'. Dort mit der rechten Maustaste beigehen und
'Add target' auswählen. Der Name ist 'all' und das target
ebenfalls 'all'. Dann noch das gleiche für 'clean' und ferig.
Ein Doppelklick auf 'all' sollte nun den Compiler anwerfen.

Zugegeben, mit einem Wizard ist das vielleicht etwas einfacher
aber am Ende macht der nichts anderes. Nur gerlernt hat man
dann nichts.

Das Projekt stammt übrigens im wesentlichen aus der Sammlung
von Martin Thomas. Ich habe das lediglich etwas verunstaltet,
allerdings ohne die Änderungen zu kennzeichnen. Wenn etwas nicht
geht liegt das an mir.

von Tobias P. (hubertus)


Lesenswert?

hallo let,
sorry, ich hab versehentlich die Benachrichtigung deaktiviert und 
deshalb deinen Beitrag erst jetzt gesehen.
Herzlichen Dank für die Anleitung & den Code!
Ich wills nochmal mit Eclipse versuchen ;)
Hmm, schade dass mit C++ nichts wird. Ich dachte mir nämlich, ich könnte 
für jedes Device, das ich am Bus habe, eine eigene Klasse definieren und 
dort alle Funktionen etc. zusammenfassen, die man dafür braucht. Dadurch 
würde alles ein bisschen modularer ;) Und das Programmieren könnte man, 
wenn man 'gescheite' Klassen hat, sicher so vereinfachen, dass man am 
Schluss wie auf dem PC Dateien verwalten kann oder über LAN irgendwas 
tun kann. Mit C wirds halt ein bisschen umständlicher, geht aber genauso 
;)
Grüsse aus der Schweiz
     Tobias

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.