diff options
Diffstat (limited to 'ports/MSP430/chcore.c')
-rw-r--r-- | ports/MSP430/chcore.c | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/ports/MSP430/chcore.c b/ports/MSP430/chcore.c index e9a5dc574..e56f41120 100644 --- a/ports/MSP430/chcore.c +++ b/ports/MSP430/chcore.c @@ -31,12 +31,55 @@ * because performance concerns.
*/
+/**
+ * The default implementation of this function is void so no messages are
+ * actually printed.
+ * @note The function is declared as a weak symbol, it is possible to redefine
+ * it in your application code.
+ * @param msg pointer to the message string
+ */
+__attribute__((weak))
void sys_puts(char *msg) {
}
+/**
+ * Performs a context switch between two threads.
+ * @param otp the thread to be switched out
+ * @param ntp the thread to be switched in
+ * @note The function is declared as a weak symbol, it is possible to redefine
+ * it in your application code.
+ */
+__attribute__((naked, weak))
void sys_switch(Thread *otp, Thread *ntp) {
+ 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 r6 \n\t" \
+ "push r4");
+ 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));
}
+/**
+ * Disables the interrupts and halts the system. + * @note The function is declared as a weak symbol, it is possible to redefine
+ * it in your application code.
+ */
+__attribute__((weak))
void sys_halt(void) {
sys_disable();
@@ -44,4 +87,16 @@ void sys_halt(void) { }
}
+/**
+ * Start a thread by invoking its work function.
+ * If the work function returns @p chThdExit() is automatically invoked.
+ */
+void threadstart(void) {
+
+ asm volatile ("eint \n\t" \
+ "mov r11, r15 \n\t" \
+ "call r10 \n\t" \
+ "call #chThdExit");
+}
+
/** @} */
|