www.mikrocontroller.net

Forum: Compiler & IDEs Assembler Problem in GCC


Autor: Flosch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Leute ich will ein Programm für einen ARM9 Cross kompilieren. Das
Programm ist für die Ansteuerung einer I2S Schnittstelle (gibt es zum
Runterladen von Atmel!)

Jetzt gibt es da zwei ASM Files die ich einbinden muss die allerdings
für Green Hill geschrieben sind. Jetzt versuche ich die beiden Files
für GCC umzuschreiben. Ok nun mein Problem:

Der Compiler gibt mir folgenden Fehler aus:

irq_ghs.s: Assembler messages:
irq_ghs.s:28: Error: bad instruction `arm_mode_user 0x10'
irq_ghs.s:29: Error: bad instruction `arm_mode_fiq EQU 0x11'
irq_ghs.s:30: Error: bad instruction `arm_mode_irq EQU 0x12'
irq_ghs.s:31: Error: bad instruction `arm_mode_svc EQU 0x13'
irq_ghs.s:32: Error: bad instruction `arm_mode_abort EQU 0x17'
irq_ghs.s:33: Error: bad instruction `arm_mode_undef EQU 0x1B'
irq_ghs.s:34: Error: bad instruction `arm_mode_sys EQU 0x1F'
irq_ghs.s:36: Error: bad instruction `i_bit EQU 0x80'
irq_ghs.s:37: Error: bad instruction `f_bit EQU 0x40'
irq_ghs.s:38: Error: bad instruction `t_bit EQU 0x20'
asm_isr.s: Assembler messages:
asm_isr.s:39: Error: Unknown pseudo-op:  `.import'
asm_isr.s:43: Error: bad instruction `irq_entry '
asm_isr.s:49: Error: bad instruction `irq_exit '


Im Programm sehen die Zeilen folgendermaßen aus:

irq_ghs.s:

ARM_MODE_USER           EQU     0x10
ARM_MODE_FIQ            EQU     0x11
ARM_MODE_IRQ            EQU     0x12
ARM_MODE_SVC            EQU     0x13
ARM_MODE_ABORT          EQU     0x17
ARM_MODE_UNDEF          EQU     0x1B
ARM_MODE_SYS            EQU     0x1F

I_BIT                   EQU     0x80
F_BIT                   EQU     0x40
T_BIT                   EQU     0x20

asm_isr.s

39: .import AT91F_I2S_Handler

in Zeile 43 und 49 werden jeweils nur die Makros aufgerufen die in
der irq_ghs.s stehen.

So und jetzt die Fragen:

Weis jemand, wie ich die Variablen in irq_ghs.s deklarieren muss, damit
ich den Fehler nicht mehr bekomme?
Hat irgendjemand eine Idee was ich für den .import Befehl benutzen
kann?
Und zu guter letzt: Wie kann ich ein Makro aufrufen?

Danke für die Hilfe

Flosch

Autor: Werner B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Soweit ich mich erinnere gehen die .s files vorher durch den C
präprozessor, also einfach

z.B.

#define T_BIT 0x20

Autor: Jörg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Erstens: Manual zum GNU Assembler (GAS) lesen.

Außer dem CPP-Makro wäre noch die Assembler-Variante:

label: .def value

Autor: Willi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

am einfachsten:

.equ ARM_MODE_USER, 0x10
usw.

Dies definiert schon mal Deine Variablen.

Mit dem Import und dem Makroaufruf kann ich Dir leider auch nicht
weiterhelfen.

Viele Grüße

Willi

Autor: Flosch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ersteinmal Danke für die schnellen Antworten.

Der Tip von Willi hat funktioniert. Jetzt habe ich nur noch das Problem
mit dem Import und den Aufruf der Variablen!

Irgendjemand eine Idee?

Autor: Jörg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, s.o.: RTFM.

Was soll den .import original mal bewirkt haben?  Möglicherweise
suchst du ja #include?

Autor: Flosch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So habe mal die Fehler etwas eingeschränkt,

ich habe die Makros einfach in das andere File kopiert und siehe da ich
habe zwei neue Fehler.

Als ich diesen beiden auf den Grund gegangen bin, habe ich
festgestellt, dass die Befehle #include "AT91RM9200_inc.h" #include
"irq_ghs.s" nicht gehen. Darum hat er auch die Makros nicht
gefunden.

Hat irgendjemand eine Alternative parat?

@Jörg:

was das .import gemacht hat weis ich leider auch nicht, ich habe ja das
Programm nicht geschrieben. Ich habe es jetzt einfach mal auf .global
gesetzt und bete, dass es funktioniert ;-)

Viele Grüße und danke nochmals

Flosch

Autor: Jörg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Benenne die Datei mit dem Suffix .S (großes S), damit sie der
C-Compiler erst durch den Präprozessor und dann durch den
Assembler zieht.  Entscheidend ist die Schreibweise auf der
Kommandozeile des Compilers.

Autor: Flosch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok das wars funktioniert. Ich hatte sie .s und nicht .S genannt.

Was so ein kleines oder großes S alles ausmachen kann;-)

Danke für die super schnelle Hilfe.

Viele Grüße

Florian

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.