aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorgdisirio <gdisirio@35acf78f-673a-0410-8e92-d51de3d6d3f4>2008-03-20 10:39:43 +0000
committergdisirio <gdisirio@35acf78f-673a-0410-8e92-d51de3d6d3f4>2008-03-20 10:39:43 +0000
commit813f114c7f03076ebee90269e7d6956fe221050d (patch)
tree1946ea476ca581dbff99efb3cacb11da43101223
parentd63f9c27be96d7b947b18b82d4398c4aa95d71ba (diff)
downloadChibiOS-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
-rw-r--r--ports/ARMCM3/chcore.c15
-rw-r--r--ports/ARMCM3/chcore.h8
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_ */