diff options
author | gdisirio <gdisirio@35acf78f-673a-0410-8e92-d51de3d6d3f4> | 2010-03-26 13:30:12 +0000 |
---|---|---|
committer | gdisirio <gdisirio@35acf78f-673a-0410-8e92-d51de3d6d3f4> | 2010-03-26 13:30:12 +0000 |
commit | 5dcc2b78319d723289163fe9ab1b712621ebf37b (patch) | |
tree | 9343891fc5b8f23dd5bc8b426089973d644be80f | |
parent | 8429df68917eb18bb64b38fa73243282013f57bc (diff) | |
download | ChibiOS-5dcc2b78319d723289163fe9ab1b712621ebf37b.tar.gz ChibiOS-5dcc2b78319d723289163fe9ab1b712621ebf37b.tar.bz2 ChibiOS-5dcc2b78319d723289163fe9ab1b712621ebf37b.zip |
git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@1781 35acf78f-673a-0410-8e92-d51de3d6d3f4
-rw-r--r-- | os/ports/GCC/ARMCMx/chcore.c | 25 |
1 files changed, 14 insertions, 11 deletions
diff --git a/os/ports/GCC/ARMCMx/chcore.c b/os/ports/GCC/ARMCMx/chcore.c index 37a31b756..4515ac777 100644 --- a/os/ports/GCC/ARMCMx/chcore.c +++ b/os/ports/GCC/ARMCMx/chcore.c @@ -69,33 +69,36 @@ void SysTickVector(void) { chSysUnlockFromIsr();
}
-#ifdef CH_CURRP_REGISTER_CACHE
+#if CORTEX_MODEL == CORTEX_M0
+#else /* CORTEX_MODEL != CORTEX_M0 */
+#if !defined(CH_CURRP_REGISTER_CACHE)
#define PUSH_CONTEXT(sp, prio) { \
asm volatile ("mrs %0, PSP \n\t" \
- "stmdb %0!, {r3-r6,r8-r11, lr}" : \
+ "stmdb %0!, {r3-r11,lr}" : \
"=r" (sp) : "r" (sp), "r" (prio)); \
}
#define POP_CONTEXT(sp) { \
- asm volatile ("ldmia %0!, {r3-r6,r8-r11, lr} \n\t" \
+ asm volatile ("ldmia r12!, {r3-r11, lr} \n\t" \
"msr PSP, %0 \n\t" \
"msr BASEPRI, r3 \n\t" \
"bx lr" : "=r" (sp) : "r" (sp)); \
}
-#else
+#else /* defined(CH_CURRP_REGISTER_CACHE) */
#define PUSH_CONTEXT(sp, prio) { \
asm volatile ("mrs %0, PSP \n\t" \
- "stmdb %0!, {r3-r11,lr}" : \
+ "stmdb %0!, {r3-r6,r8-r11, lr}" : \
"=r" (sp) : "r" (sp), "r" (prio)); \
}
#define POP_CONTEXT(sp) { \
- asm volatile ("ldmia r12!, {r3-r11, lr} \n\t" \
+ asm volatile ("ldmia %0!, {r3-r6,r8-r11, lr} \n\t" \
"msr PSP, %0 \n\t" \
"msr BASEPRI, r3 \n\t" \
"bx lr" : "=r" (sp) : "r" (sp)); \
}
-#endif
+#endif /* defined(CH_CURRP_REGISTER_CACHE) */
+#endif /* CORTEX_MODEL != CORTEX_M0 */
/**
* @brief SVC vector.
@@ -114,12 +117,12 @@ void SVCallVector(Thread *ntp, Thread *otp) { register uint32_t prio asm ("r3");
asm volatile ("mrs r3, BASEPRI" : "=r" (prio) : );
- PUSH_CONTEXT(sp_thd, prio);
+ PUSH_CONTEXT(sp_thd, prio)
otp->p_ctx.r13 = sp_thd;
sp_thd = ntp->p_ctx.r13;
- POP_CONTEXT(sp_thd);
+ POP_CONTEXT(sp_thd)
}
/**
@@ -136,7 +139,7 @@ void PendSVVector(void) { chSysLockFromIsr();
prio = CORTEX_BASEPRI_USER;
- PUSH_CONTEXT(sp_thd, prio);
+ PUSH_CONTEXT(sp_thd, prio)
(otp = currp)->p_ctx.r13 = sp_thd;
ntp = fifo_remove(&rlist.r_queue);
@@ -150,7 +153,7 @@ void PendSVVector(void) { chDbgTrace(otp);
sp_thd = ntp->p_ctx.r13;
- POP_CONTEXT(sp_thd);
+ POP_CONTEXT(sp_thd)
}
/** @} */
|