GCC für Cortex M4: Thumb und ARM Mode

Gast #4784513
Lesenswert?

Hallo zusammen,

ich schreibe gerade an einer Assemblerfunktion für einen CortexM4 unter 
DAVE4. Normalerweise ist DAVE so konfiguriert, dass der Code in 
Thumb-Instruktionen übersetzt wird (Falg "-mthumb").

Ich stoße immer wieder auf das Problem, dass Befehle wie
"LDRSH   r4, [r0]" mit der Fehlermeldung "Thumb does not support this 
addressing mode" nicht akzeptiert werden. (Paradox: "LDRSH   r4, [r0, 
+r7]" arbeitet problemlos, benötigt aber mehr Takte)
Einige bedingte Befehle werden mit einer ähnlichen Meldung 
zurückgewiesen.
Laut der ARM-Doku sollte der o.g. Befehl auf einem Cortex M4 laufen.
(Siehe:
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0553a/BABGIFCI.html)

Momentan scheitere ich daran dem GCC mitzuteilen, dass er eine Funktion 
nicht im Thumb, sondern im ARM-(Thumb2?)Befehlsatz  erzeugen soll.

Dazu habe ich dem Assembler und C-Compiler das zusätzliche Flag
"-mthumb-interwork" übergeben.

Weiterhin habe ich in der Assemblerdatei die Optionen ".arm" und ".marm" 
getestet, leider ohne Erfolg.

.text
//.arm // Endet mit der Meldung, das es ein Thumb-only Prozessor ist
//.marm // kennt der GCC wohl nicht "unknown pseudo-op"
.global convdat
.func convdat
convdat:
LDRSH   r4, [r0]
...
.endfunc

Meine Fragen:
Liegt das Problem wirklich am Thumb-Modus?
Falls ja:
Wie kann ich dem GCC mitteilen, dass ich für die in der Assemblerdatei 
enthaltenen Funktionen den vollständigen Befehlssatz nutzen möchte?

Grüße Stephan
Gast #4784530
Lesenswert?

Stephan schrieb:
> Momentan scheitere ich daran dem GCC mitzuteilen, dass er eine Funktion
> nicht im Thumb, sondern im ARM-(Thumb2?)Befehlsatz  erzeugen soll.

Cortex M4 kann kein ARM, sondern nur Thumb2. Damit brauchst Du auch kein 
Interworking. Wenn Du irgendwo mit -mcpu den Cortex M4 angegeben hat, 
dann weiß GCC auch, daß ARM nicht geht.
Gast #4784605
Lesenswert?

Ich mach sowas als Inline-Assembler in einer C-Funktion, etwa fürs 
Startup. Da ganz normal mit ".thumb_func" ansagen, daß es Thumb ist. 
Offenbar merkt GCC von selber, daß hier Thumb2 gemeint ist, denn ich 
kann auf M4 den Befehl "ROR Rd, #imm" verwenden. Mit Thumb1 ginge aber 
nur "ROR Rd, Rs".

Ich habe aber bei den GCC-Optionen auch folgende gesetzt:
-mthumb -mcpu=cortex-m4 -mtune=cortex-m4
Gast #4784692
Lesenswert?

Hallo Nop,

die Flags -mthumb und -mcpu=cortex-m4 werden bei mir auch genutzt 
(-mtune fehlt); ich verwende eine eigene .s-Datei für alle 
Assemblerfunktionen:

uint32_t convx(uint32_t a, uint32_t b) // in einer eigenen .h-Datei

.text
.syntax unified
.global convx
.func convx
convx:
...
BX  lr
.endfunc

Ersetze ich ".syntax unified" gegen ".thumb_func" führt
"ROR r0, #2" zu der Fehlermeldung "ror #imm not supported", mit ".syntax 
unified" hingegen gibt es keinen Fehler.
Gleiches Verhalten zeigt sich, wenn ich "-mtune=cortex-m4" für Assembler 
und C-Compiler zusätzlich übergebe.
Ich verwende DAVE Version 4.2.6 .

Danke & Gruß Stephan

P.S. Ich bin bzgl. ARM-Assembler ein Anfänger.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren