Forum: Mikrocontroller und Digitale Elektronik ARM und Thumb mischen


von Ludwig (Gast)


Lesenswert?

Hi,

Ich will inline-Assembler-Code in eine C-Datei einfügen.
1. Frage: Kann man ARM und Thumb-Code miteinander vermischen?
2. Frage: Wie kann ich zwischen ARM und Thumb-Code hin und herschalten 
(mit welchem Befehl)

liebe Grüße

von Ludwig (Gast)


Lesenswert?

Liege ich mit dieser Annahme richtig:
1. Eine Funktion kann nur im ARM oder im Thumb-Modus sein. Eine Mischung 
aus beiden Befehlssätzen in einer Funktion ist nicht möglich.
2. Die unterschiedlichen Funktionen aber können unterschiedlichen Modis 
angehören. D. h. während Funktion-1 z. B. im ARM-Modus ist, kann 
Funktion-2 im Thumb-Modus sein.

Lieg ich richtig?

von Oliver J. (skriptkiddy)


Lesenswert?

>1. Frage: Kann man ARM und Thumb-Code miteinander vermischen?
Das Zauberwort heißt: Interworking
Geht aber nicht auf allen ARM Prozessoren. Welchen hast du denn?

>2. Frage: Wie kann ich zwischen ARM und Thumb-Code hin und herschalten
>(mit welchem Befehl)
Das entnimmst du der Doku deines ARM Kernes. Für einen ARM7TDMI sieht es 
folgender Maßen aus:
1
The operating state of the ARM7TDMI core can be switched between ARM 
2
state and Thumb state using the BX instruction.
[Quelle: ARM7TDMI Technical Reference Manual Revision: r4p1]

Gruß Oliver

von Ludwig (Gast)


Lesenswert?

Hi,

In der Doku steht auch, dass man die Direktiven "THUMB" bzw. "ARM" 
verwenden soll, doch diese erkennt mein ARM Compiler Toolchain in 
Microvision nicht. Kann mir da jemand bitte weiterhelfen?

liebe Grüße

von Keil Tester (Gast)


Lesenswert?


von Ludwig (Gast)


Lesenswert?

D. h. also, dass ich in einer Funktion ARM und Thumb-Code nicht 
vermischen kann, sondern eine Funktion nur im ARM oder nur im 
Thumb-Modus sein kann oder?

von Ludwig (Gast)


Lesenswert?

Was aber verwirrend ist, dass da steht: Inline Assembler nicht 
verfügbar, wenn für Thumb-State kompiliert wird. Das stimmt aber nicht, 
in Microvision kann ich auch inline-Assemblercode angeben, obwohl ich 
für Thumb-State kompiliere. Könnt ihr mich da bitte aufklären?

von Gebhard R. (Firma: Raich Gerätebau & Entwicklung) (geb)


Lesenswert?

In einer Funktion wird man Thumb und ARN Code nicht vermischen können. 
Im Uv kann man für jedes File in den Options ARM oder Thumb anklicken.

Grüsse

von Ludwig (Gast)


Lesenswert?

Und was ist mit der "Branching-Technik":
Also langsam versteh ich den Assembler von Keil wirklich nicht. Kann mir 
bitte jemand erklären wieso das hier nicht geht:
1.
int main(void) {
 __asm {
   ; Dies ist ein simpler Kommentar
 }
}
--> Der Kommentar führt zum Syntax-Error

2.
int main(void) {
 __asm {
   start:
     MOV r1, #2
     MOV r2, r1
     LDR r0, =thumbMode+1
     MOV lr, pc
     BX r0
   thumbMode:
     MOV r0, #3
     MOV r1, r0
     BX lr
 }
}
--> Hier wird nach BX r0 leider nicht zur Stelle "thumbMode" gesprungen. 
Sondern wo ganz anders hin im Speicher.

Please help me :(

von W.S. (Gast)


Lesenswert?

Ludwig schrieb:
> MOV lr, pc

Tja, wohin soll denn die Reise gehen? Hast du dir nen Gedanken 
gemacht,wohin PC zum aktuellen Zeitpunkt hinzeigt?

W.S.

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.