aboutsummaryrefslogtreecommitdiffstats
path: root/os/ports/GCC/ARMCMx/chcore.c
diff options
context:
space:
mode:
authorgdisirio <gdisirio@35acf78f-673a-0410-8e92-d51de3d6d3f4>2010-03-26 13:30:12 +0000
committergdisirio <gdisirio@35acf78f-673a-0410-8e92-d51de3d6d3f4>2010-03-26 13:30:12 +0000
commit5dcc2b78319d723289163fe9ab1b712621ebf37b (patch)
tree9343891fc5b8f23dd5bc8b426089973d644be80f /os/ports/GCC/ARMCMx/chcore.c
parent8429df68917eb18bb64b38fa73243282013f57bc (diff)
downloadChibiOS-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
Diffstat (limited to 'os/ports/GCC/ARMCMx/chcore.c')
-rw-r--r--os/ports/GCC/ARMCMx/chcore.c25
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)
}
/** @} */