From: richardbarry Date: Thu, 23 Oct 2008 19:16:29 +0000 (+0000) Subject: Remove the two separate ports, instead use two demo apps that use a conditional compi... X-Git-Tag: V5.1.2~177 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=650f9a7b4d6a07da11d576f64a09d75c30523a09;p=freertos Remove the two separate ports, instead use two demo apps that use a conditional compilation to select the method of interrupt management to use. git-svn-id: https://svn.code.sf.net/p/freertos/code/trunk@519 1d2547de-c912-0410-9cb9-b8ca96c0e9e2 --- diff --git a/Demo/msp430_CrossWorks/FreeRTOSConfig.h b/Demo/msp430_CrossWorks/FreeRTOSConfig.h index bf9c7f5ae..5b30cbc78 100644 --- a/Demo/msp430_CrossWorks/FreeRTOSConfig.h +++ b/Demo/msp430_CrossWorks/FreeRTOSConfig.h @@ -52,6 +52,36 @@ #include +/* +Two interrupt examples are provided - + + + Method 1 does everything in C code. + + Method 2 uses an assembly file wrapper. + +Code size: +Method 1 uses assembly macros to save and restore the task context, whereas +method 2 uses functions. This means method 1 will be faster, but method 2 will +use less code space. + +Simplicity: +Method 1 is very simplistic, whereas method 2 is more elaborate. This +elaboration results in the code space saving, but also requires a slightly more +complex procedure to define interrupt service routines. + +Interrupt efficiency: +Method 1 uses the compiler generated function prologue and epilogue code to save +and restore the necessary registers within an interrupt service routine (other +than the RTOS tick ISR). Should a context switch be required from within the ISR +the entire processor context is saved. This can result in some registers being saved +twice - once by the compiler generated code, and then again by the FreeRTOS code. +Method 2 saves and restores all the processor registers within each interrupt service +routine, whether or not a context switch actually occurs. This means no registers +ever get saved twice, but imposes an overhead on the occasions that no context switch +occurs. +*/ + +#define configINTERRUPT_EXAMPLE_METHOD 1 + /*----------------------------------------------------------- * Application specific definitions. * diff --git a/Demo/msp430_CrossWorks/RTOSDemo.hzp b/Demo/msp430_CrossWorks/RTOSDemo.hzp index 94acc5011..56bb5a73b 100644 --- a/Demo/msp430_CrossWorks/RTOSDemo.hzp +++ b/Demo/msp430_CrossWorks/RTOSDemo.hzp @@ -26,9 +26,10 @@ + - + diff --git a/Demo/msp430_CrossWorks/RTOSDemo.hzs b/Demo/msp430_CrossWorks/RTOSDemo.hzs index c4dc21923..bbeaeac8b 100644 --- a/Demo/msp430_CrossWorks/RTOSDemo.hzs +++ b/Demo/msp430_CrossWorks/RTOSDemo.hzs @@ -1,5 +1,9 @@ + + + + @@ -18,20 +22,18 @@ - - - + - + - + - + @@ -50,8 +52,7 @@ - - + - + diff --git a/Demo/msp430_CrossWorks/serial/serial.c b/Demo/msp430_CrossWorks/serial/serial.c index 175d591c0..c22195b27 100644 --- a/Demo/msp430_CrossWorks/serial/serial.c +++ b/Demo/msp430_CrossWorks/serial/serial.c @@ -200,9 +200,7 @@ signed portBASE_TYPE xReturn; } /*-----------------------------------------------------------*/ -#ifdef MSP_ROWLEY_RB_PORT - -/* Serial interrupt service routines for the RB port. */ +#if configINTERRUPT_EXAMPLE_METHOD == 1 /* * UART RX interrupt service routine. @@ -226,6 +224,7 @@ signed portBASE_TYPE xReturn; taskYIELD(); } + /* Make sure any low power mode bits are clear before leaving the ISR. */ __bic_SR_register_on_exit( SCG1 + SCG0 + OSCOFF + CPUOFF ); } /*-----------------------------------------------------------*/ @@ -252,17 +251,16 @@ signed portBASE_TYPE xReturn; sTHREEmpty = pdTRUE; } + /* Make sure any low power mode bits are clear before leaving the ISR. */ __bic_SR_register_on_exit( SCG1 + SCG0 + OSCOFF + CPUOFF ); } + /*-----------------------------------------------------------*/ -#endif -/*-----------------------------------------------------------*/ - -#ifdef MSP_ROWLEY_MP_PORT +#elif configINTERRUPT_EXAMPLE_METHOD == 2 -/* Serial port interrupts for the alternative port code. */ - - void ISRCom1Rx( void ) + /* This is a standard C function as an assembly file wrapper is used as an + interrupt entry point. */ + void vRxISR( void ) { signed portCHAR cChar; portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE; @@ -273,17 +271,16 @@ signed portBASE_TYPE xReturn; xQueueSendFromISR( xRxedChars, &cChar, &xHigherPriorityTaskWoken ); - if( xHigherPriorityTaskWoken ) - { - /*If the post causes a task to wake force a context switch - as the woken task may have a higher priority than the task we have - interrupted. */ - portEXIT_SWITCHING_ISR( pdTRUE ); - } + /*If the post causes a task to wake force a context switch + as the woken task may have a higher priority than the task we have + interrupted. */ + portYIELD_FROM_ISR( xHigherPriorityTaskWoken ); } /*-----------------------------------------------------------*/ - void ISRCom1Tx( void ) + /* This is a standard C function as an assembly file wrapper is used as an + interrupt entry point. */ + void vTxISR( void ) { signed portCHAR cChar; portBASE_TYPE xTaskWoken = pdFALSE; @@ -303,5 +300,5 @@ signed portBASE_TYPE xReturn; } } -#endif +#endif /* configINTERRUPT_EXAMPLE_METHOD */ /*-----------------------------------------------------------*/ diff --git a/Demo/msp430_CrossWorks/serial/serialASM.asm b/Demo/msp430_CrossWorks/serial/serialASM.asm new file mode 100644 index 000000000..85b6a0e34 --- /dev/null +++ b/Demo/msp430_CrossWorks/serial/serialASM.asm @@ -0,0 +1,101 @@ +/* + FreeRTOS.org V5.0.4 - Copyright (C) 2003-2008 Richard Barry. + + This file is part of the FreeRTOS.org distribution. + + FreeRTOS.org 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 2 of the License, or + (at your option) any later version. + + FreeRTOS.org 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 FreeRTOS.org; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + A special exception to the GPL can be applied should you wish to distribute + a combined work that includes FreeRTOS.org, without being obliged to provide + the source code for any proprietary components. See the licensing section + of http://www.FreeRTOS.org for full details of how and when the exception + can be applied. + + *************************************************************************** + *************************************************************************** + * * + * SAVE TIME AND MONEY! We can port FreeRTOS.org to your own hardware, * + * and even write all or part of your application on your behalf. * + * See http://www.OpenRTOS.com for details of the services we provide to * + * expedite your project. * + * * + *************************************************************************** + *************************************************************************** + + Please ensure to read the configuration and relevant port sections of the + online documentation. + + http://www.FreeRTOS.org - Documentation, latest information, license and + contact details. + + http://www.SafeRTOS.com - A version that is certified for use in safety + critical systems. + + http://www.OpenRTOS.com - Commercial support, development, porting, + licensing and training services. +*/ + +#include "FreeRTOSConfig.h" +#include "portasm.h" + +/* These wrappers are only used when interrupt method 2 is being used. See +FreeRTOSConfig.h for an explanation. */ +#if configINTERRUPT_EXAMPLE_METHOD == 2 + +.CODE + + + + + +/* Wrapper for the Rx UART interrupt. */ +_vUARTRx_Wrapper + + portSAVE_CONTEXT + call #_vRxISR + portRESTORE_CONTEXT + +/*-----------------------------------------------------------*/ + +/* Wrapper for the Tx UART interrupt. */ +_vUARTTx_Wrapper + + portSAVE_CONTEXT + call #_vTxISR + portRESTORE_CONTEXT + +/*-----------------------------------------------------------*/ + + + + + /* Place the UART ISRs in the correct vectors. */ + + .VECTORS + + .KEEP + + ORG UART1RX_VECTOR + DW _vUARTRx_Wrapper + + ORG UART1TX_VECTOR + DW _vUARTTx_Wrapper + + +#endif /* configINTERRUPT_EXAMPLE_METHOD */ + + END + +