Forum: Mikrocontroller und Digitale Elektronik Cortex-M3 und SVC


von Arne (Gast)


Lesenswert?

Moin zusammen,

hab ein Problem mit Cortex-M3 und SVC.
Ich nutze:
- IAR EWARM 6.30
- Segger embOS 3.82
- STM32F103

Nachdem das RTOS gestartet ist, läuft die Applikation im 
unpriviligierten Modus.
Nun möchte ich gerne in den priviligierten Modus schalten, um MSR 
auszuführen.
Mein SVC-Handler sieht wie folgt aus:
1
__SVCException
2
  TST    LR, #4
3
  ITE    EQ
4
  MRSEQ  R0, MSP
5
  MRSNE  R0, PSP
6
  B    SVCException

bzw:
1
extern void SVCException(uint32_t* const inSVCArguments_PU32)
2
{
3
  uint32_t  mySVCNumber_U32, mySVCParameter_U32[4];
4
5
  mySVCNumber_U32      = ((int8_t*) inSVCArguments_PU32[6])[-2];
6
  mySVCParameter_U32[0]  = (uint32_t) inSVCArguments_PU32[0];  /* R0  */
7
  mySVCParameter_U32[1]  = (uint32_t) inSVCArguments_PU32[1];  /* R1  */
8
  mySVCParameter_U32[2]  = (uint32_t) inSVCArguments_PU32[2];  /* R2  */
9
  mySVCParameter_U32[3]  = (uint32_t) inSVCArguments_PU32[3];  /* R3  */
10
}

__SVCException ist an Index 11 in die Vektortabelle eingetragen. Hab ich 
im Hexdump und Mapfile überprüft.
Die obigen Codebeispiele habe ich aus dem Yiu.
Wenn ich jetzt im unpriv. Modus "svc #0x01" ausführe, landet mein Code 
sofort im HardFault-Handler.
Warum hier und nicht in __SVCException?

thanx, Arne

von Jim M. (turboj)


Lesenswert?

Eventuell generiert der Assembler ARM Code statt Thumb. Prüf mal ob das 
LSB in der Vektortabelle für den SVC Handler wirklich 1 ist.

von Arne (Gast)


Lesenswert?

Jupp, LSByte ist 0x95.

von Marcus H. (mharnisch) Benutzerseite


Lesenswert?

Arne schrieb:
> Wenn ich jetzt im unpriv. Modus "svc #0x01" ausführe, landet mein Code
> sofort im HardFault-Handler.

"Sofort", oder "nach wenigen Befehlen"? Hast Du mal die Priorität des 
SVC mit der aktuellen Priorität verglichen? Vielleicht kann der gar 
nicht ausgeführt werden, und dann landet man im HF.

--
Marcus

von Arne (Gast)


Angehängte Dateien:

Lesenswert?

PRIMASK stand auf 1!
SVCs gehen jetzt, aber er setzt mir nicht den SP um.
Ich habe mal einen Screenshot gemacht. Nach meinem Empfinden, müsste R13 
jetzt auf 0x20005000 stehen. Tuts aber nicht.

von Tester (Gast)


Lesenswert?

> Nachdem das RTOS gestartet ist, läuft die Applikation im
> unpriviligierten Modus.

Schaltest du selber in den nicht priviligierten Thread Mode um? Weil 
nach Reset ist der Cortex M3 im priviligierten Mode und embOS stellt das 
nicht um, ansonsten würde nichts funktionieren. Sprich alle Tasks laufem 
im priviligierten Thread Mode.

von Arne (Gast)


Lesenswert?

embos stellt auf MSP/PSP Betrieb um, d.h. ich muss das System in einen 
MSP-only Betrieb zwingen: im priv.Modus CONTROL[1] löschen und dann 
gehts.

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.