diff options
author | gdisirio <gdisirio@35acf78f-673a-0410-8e92-d51de3d6d3f4> | 2010-03-26 14:29:50 +0000 |
---|---|---|
committer | gdisirio <gdisirio@35acf78f-673a-0410-8e92-d51de3d6d3f4> | 2010-03-26 14:29:50 +0000 |
commit | d451a360542d080f3cd1dd3a02aff84be97656d0 (patch) | |
tree | d9c6bf47d90650f2b06af332c553c34182863dd4 /os | |
parent | 9d3415bdf3d355fea5e0d09c062ebdad15bb2d4a (diff) | |
download | ChibiOS-d451a360542d080f3cd1dd3a02aff84be97656d0.tar.gz ChibiOS-d451a360542d080f3cd1dd3a02aff84be97656d0.tar.bz2 ChibiOS-d451a360542d080f3cd1dd3a02aff84be97656d0.zip |
git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@1783 35acf78f-673a-0410-8e92-d51de3d6d3f4
Diffstat (limited to 'os')
-rw-r--r-- | os/ports/GCC/ARMCMx/chcore.c | 40 | ||||
-rw-r--r-- | os/ports/GCC/ARMCMx/chcore.h | 1 |
2 files changed, 38 insertions, 3 deletions
diff --git a/os/ports/GCC/ARMCMx/chcore.c b/os/ports/GCC/ARMCMx/chcore.c index 4515ac777..6b6123e7c 100644 --- a/os/ports/GCC/ARMCMx/chcore.c +++ b/os/ports/GCC/ARMCMx/chcore.c @@ -70,6 +70,40 @@ void SysTickVector(void) { }
#if CORTEX_MODEL == CORTEX_M0
+#define PUSH_CONTEXT(sp, prio) { \
+ asm volatile ("mrs %0, PSP \n\t" \
+ "sub %0, %0, #20 \n\t" \
+ "push {r3-r7} \n\t" \
+ "mov r0, r8 \n\t" \
+ "str r0, [%0, #20] \n\t" \
+ "mov r0, r9 \n\t" \
+ "str r0, [%0, #24] \n\t" \
+ "mov r0, r10 \n\t" \
+ "str r0, [%0, #28] \n\t" \
+ "mov r0, r11 \n\t" \
+ "str r0, [%0, #32] \n\t" \
+ "mov r0, lr \n\t" \
+ "str r0, [%0, #36] \n\t" \
+ : "=r" (sp) : "r" (sp), "r" (prio)); \
+}
+
+#define POP_CONTEXT(sp) { \
+ asm volatile ("ldr r0, [%0, #20] \n\t" \
+ "mov r8, r0 \n\t" \
+ "ldr r0, [%0, #24] \n\t" \
+ "mov r9, r0 \n\t" \
+ "ldr r0, [%0, #28] \n\t" \
+ "mov r10, r0 \n\t" \
+ "ldr r0, [%0, #32] \n\t" \
+ "mov r11, r0 \n\t" \
+ "ldr r0, [%0, #36] \n\t" \
+ "mov lr, r0 \n\t" \
+ "pop {r3-r7} \n\t" \
+ "add %0, %0, #20 \n\t" \
+ "msr PSP, %0 \n\t" \
+ "msr BASEPRI, r3 \n\t" \
+ "bx lr" : "=r" (sp) : "r" (sp)); \
+}
#else /* CORTEX_MODEL != CORTEX_M0 */
#if !defined(CH_CURRP_REGISTER_CACHE)
#define PUSH_CONTEXT(sp, prio) { \
@@ -79,7 +113,7 @@ void SysTickVector(void) { }
#define POP_CONTEXT(sp) { \
- asm volatile ("ldmia r12!, {r3-r11, lr} \n\t" \
+ asm volatile ("ldmia %0!, {r3-r11, lr} \n\t" \
"msr PSP, %0 \n\t" \
"msr BASEPRI, r3 \n\t" \
"bx lr" : "=r" (sp) : "r" (sp)); \
@@ -113,7 +147,7 @@ void SysTickVector(void) { __attribute__((naked))
#endif
void SVCallVector(Thread *ntp, Thread *otp) {
- register struct intctx *sp_thd asm("r12");
+ register struct intctx *sp_thd asm("r2");
register uint32_t prio asm ("r3");
asm volatile ("mrs r3, BASEPRI" : "=r" (prio) : );
@@ -132,7 +166,7 @@ void SVCallVector(Thread *ntp, Thread *otp) { __attribute__((naked))
#endif
void PendSVVector(void) {
- register struct intctx *sp_thd asm("r12");
+ register struct intctx *sp_thd asm("r2");
register uint32_t prio asm ("r3");
Thread *otp, *ntp;
diff --git a/os/ports/GCC/ARMCMx/chcore.h b/os/ports/GCC/ARMCMx/chcore.h index 26838f17b..2f69209ba 100644 --- a/os/ports/GCC/ARMCMx/chcore.h +++ b/os/ports/GCC/ARMCMx/chcore.h @@ -108,6 +108,7 @@ struct intctx { regarm_t r10;
regarm_t r11;
regarm_t lr_exc;
+ /* Start of the hardware saved frame.*/
regarm_t r0;
regarm_t r1;
regarm_t r2;
|