diff options
Diffstat (limited to 'os/ports/GCC/MSP430')
-rw-r--r-- | os/ports/GCC/MSP430/chcore.c | 102 | ||||
-rw-r--r-- | os/ports/GCC/MSP430/chcore.h | 14 | ||||
-rw-r--r-- | os/ports/GCC/MSP430/chcoreasm.s | 58 | ||||
-rw-r--r-- | os/ports/GCC/MSP430/port.mk | 4 |
4 files changed, 72 insertions, 106 deletions
diff --git a/os/ports/GCC/MSP430/chcore.c b/os/ports/GCC/MSP430/chcore.c deleted file mode 100644 index 33a162cf5..000000000 --- a/os/ports/GCC/MSP430/chcore.c +++ /dev/null @@ -1,102 +0,0 @@ -/*
- ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010,
- 2011,2012 Giovanni Di Sirio.
-
- This file is part of ChibiOS/RT.
-
- ChibiOS/RT is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 3 of the License, or
- (at your option) any later version.
-
- ChibiOS/RT is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-/**
- * @file MSP430/chcore.c
- * @brief MSP430 architecture port code.
- *
- * @addtogroup MSP430_CORE
- * @{
- */
-
-#include "ch.h"
-
-/**
- * @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.
- * @note The function is declared as a weak symbol, it is possible to
- * redefine it in your application code.
- *
- * @param[in] ntp the thread to be switched in
- * @param[in] otp the thread to be switched out
- */
-#if !defined(__DOXYGEN__)
-__attribute__((naked, weak))
-#endif
-void port_switch(Thread *ntp, Thread *otp) {
- register struct intctx *sp asm("r1");
-
- asm volatile ("push r11 \n\t" \
- "push r10 \n\t" \
- "push r9 \n\t" \
- "push r8 \n\t" \
- "push r7 \n\t" \
- "push r6 \n\t" \
- "push r5 \n\t" \
- "push r4" : : : "memory");
- otp->p_ctx.sp = sp;
- sp = ntp->p_ctx.sp;
- asm volatile ("pop r4 \n\t" \
- "pop r5 \n\t" \
- "pop r6 \n\t" \
- "pop r7 \n\t" \
- "pop r8 \n\t" \
- "pop r9 \n\t" \
- "pop r10 \n\t" \
- "pop r11 \n\t" \
- "ret" : : "r" (sp) : "memory");
-}
-
-/**
- * @brief Halts the system.
- * @details This function is invoked by the operating system when an
- * unrecoverable error is detected (for example because a programming
- * error in the application code that triggers an assertion while in
- * debug mode).
- * @note The function is declared as a weak symbol, it is possible to
- * redefine it in your application code.
- */
-#if !defined(__DOXYGEN__)
-__attribute__((weak))
-#endif
-void port_halt(void) {
-
- port_disable();
- while (TRUE) {
- }
-}
-
-/**
- * @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) {
-
- chSysUnlock();
- asm volatile ("mov r11, r15 \n\t" \
- "call r10 \n\t" \
- "call #chThdExit");
-}
-
-/** @} */
diff --git a/os/ports/GCC/MSP430/chcore.h b/os/ports/GCC/MSP430/chcore.h index 10e18d9a6..5254c07bb 100644 --- a/os/ports/GCC/MSP430/chcore.h +++ b/os/ports/GCC/MSP430/chcore.h @@ -290,11 +290,21 @@ struct context { #define port_wait_for_interrupt()
#endif
+/**
+ * @brief Wrapper of the assembler @p _port_switch() function.
+ */
+#define port_switch(ntp, otp) _port_switch(ntp, otp)
+
+/**
+ * @brief Wrapper of the assembler @p _port_halt() function.
+ */
+#define port_halt() _port_halt()
+
#ifdef __cplusplus
extern "C" {
#endif
- void port_switch(Thread *ntp, Thread *otp);
- void port_halt(void);
+ void _port_switch(Thread *ntp, Thread *otp);
+ void _port_halt(void);
void _port_thread_start(void);
#ifdef __cplusplus
}
diff --git a/os/ports/GCC/MSP430/chcoreasm.s b/os/ports/GCC/MSP430/chcoreasm.s new file mode 100644 index 000000000..99c8744fd --- /dev/null +++ b/os/ports/GCC/MSP430/chcoreasm.s @@ -0,0 +1,58 @@ +/*
+ ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010,
+ 2011,2012 Giovanni Di Sirio.
+
+ This file is part of ChibiOS/RT.
+
+ ChibiOS/RT is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ ChibiOS/RT is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+ .text
+ .p2align 1, 0
+ .weak _port_switch
+_port_switch:
+ push r11
+ push r10
+ push r9
+ push r8
+ push r7
+ push r6
+ push r5
+ push r4
+ mov r1, 6(r14)
+ mov 6(r15), r1
+ pop r4
+ pop r5
+ pop r6
+ pop r7
+ pop r8
+ pop r9
+ pop r10
+ pop r11
+ ret
+
+ .p2align 1, 0
+ .weak _port_thread_start
+_port_thread_start:
+ eint
+ mov r11, r15
+ call r10
+ call #chThdExit
+ ; Falls into _port_halt
+
+ .p2align 1, 0
+ .weak _port_halt
+_port_halt:
+ dint
+.L1: jmp .L1
diff --git a/os/ports/GCC/MSP430/port.mk b/os/ports/GCC/MSP430/port.mk index 60b3f8add..8291fa9d9 100644 --- a/os/ports/GCC/MSP430/port.mk +++ b/os/ports/GCC/MSP430/port.mk @@ -1,6 +1,6 @@ # List of the ChibiOS/RT MSP430 port files.
-PORTSRC = ${CHIBIOS}/os/ports/GCC/MSP430/chcore.c
+PORTSRC =
-PORTASM =
+PORTASM = ${CHIBIOS}/os/ports/GCC/MSP430/chcoreasm.s
PORTINC = ${CHIBIOS}/os/ports/GCC/MSP430
|