aboutsummaryrefslogtreecommitdiffstats
path: root/os/ports/GCC/ARMCMx/chcore.c
diff options
context:
space:
mode:
authorgdisirio <gdisirio@35acf78f-673a-0410-8e92-d51de3d6d3f4>2010-04-02 08:11:05 +0000
committergdisirio <gdisirio@35acf78f-673a-0410-8e92-d51de3d6d3f4>2010-04-02 08:11:05 +0000
commitc047b2198006076a00ebfe9cff9e8537aeb8ca96 (patch)
tree27f4f75da18a4e2da34fc4ae6a37eeb24b21fcdb /os/ports/GCC/ARMCMx/chcore.c
parent3bc41906b36968c2a2e7a753e572e7067fa737a3 (diff)
downloadChibiOS-c047b2198006076a00ebfe9cff9e8537aeb8ca96.tar.gz
ChibiOS-c047b2198006076a00ebfe9cff9e8537aeb8ca96.tar.bz2
ChibiOS-c047b2198006076a00ebfe9cff9e8537aeb8ca96.zip
git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@1825 35acf78f-673a-0410-8e92-d51de3d6d3f4
Diffstat (limited to 'os/ports/GCC/ARMCMx/chcore.c')
-rw-r--r--os/ports/GCC/ARMCMx/chcore.c155
1 files changed, 0 insertions, 155 deletions
diff --git a/os/ports/GCC/ARMCMx/chcore.c b/os/ports/GCC/ARMCMx/chcore.c
index 908f0b5a6..24a9d7f7a 100644
--- a/os/ports/GCC/ARMCMx/chcore.c
+++ b/os/ports/GCC/ARMCMx/chcore.c
@@ -26,17 +26,6 @@
*/
#include "ch.h"
-#include "nvic.h"
-
-/**
- * @brief PC register temporary storage.
- */
-regarm_t _port_saved_pc;
-
-/**
- * @brief IRQ nesting counter.
- */
-unsigned _port_irq_nesting;
/**
* @brief Halts the system.
@@ -53,148 +42,4 @@ void port_halt(void) {
}
}
-/**
- * @brief System Timer vector.
- * @details This interrupt is used as system tick.
- * @note The timer must be initialized in the startup code.
- */
-CH_IRQ_HANDLER(SysTickVector) {
-
- CH_IRQ_PROLOGUE();
-
- chSysLockFromIsr();
- chSysTimerHandlerI();
- chSysUnlockFromIsr();
-
- CH_IRQ_EPILOGUE();
-}
-
-/**
- * @brief Post-IRQ switch code.
- * @details On entry the stack and the registers are restored by the exception
- * return, the PC value is stored in @p _port_saved_pc, the interrupts
- * are disabled.
- */
-#if !defined(__DOXYGEN__)
-__attribute__((naked))
-#endif
-void _port_switch_from_irq(void) {
- /* Note, saves r4 to make space for the PC.*/
-#if defined(CH_ARCHITECTURE_ARM_v6M)
- asm volatile ("push {r0, r1, r2, r3, r4} \n\t" \
- "mrs r0, APSR \n\t" \
- "mov r1, r12 \n\t" \
- "push {r0, r1, lr} \n\t" \
- "ldr r0, =_port_saved_pc \n\t" \
- "ldr r0, [r0] \n\t" \
- "add r0, r0, #1 \n\t" \
- "str r0, [sp, #28]");
-#elif defined(CH_ARCHITECTURE_ARM_v7M)
- asm volatile ("push {r0, r1, r2, r3, r4} \n\t" \
- "mrs r0, APSR \n\t" \
- "push {r0, r12, lr} \n\t" \
- "ldr r0, =_port_saved_pc \n\t" \
- "ldr r0, [r0] \n\t" \
- "add r0, r0, #1 \n\t" \
- "str r0, [sp, #28]");
-#endif
-
- chSchDoRescheduleI();
-
- /* Note, the last registers are restored alone after re-enabling the
- interrupts in order to minimize the (very remote and unlikely)
- possibility that the stack is filled by continuous and saturating
- interrupts that would not allow that last words to be pulled out of
- the stack.*/
-#if defined(CH_ARCHITECTURE_ARM_v6M)
- asm volatile ("pop {r0, r1, r2} \n\t" \
- "mov r12, r1 \n\t" \
- "msr APSR, r0 \n\t" \
- "mov lr, r2");
-#elif defined(CH_ARCHITECTURE_ARM_v7M)
- asm volatile ("pop {r0, r12, lr} \n\t" \
- "msr APSR, r0");
-#endif
-#if CORTEX_USE_BASEPRI
- asm volatile ("mov r0, #0 \n\t" \
- "msr BASEPRI, r0");
-#else /* !CORTEX_USE_BASEPRI */
- asm volatile ("cpsie i");
-#endif /* !CORTEX_USE_BASEPRI */
- asm volatile ("pop {r0, r1, r2, r3, pc}");
-}
-
-#if defined(CH_ARCHITECTURE_ARM_v6M)
-#define PUSH_CONTEXT(sp) { \
- asm volatile ("push {r4, r5, r6, r7, lr} \n\t" \
- "mov r4, r8 \n\t" \
- "mov r5, r9 \n\t" \
- "mov r6, r10 \n\t" \
- "mov r7, r11 \n\t" \
- "push {r4, r5, r6, r7}"); \
-}
-
-#define POP_CONTEXT(sp) { \
- asm volatile ("pop {r4, r5, r6, r7} \n\t" \
- "mov r8, r4 \n\t" \
- "mov r9, r5 \n\t" \
- "mov r10, r6 \n\t" \
- "mov r11, r7 \n\t" \
- "pop {r4, r5, r6, r7, pc}" : : "r" (sp)); \
-}
-#elif defined(CH_ARCHITECTURE_ARM_v7M)
-#define PUSH_CONTEXT(sp) { \
- asm volatile ("push {r4, r5, r6, r7, r8, r9, r10, r11, lr} \n\t"); \
-}
-
-#define POP_CONTEXT(sp) { \
- asm volatile ("pop {r4, r5, r6, r7, r8, r9, r10, r11, pc} \n\t" \
- : : "r" (sp)); \
-}
-#endif
-
-/**
- * @brief Performs a context switch between two threads.
- * @details This is the most critical code in any port, this function
- * is responsible for the context switch between 2 threads.
- * @note The implementation of this code affects <b>directly</b> the context
- * switch performance so optimize here as much as you can.
- *
- * @param[in] ntp the thread to be switched in
- * @param[in] otp the thread to be switched out
- */
-#if !defined(__DOXYGEN__)
-__attribute__((naked))
-#endif
-void port_switch(Thread *ntp, Thread *otp) {
- register struct intctx *r13 asm ("r13");
-
- /* Stack overflow check, if enabled.*/
-#if CH_DBG_ENABLE_STACK_CHECK
- if ((void *)(r13 - 1) < (void *)(otp + 1))
- asm volatile ("movs r0, #0 \n\t"
- "b chDbgPanic");
-#endif /* CH_DBG_ENABLE_STACK_CHECK */
-
- PUSH_CONTEXT(r13);
-
- otp->p_ctx.r13 = r13;
- r13 = ntp->p_ctx.r13;
-
- POP_CONTEXT(r13);
-}
-
-/**
- * @brief Start a thread by invoking its work function.
- * @details If the work function returns @p chThdExit() is automatically
- * invoked.
- */
-void _port_thread_start(void) {
-
- port_unlock();
- asm volatile ("mov r0, r5 \n\t" \
- "blx r4 \n\t" \
- "bl chThdExit");
-}
-
/** @} */