2012-03-27 9 views
0

Ich habe eine andere Frage über eine Inline-Assembly-Anweisung in Bezug auf eine Kontextwechsel. Dieser Code mag funktionieren, aber ich bin mir nicht sicher bei 100%, also übergebe ich diesen Code an die Pros von stackoverflow ;-)Kontextschalter mit Arm Inline-Assembly

Ich kompiliere mit gcc (keine Optimierung) für einen arm7TDMI. Irgendwann muss der Code einen Kontextwechsel durchführen.

/* Software Interrupt */ 
/* we must save lr in case it is called from SVC mode */ 
#define ngARMSwi(code) __asm__("SWI %0" : : "I"(code) : "lr") 
// Note : code = 0x23 

Wenn ich den kompilierten Code überprüfen, erhalte ich dieses Ergebnis:

svc 0x00000023 

Die Person vor mir, die codiert diese schrieb: „Wir müssen lr speichern“, aber in der Code kompiliert, ich weiß nicht Sehen Sie irgendwelche Spuren von lr gespeichert werden.

Der Grund, warum ich, dass Code denken falsch sein könnte, ist, dass der Programmablauf für einige Zeit, bevor sie in einem Reset-Ausnahme und einer der letzten, was los ist der Code auszuführen ist ein Kontextschalter ...

Antwort

0

Die __asm__ Aussage listet lr als ein geblocktes Register auf. Dies bedeutet, dass der Compiler das Register speichert, wenn es benötigt.

Da Sie keine Sicherung sehen, können Sie davon ausgehen, dass der Compiler dieses Register (zumindest in Ihrem Testfall) nicht verwendet hat.

0

Ich denke, dass SWI-Anweisung im Benutzermodus aufgerufen werden sollte. wenn das stimmt. Der Modus von ARM wird nach dieser Anweisung in den SVC-Modus umgeschaltet. dann führt der ARM-Kern die Kopieroperation aus, dass der CPSR in SPSR_svc kopiert wird und LR in LR_svc kopiert wird. Dies sollte verwendet werden, um den Kontext des Benutzermodus-CPUs zu speichern, um aus dem SVC-Modus zurückzukehren. Wenn Ihr SVC-Exception-Handler lr verwendet, wie wenn Sie eine andere Funktion aufrufen, sollte das lr-Register wie bei der Verwendung des Stacks zwischen der Änderung des Modus beibehalten werden. Ich schätze, die Person vor Ihnen schrieb so, um über diese Situation zu sprechen.