Forum: Digitale Signalverarbeitung / DSP / Machine Learning GCC für Cortex M4: Thumb und ARM Mode


von Stephan (Gast)


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

von Nop (Gast)


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.

von Stephan (Gast)


Lesenswert?

Danke! Wie signalisiere ich dann dem GCC, dass ich Thumb2 nutzen möchte?
Das Flag ".thumb" in der .s-Datei scheint der GCC zu kennen, ".thumb2" 
hingegen nicht.

Gruß Stephan

von (prx) A. K. (prx)


Lesenswert?

.syntax unified

In der ursprünglichen von ARM definierten Asm-Syntax (divided) gibts nur 
ARM und Thumb, nicht aber Thumb2.

: Bearbeitet durch User
von Stephan (Gast)


Lesenswert?

Herzlichen Dank! Endlich funktionieren alle Befehle!

Gruß Stephan

von Nop (Gast)


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

von Stephan (Gast)


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.

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.