Forum: Compiler & IDEs ARM7 C /C++ Compilerwahl


von Sebastian (Gast)


Lesenswert?

Hallo,
ich Programmiere normalerweise mit 8Bit AVRs oder Mototola HC08, jetzt
habe ich weil ich für ein Projekt mehr leistung brauche mal ein
Demoboard mit einem LPC21xx bestellt.
Jetzt suche ich halt noch einen C compiler der mir das leben nicht ganz
so schwer macht.
Es gibt ja das WinARM Packet und das GNUArm Packet, was sind da die
unterschiede, welchen sollte man vorzugsweise benutzen ohne das man 1/2
Jahr später bei einem neuen Release seinen Code Verändern muss.
Bei so einem Comtroller würde ich auch gerne in C++ programmieren, da
kann man sich viel verwaltungsaufwand sparen.
Der ARM sollte ja eine ähnliche Architektur wie der HC08 haben, also
einen Linearen Adressraum wo man mit dem Gleichen Pointer im Ram und im
Flash lesen/schreiben kann. Nur wie mache ich das wenn ich beim LPC von
einer ungeraden adresse lesen/schreiben muss? beim HC08 kann ich
überall im 16bit adressraum lesen und schreiben ohne das es probleme
gibt.
Wie funktioniert die Interruptverarbeung bei den GCC ARM compilern? Das
wird ja bei jedem Controller anders gehandelt.

Sebastian

von Peter Dannegger (Gast)


Lesenswert?

"Das wird ja bei jedem Controller anders gehandelt."

Genau das ist das hüpfende Komma !!!

z.B. der ARM7 von Philips hat nur 2 Interruptprioritäten.
Der ARM7 von ST hat 17 Prioritäten, dafür muß man aber auch erstmal 37
Seiten im Reference-Manual durchackern !

Den ganzen Interruptmist muß man also wohl oder übel selber machen. Ich
glaube kaum, daß es einen Interrupt-Wizard gibt, der einem die Arbeit
abnimmt.


Der Philips hat 32Bit-Timer (keine Counter !), der ST
16Bit-Timer/Counter
Auch ADC, CAN, UART usw. sind völlig unterschiedlich !

Kurz und gut, ARM7 sind untereinander so völlig unterschiedlich, wie
ich es noch bei keinem andern µC erlebt habe.



Die Philips ARM habe ich mit der kostenlosen Keil µVision programmiert,
ging auf Anhieb.

Das GCC-Geraffel, wie es im Wiki steht, ging garnicht, nach etwa 2
Tagen vergeblichen Installationsversuchen habe ich aufgegeben.


Das Philips-CAN ist, gelinde gesagt, sehr gewöhnungsbedürftig, seine
SJA1000- oder AT89C51CC01-Erfahrungen kann man getrost über Bord
schmeißen.


Peter

von Sebastian (Gast)


Lesenswert?

@Peter
hast du den GCC compiler mit der µVision IDE verwendet, oder die
µVision  mit dem Keil C compiler der ja lt. Keil Page auf 16K objekt
code begrenzt ist.
http://www.keil.com/demo/eval/arm.htm

Sebastian

von Peter D. (peda)


Lesenswert?

Wenn ich das richtig gelesen habe, ist nur der Debugger auf 16k
begrenzt.

Das Umschalten geht in den Einstellungen, dann kriegst Du erstmal
tonneweise Fehlermeldungen.

Ist aber kein Problem, Du must nur den passenden Startup-Code in Dein
Projekt kopieren (die Assembler haben eine unterschiedliche Syntax).


Peter

von Sebastian (Gast)


Lesenswert?

Keil Website unter Limiations:
The CARM compiler, assembler, and linker are limited to 16K Bytes of
object code. Source code may be of any size.

das heisst für mich, das der Compiler in der summe nur object files
erzeugt die 16K nicht überschreiten.
Und in den Object files steht je für gewöhnlich der Asm Code drin.

Ich habe mit jetzt mal die demo von Keil und Iar und GCC-ARM gezogen,
mal schauen ob der IAR wiklich so viel besser ist wie auf der IAR.com
seite in dem tollen diagramm dargestellt.
http://www.iar.com/FilesPublic/EW/002288/Benchmark-EWARM-420.pdf

da macht ja der GCC über 200% mehr code als der IAR, und das heisst
schon was. Aber das werde ich nach dem selber testen ja sehen ob sich
das wirklich so stark auswirkt.
Be IAR gibt es übrigends ne 32K demo für den ARM7.

Sebastian

von A.K. (Gast)


Lesenswert?

> Nur wie mache ich das wenn ich beim LPC von
> einer ungeraden adresse lesen/schreiben muss?

Sinnvollerweise garnicht.

Wenn Du es nicht grad explizit darauf anlegst, dann wird das nicht
passieren. Der Compiler legt die Variablen so an, dass dies nicht
notwendig ist.

von mthomas (Gast)


Lesenswert?

>Es gibt ja das WinARM Packet und das GNUArm Packet, was sind da die
>unterschiede, welchen sollte man vorzugsweise benutzen ohne das
>man 1/2 Jahr später bei einem neuen Release seinen Code Verändern
>muss.

Es gibt noch ein paar mehr Packete (z.B. tantos, codesourcery).

WinARM hatte ich seinerzeit erst nur fuer den Eigenbedarf
zusammengebastelt, um eine zu WinAVR vergleichbares Packet fuer ein
LPC2106-Demoboard zu haben. Ein paar Unterschiede (bin bei GNUARM mglw.
nicht auf neuestem Stand):

- GNUARM wird fuer Unix/Linux- und MS-Windows-"Hosts" bereitgestellt
WinARM nur fuer MS-Windows
- GNUARM braucht die Cygwin-DLLs, WinARM nicht
- GNUARM unterstuetzt in der aktuellen Version mehr Sprachen, WinARM
nur C und C++
- GNUARM enthaelt den akutellen insight-gdb, WinARM eine alte Version,
die allerdings keine cygwin-DLLs braucht.
- die newlib ("glibc fuer embedded") ist bei WinARM so compiliert,
dass "reentrant"-Syscalls genutzt werden, bei GNUARM soweit ist weiss
fuer "nicht-reentrant"-Syscalls. Grund war urspuenglich, dass die
newlib-lpc "reentrant"-Syscalls bereitstellt.
- WinARM enhaelt die benoetigten Tools (make, sh)  zum "Direktstart"
- vergleichbar WinAVR. GNUARM wurde wohl fuer den Betrieb unter cygwin
entwickelt, cygwin enhaelt diese Tools schon.
- Programmer-Notepad als IDE/Editor bei WinARM enthalten - wieder
vergleichbar WinAVR.
- die newlib-lpc wird bei WinARM fertig compiliert mitgeliefert. Das
sind die von newlib benoetigten Syscalls (fuer malloc etc.) fuer
Philips LPCs und etwas "Zubehoer" (relativ leicht an andere ARMs
anpassbar). Kein "Geraffel" mehr notwendig.
- in WinARM habe ich einige meiner Beispiele dazugepackt (oft nur
angepasste Versionen von Beispielen aus dem Netz) - als "Eisbrecher"
(makefiles, linker-skripts, startup-code). Im Moment alles LPC2106 und
LPC2129-lastig, andere Controller habe ich bisher nicht zum Testen. Die
ungetesteten Beispiele fuer ST und AT91SAM7 wollte ich nicht beilegen.
Die meisten Beispiele liegen aber auch einzeln auf der
"WinARM-Seite".
- GNUARM kommt mit einem Installationsprogramm, WinARM nicht. Man muss
zur WinARM-"Installation" allerdings nur den Systemsuchpfad
erweitern.
- WinARM kommt mit Maurers lpc21isp fuer LPC-Flashprogrammierung ueber
UART und dem Bray-Terminal. Kann man beides bei Nutzung von GNUARM aber
auch selbst leicht nachinstallieren

Auch wenn die Auflistung der Unterschiede etwas lang ist, tatsaechlich
"merkt" man davon wahrscheinlich beim eigentlichen Entwickeln nur
noch wenig.

>Bei so einem Comtroller würde ich auch gerne in C++ programmieren,

Zumindest mit WinARM hab' ich damit rumgespielt - funktioniert. Leider
werden die Binaerdateien bei Nutzung der stdlibc++ (new, delete etc.)
recht gross, dazu bisher noch keine Abhilfe gefunden.
arm-elf-g++-Beispiele zur "Inspiration" sind auch duenn gesaeht.

>Der ARM sollte ja eine ähnliche Architektur wie der HC08 haben, also
>einen Linearen Adressraum wo man mit dem Gleichen Pointer im Ram und
>im Flash lesen/schreiben kann. Nur wie mache ich das wenn ich beim
>LPC von einer ungeraden adresse lesen/schreiben muss?

Ja Adressraum ist "linear". Aber Flash-schreiben ist nicht so einfach
moeglich und sehr vom Hersteller/Controller abhaengig. Was "ungerade
Adressen" betrifft, habe ich zumindest bei den LPCs nicht besonderes
bemerkt - einfach Pointer dereferenzieren hat bisher funktioniert.

>Wie funktioniert die Interruptverarbeung bei den GCC ARM compilern?
>Das wird ja bei jedem Controller anders gehandelt.

Jein. Peter Dannegger hat dazu ja schon einiges geschrieben.
FIC und SWI scheinen bei ST/AT91/LPC identisch zu funktionieren.
IRQ/Vectored-Interrupt wohl nach Peters Erläuterungen nicht. Es gibt
auch Texte/Beispiele zu "Nested Interrupts" - aber bisher nie
ausprobiert. Alte arm-elf-gcc-Versionen hatten Fehler bei der
Generierung von Interrupt-Code (Fkt. mit Attribute "IRQ"/interrupt),
das scheint in den aktuelleren Versionen (>=3.4.2) behoben (vgl.
gcc-Bugtracker). Einige Entwickler haben sich damit beholfen, die ISRs
mit Attribut "nacked" zu versehen und die notwendigen "ISR-Befehle"
mittels (inline-)Assembler einzubinden (vgl. FreeRTOS), sollte aber
inzwischen nicht mehr notwendig sein. Der Unterschied zum Keil-Compiler
scheint, was die Deklaration von ISRs betrifft nur Syntax. Allerdings
kann man beim Keil-Compiler (nicht dem gcc von Keil) wohl ARM und
Thumb-Code ("Interwork") in einer Quellcodedatei mischen, das ist
beim gcc soweit ich weiss nicht moeglich. ISRs sind beim gcc im
ARM-Mode zu kompilieren und damit gegebenenfalls in einer "extra
Datei".

Soweit fuer's Erste - hoffe, es bleibt nicht allzuviel offen.
Martin Thomas

von Michael Oberberger (Gast)


Lesenswert?

Habe jetzt mal das WinArm Paket ausprobiert (gcc 4.0.0) mit dem LPC2106
bzw. LPC2138.
Hab jetzt ein Problem mit dem ARM-Thumb-Interwork, welches mit dem GCC
3.3.4 nicht vorhanden war.
Sobald ich aus einer ISR eine Funktion aus einem Modul, das im
Thumb-Mode kompiliert ist aufrufe, schmiert das ganze System ab. Der
Rücksprung aus der ISR geht dann meist schief. Komischerweise passiert
das nur, sobald eine Optimierungsstufe aktiv ist, also bei -O0 funzt
es.
Und auch ohne -thumb-interwork geht es.
Weist Du was von diesem Problem, oder stell ich mich so blöd an?

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.