aboutsummaryrefslogtreecommitdiffstats
path: root/ports/ARMCM3/chcore.h
diff options
context:
space:
mode:
authorgdisirio <gdisirio@35acf78f-673a-0410-8e92-d51de3d6d3f4>2008-04-16 15:43:05 +0000
committergdisirio <gdisirio@35acf78f-673a-0410-8e92-d51de3d6d3f4>2008-04-16 15:43:05 +0000
commit4e914e72d86c226b8d9674cb05675d549bee89e8 (patch)
treed7f37a24d44c74256381e776879da23e4ae89f3c /ports/ARMCM3/chcore.h
parentf1ae9df82658d2e29402c931b098336909f772a3 (diff)
downloadChibiOS-4e914e72d86c226b8d9674cb05675d549bee89e8.tar.gz
ChibiOS-4e914e72d86c226b8d9674cb05675d549bee89e8.tar.bz2
ChibiOS-4e914e72d86c226b8d9674cb05675d549bee89e8.zip
git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@267 35acf78f-673a-0410-8e92-d51de3d6d3f4
Diffstat (limited to 'ports/ARMCM3/chcore.h')
-rw-r--r--ports/ARMCM3/chcore.h22
1 files changed, 18 insertions, 4 deletions
diff --git a/ports/ARMCM3/chcore.h b/ports/ARMCM3/chcore.h
index ccb070228..e9fc693e0 100644
--- a/ports/ARMCM3/chcore.h
+++ b/ports/ARMCM3/chcore.h
@@ -32,6 +32,7 @@ struct extctx {
* System saved context.
*/
struct intctx {
+ regarm basepri;
regarm r4;
regarm r5;
regarm r6;
@@ -68,15 +69,26 @@ typedef struct {
tp->p_ctx.r13 = (struct intctx *)((uint8_t *)workspace + \
wsize - \
sizeof(struct intctx)); \
+ tp->p_ctx.r13->basepri = 0; \
+ tp->p_ctx.r13->lr_exc = (regarm)0xFFFFFFFD; \
tp->p_ctx.r13->r0 = arg; \
tp->p_ctx.r13->r1 = pf; \
- tp->p_ctx.r13->lr_exc = (regarm)0xFFFFFFFD; \
tp->p_ctx.r13->pc = threadstart; \
tp->p_ctx.r13->xpsr = (regarm)0x01000000; \
}
-#define chSysLock() asm("cpsid i")
-#define chSysUnlock() asm("cpsie i")
+#define chSysLock() { \
+ asm volatile ("push {r12}"); \
+ asm volatile ("mov r12, #0x10"); \
+ asm volatile ("msr BASEPRI, r12"); \
+ asm volatile ("pop {r12}"); \
+}
+#define chSysUnlock() { \
+ asm volatile ("push {r12}"); \
+ asm volatile ("mov r12, #0"); \
+ asm volatile ("msr BASEPRI, r12"); \
+ asm volatile ("pop {r12}"); \
+}
#define INT_REQUIRED_STACK 0
#define StackAlign(n) ((((n) - 1) | 3) + 1)
@@ -88,6 +100,9 @@ typedef struct {
#define WorkingArea(s, n) uint32_t s[UserStackSize(n) >> 2];
#define chSysIRQEnterI()
+#define chSysIRQExitI() { \
+ SCB_ICSR = ICSR_PENDSVSET; \
+}
/* It should be 8.*/
#define IDLE_THREAD_STACK_SIZE 0
@@ -97,6 +112,5 @@ void chSysHalt(void);
void chSysSwitchI(Thread *otp, Thread *ntp);
void chSysPuts(char *msg);
void threadstart(void);
-void chSysIRQExitI(void);
#endif /* _CHCORE_H_ */