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
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.
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
.syntax unified In der ursprünglichen von ARM definierten Asm-Syntax (divided) gibts nur ARM und Thumb, nicht aber Thumb2.
:
Bearbeitet durch User
Herzlichen Dank! Endlich funktionieren alle Befehle! Gruß Stephan
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.