diff options
author | gdisirio <gdisirio@35acf78f-673a-0410-8e92-d51de3d6d3f4> | 2008-03-20 10:39:43 +0000 |
---|---|---|
committer | gdisirio <gdisirio@35acf78f-673a-0410-8e92-d51de3d6d3f4> | 2008-03-20 10:39:43 +0000 |
commit | 813f114c7f03076ebee90269e7d6956fe221050d (patch) | |
tree | 1946ea476ca581dbff99efb3cacb11da43101223 /ports | |
parent | d63f9c27be96d7b947b18b82d4398c4aa95d71ba (diff) | |
download | ChibiOS-813f114c7f03076ebee90269e7d6956fe221050d.tar.gz ChibiOS-813f114c7f03076ebee90269e7d6956fe221050d.tar.bz2 ChibiOS-813f114c7f03076ebee90269e7d6956fe221050d.zip |
git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@243 35acf78f-673a-0410-8e92-d51de3d6d3f4
Diffstat (limited to 'ports')
-rw-r--r-- | ports/ARMCM3/chcore.c | 15 | ||||
-rw-r--r-- | ports/ARMCM3/chcore.h | 8 |
2 files changed, 16 insertions, 7 deletions
diff --git a/ports/ARMCM3/chcore.c b/ports/ARMCM3/chcore.c index 01e4444bc..94a734dba 100644 --- a/ports/ARMCM3/chcore.c +++ b/ports/ARMCM3/chcore.c @@ -77,6 +77,19 @@ void *retaddr; */
void SysTickVector(void) {
+ chSysIRQEnterI();
+
+ chSysTimerHandlerI();
+
+ chSysIRQExitI();
+}
+
+/*
+ * To be invoked at the end of any interrupt handler that can trigger a
+ * reschedule.
+ */
+void chSysIRQExitI(void) {
+
chSysLock();
if (SCB->ICSR & (1 << 11)) { /* RETTOBASE */
if (chSchRescRequiredI()) {
@@ -87,7 +100,7 @@ void SysTickVector(void) { "str r2, [r1] \n\t" \
"ldr r1, =threadswitch \n\t" \
"str r1, [r0, #18] ");
- return;
+ return; /* Note, returns *without* re-enabling interrupts.*/
}
}
chSysUnlock();
diff --git a/ports/ARMCM3/chcore.h b/ports/ARMCM3/chcore.h index 8d3a44892..2810368b6 100644 --- a/ports/ARMCM3/chcore.h +++ b/ports/ARMCM3/chcore.h @@ -85,12 +85,7 @@ typedef struct { INT_REQUIRED_STACK)
#define WorkingArea(s, n) uint32_t s[UserStackSize(n) >> 2];
-#define chSysIRQEnterI() { \
-}
-
-#define chSysIRQExitI() { \
- asm("b IrqCommon \n\t"); \
-}
+#define chSysIRQEnterI()
/* It requires zero bytes, but better be safe.*/
#define IDLE_THREAD_STACK_SIZE 8
@@ -100,5 +95,6 @@ void chSysHalt(void); void chSysSwitchI(Thread *otp, Thread *ntp);
void chSysPuts(char *msg);
void threadstart(void);
+void chSysIRQExitI(void);
#endif /* _CHCORE_H_ */
|