Fixed bug 3587633.

git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@4858 35acf78f-673a-0410-8e92-d51de3d6d3f4
This commit is contained in:
gdisirio 2012-12-01 08:57:23 +00:00
parent 3fbe4a0bac
commit 7cdd09461c
5 changed files with 74 additions and 106 deletions

View File

@ -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");
}
/** @} */

View File

@ -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
}

View File

@ -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

View File

@ -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

View File

@ -88,6 +88,8 @@
3591317)(backported to 2.4.3).
- FIX: Fixed errors in STM32F0xx UART driver (bug 3589412)(backported
to 2.4.3).
- FIX: Fixed MSP430 port_switch code for MSPGCC issue (bug 3587633)(backported
to 2.4.3).
- FIX: Fixed workaround for errata in STM32F4-A devices (bug 3586425)
(backported to 2.4.3).
- FIX: Fixed error in palWritePad() macro (bug 3586230)(backported to 2.2.10