aboutsummaryrefslogtreecommitdiffstats
path: root/ports/ARMCM3/chcore.h
diff options
context:
space:
mode:
authorgdisirio <gdisirio@35acf78f-673a-0410-8e92-d51de3d6d3f4>2008-04-18 13:27:05 +0000
committergdisirio <gdisirio@35acf78f-673a-0410-8e92-d51de3d6d3f4>2008-04-18 13:27:05 +0000
commitf563ad9387e132cece6634811a89aa450c60a176 (patch)
tree0cf9f3ff6b7dde1ace508a8af477d54b2c5e9376 /ports/ARMCM3/chcore.h
parent792c528dbc75f0ffeb19766594607bee73fa36ad (diff)
downloadChibiOS-f563ad9387e132cece6634811a89aa450c60a176.tar.gz
ChibiOS-f563ad9387e132cece6634811a89aa450c60a176.tar.bz2
ChibiOS-f563ad9387e132cece6634811a89aa450c60a176.zip
git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@271 35acf78f-673a-0410-8e92-d51de3d6d3f4
Diffstat (limited to 'ports/ARMCM3/chcore.h')
-rw-r--r--ports/ARMCM3/chcore.h20
1 files changed, 11 insertions, 9 deletions
diff --git a/ports/ARMCM3/chcore.h b/ports/ARMCM3/chcore.h
index 6c80fdc09..5b9a0915b 100644
--- a/ports/ARMCM3/chcore.h
+++ b/ports/ARMCM3/chcore.h
@@ -78,16 +78,19 @@ typedef struct {
}
#define chSysLock() { \
- asm volatile ("push {r3}"); \
- asm volatile ("movs r3, #0x10"); \
- asm volatile ("msr BASEPRI, r3"); \
- asm volatile ("pop {r3}"); \
+ register uint32_t tmp asm ("r3"); \
+ asm volatile ("movs %0, #0x10" : "=r" (tmp): ); \
+ asm volatile ("msr BASEPRI, %0" : : "r" (tmp)); \
}
#define chSysUnlock() { \
- asm volatile ("push {r3}"); \
- asm volatile ("movs r3, #0"); \
- asm volatile ("msr BASEPRI, r3"); \
- asm volatile ("pop {r3}"); \
+ register uint32_t tmp asm ("r3"); \
+ asm volatile ("movs %0, #0" : "=r" (tmp): ); \
+ asm volatile ("msr BASEPRI, %0" : : "r" (tmp)); \
+}
+#define chSysSwitchI(otp, ntp) { \
+ register Thread *_otp asm ("r0") = (otp); \
+ register Thread *_ntp asm ("r1") = (ntp); \
+ asm volatile ("svc #0" : : "r" (_otp), "r" (_ntp)); \
}
#define INT_REQUIRED_STACK 0
@@ -109,7 +112,6 @@ typedef struct {
void _IdleThread(void *p) __attribute__((noreturn));
void chSysHalt(void);
-void chSysSwitchI(Thread *otp, Thread *ntp);
void chSysPuts(char *msg);
void threadstart(void);