diff --git a/os/ports/GCC/MSP430/chcore.h b/os/ports/GCC/MSP430/chcore.h index 855b38925..ffc40dbcb 100644 --- a/os/ports/GCC/MSP430/chcore.h +++ b/os/ports/GCC/MSP430/chcore.h @@ -297,11 +297,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..c0d02a6a6 --- /dev/null +++ b/os/ports/GCC/MSP430/chcoreasm.s @@ -0,0 +1,65 @@ +/* + 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 . + + --- + + A special exception to the GPL can be applied should you wish to distribute + a combined work that includes ChibiOS/RT, without being obliged to provide + the source code for any proprietary components. See the file exception.txt + for full details of how and when the exception can be applied. +*/ + + .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 diff --git a/readme.txt b/readme.txt index 46a64e82e..91d445bbd 100644 --- a/readme.txt +++ b/readme.txt @@ -84,6 +84,7 @@ - FIX: Fixed different redefinition for __main_stack_end__ symbol (bug 3591317). - FIX: Fixed errors in STM32F0xx UART driver (bug 3589412). +- FIX: Fixed MSP430 port_switch code for MSPGCC issue (bug 3587633). - FIX: Fixed workaround for errata in STM32F4-A devices (bug 3586425). - FIX: Fixed error in palWritePad() macro (bug 3586230). - FIX: Fixed missing ; in testmbox.c (bug 3585979).