Forum: Mikrocontroller und Digitale Elektronik ARM Cortex M4 SVCall


von Gripo (Gast)


Lesenswert?

Hallo,

ich experimentiere mit einem STM32F407. Ich möchte SVC verwenden. Dazu 
habe ich folgenden Assemblercode geschrieben:

  mrs r0, psp
  ldr r0, [r0, #24]
  sub r0, r0, #2
  ldrb r0, [r0]
  bx          lr

normalerweise läuft mein Programm im Thread mode, daher muss ich da den 
PSP verwenden. Das funktioniert auch; in Zeile 2 wird der korrekte PC 
geladen, also die Adresse, wo die SVC Instruktion stand. Anschliessend 
möchte ich nun an dieser Adresse lesen, um den Immediate-Wert der SVC 
Instruktion zu kriegen - und dort liest der Prozessor immer 0x8A. Schaue 
ich mir im Debugger aber an die fragliche Adresse das Memory an, dann 
steht dort 0x07, da meine Instruktion auch

SVC #7

lautete. Was mache ich falsch?

von Marcus H. (mharnisch) Benutzerseite


Lesenswert?

Gripo schrieb:
> und dort liest der Prozessor immer 0x8A. Schaue ich mir im Debugger aber
> an die fragliche Adresse das Memory an, dann steht dort 0x07, da meine
> Instruktion auch

Woran erkennst Du denn, dass 0x8A gelesen wird?

von Chris Z. (sicro)


Lesenswert?

hi,

auch wenn der Beitrag schon etwas älter ist, für die Nachwelt:
1
MRS r4, PSP
2
LDR r4, [r4, #24]
3
SUB r4, r4, #2
4
LDR r4, [r4]
5
AND r4, r4, #255

Vorgehen:
PSP laden
Gesicherten PC aus Thread Kontext laden
Alten PC verringen um an den SVC Call zu kommen
Laden des Befehls an der Stelle
UND um die Nummer zu bekommen (untersten 8 Bit des SVC Befehls)
in r4 steht die SVC Nummer

Nachtrag:
1
MRS  r4, PSP
2
LDR  r4, [r4, #24]
3
SUB  r4, r4, #2
4
LDRB r4, [r4]

Läuft bei mir aber auch, also das LDRB funktioniert auch.
Getestet mit:
GNU ar (GNU Tools for ARM Embedded Processors) 2.21.1.20121016

Chris

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.