diff options
-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_ */
|