Remove the two separate ports, instead use two demo apps that use a conditional compilation to select the method of interrupt management to use.

pull/4/head
Richard Barry 17 years ago
parent a91c6302e7
commit 53b376b6b8

@ -52,6 +52,36 @@
#include <msp430x44x.h> #include <msp430x44x.h>
/*
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. * Application specific definitions.
* *

@ -26,9 +26,10 @@
<file file_name="ParTest/ParTest.c" Name="ParTest.c" /> <file file_name="ParTest/ParTest.c" Name="ParTest.c" />
<file file_name="serial/serial.c" Name="serial.c" /> <file file_name="serial/serial.c" Name="serial.c" />
<file file_name="../Common/Minimal/integer.c" Name="integer.c" /> <file file_name="../Common/Minimal/integer.c" Name="integer.c" />
<file file_name="serial/serialASM.asm" Name="serialASM.asm" />
</folder> </folder>
</project> </project>
<configuration compiler_optimization_strategy="Minimize size" optimize_code_motion="No" optimize_block_locality="No" optimize_register_allocation="Locals Only" Name="Debug" /> <configuration compiler_optimization_strategy="Minimize size" optimize_code_motion="No" optimize_block_locality="No" optimize_register_allocation="Locals Only" Name="Debug" />
<configuration c_preprocessor_definitions="NDEBUG" build_debug_information="No" Name="Release" build_optimize_output="Yes" /> <configuration c_preprocessor_definitions="NDEBUG" build_debug_information="No" Name="Release" build_optimize_output="Yes" />
<configuration c_preprocessor_definitions="ROWLEY_MSP430" c_user_include_directories="$(ProjectDir);$(ProjectDir)/../common/include" linker_printf_width_precision_supported="No" Name="Common" c_system_include_directories="$(StudioDir)/include;$(ProjectDir)/../../source/include;$(ProjectDir)/../../source/portable/Rowley/msp430F449" /> <configuration compiler_optimization_strategy="Maximize speed" c_preprocessor_definitions="ROWLEY_MSP430" c_user_include_directories="$(ProjectDir);$(ProjectDir)/../common/include" linker_printf_width_precision_supported="No" Name="Common" c_system_include_directories="$(StudioDir)/include;$(ProjectDir)/../../source/include;$(ProjectDir)/../../source/portable/Rowley/msp430F449" />
</solution> </solution>

@ -1,5 +1,9 @@
<!DOCTYPE CrossStudio_for_MSP430_Session_File> <!DOCTYPE CrossStudio_for_MSP430_Session_File>
<session> <session>
<Autos>
<Watches active="0" />
</Autos>
<Bookmarks/>
<Breakpoints/> <Breakpoints/>
<ExecutionCountWindow/> <ExecutionCountWindow/>
<Memory1> <Memory1>
@ -18,20 +22,18 @@
<ProjectSessionItem path="RTOSDemo" name="unnamed" /> <ProjectSessionItem path="RTOSDemo" name="unnamed" />
<ProjectSessionItem path="RTOSDemo;RTOSDemo" name="unnamed" /> <ProjectSessionItem path="RTOSDemo;RTOSDemo" name="unnamed" />
<ProjectSessionItem path="RTOSDemo;RTOSDemo;Demo Source" name="unnamed" /> <ProjectSessionItem path="RTOSDemo;RTOSDemo;Demo Source" name="unnamed" />
<ProjectSessionItem path="RTOSDemo;RTOSDemo;Scheduler Source" name="unnamed" />
<ProjectSessionItem path="RTOSDemo;RTOSDemo;Startup Code" name="unnamed" />
</Project> </Project>
<Register1> <Register1>
<RegisterWindow unsignedDisplays="" asciiDisplays="" octalDisplays="" visibleGroups="CPU Registers" decimalDisplays="" binaryDisplays="" /> <RegisterWindow unsignedDisplays="" asciiDisplays="" octalDisplays="" openGroups="CPU Registers" visibleGroups="CPU Registers" decimalDisplays="" binaryDisplays="" />
</Register1> </Register1>
<Register2> <Register2>
<RegisterWindow unsignedDisplays="" asciiDisplays="" octalDisplays="" visibleGroups="" decimalDisplays="" binaryDisplays="" /> <RegisterWindow unsignedDisplays="" asciiDisplays="" octalDisplays="" openGroups="" visibleGroups="" decimalDisplays="" binaryDisplays="" />
</Register2> </Register2>
<Register3> <Register3>
<RegisterWindow unsignedDisplays="" asciiDisplays="" octalDisplays="" visibleGroups="" decimalDisplays="" binaryDisplays="" /> <RegisterWindow unsignedDisplays="" asciiDisplays="" octalDisplays="" openGroups="" visibleGroups="" decimalDisplays="" binaryDisplays="" />
</Register3> </Register3>
<Register4> <Register4>
<RegisterWindow unsignedDisplays="" asciiDisplays="" octalDisplays="" visibleGroups="" decimalDisplays="" binaryDisplays="" /> <RegisterWindow unsignedDisplays="" asciiDisplays="" octalDisplays="" openGroups="" visibleGroups="" decimalDisplays="" binaryDisplays="" />
</Register4> </Register4>
<SourceNavigatorWindow/> <SourceNavigatorWindow/>
<TraceWindow> <TraceWindow>
@ -50,8 +52,7 @@
<Watches active="0" /> <Watches active="0" />
</Watch4> </Watch4>
<Files> <Files>
<SessionOpenFile useTextEdit="1" useBinaryEdit="0" x="0" debugPath="E:\Dev\FreeRTOS\Demo\msp430_CrossStudio\serial\serial.c" y="205" useHTMLEdit="0" path="E:\Dev\FreeRTOS\Demo\msp430_CrossStudio\serial\serial.c" left="0" selected="0" name="unnamed" top="186" /> <SessionOpenFile useTextEdit="1" useBinaryEdit="0" x="0" debugPath="c:\e\dev\freertos\workingcopy2\demo\msp430_crossworks\main.c" y="152" useHTMLEdit="0" path="c:\e\dev\freertos\workingcopy2\demo\msp430_crossworks\main.c" left="0" selected="1" name="unnamed" top="146" />
<SessionOpenFile useTextEdit="1" useBinaryEdit="0" x="0" debugPath="E:\Dev\FreeRTOS\Demo\msp430_CrossStudio\main.c" y="134" useHTMLEdit="0" path="E:\Dev\FreeRTOS\Demo\msp430_CrossStudio\main.c" left="0" selected="0" name="unnamed" top="131" />
</Files> </Files>
<MSP430CrossStudioWindow activeProject="RTOSDemo" ignoreExceptions="" autoConnectTarget="/MSP430 Flash Emulation Tool (MSP-FET430PIF)" debugSearchFileMap="" fileDialogInitialDirectory="E:\Dev\FreeRTOS\Demo\Common\Minimal" fileDialogDefaultFilter="*" debugSearchPath="" buildConfiguration="Debug" /> <MSP430CrossStudioWindow activeProject="RTOSDemo" moduleClockControl="24791" autoConnectTarget="/TI MSP430 Flash Emulation Tool (MSP-FET430PIF)" debugSearchFileMap="" fileDialogInitialDirectory="C:\E\Dev\FreeRTOS\WorkingCopy2\Demo\msp430_CrossWorks\serial" fileDialogDefaultFilter="*" haltTimerA="false" autoConnectCapabilities="1407" haltTimerB="false" holdBasicTimer="false" generalClockControl="46" debugSearchPath="" buildConfiguration="Debug" />
</session> </session>

@ -200,9 +200,7 @@ signed portBASE_TYPE xReturn;
} }
/*-----------------------------------------------------------*/ /*-----------------------------------------------------------*/
#ifdef MSP_ROWLEY_RB_PORT #if configINTERRUPT_EXAMPLE_METHOD == 1
/* Serial interrupt service routines for the RB port. */
/* /*
* UART RX interrupt service routine. * UART RX interrupt service routine.
@ -226,6 +224,7 @@ signed portBASE_TYPE xReturn;
taskYIELD(); taskYIELD();
} }
/* Make sure any low power mode bits are clear before leaving the ISR. */
__bic_SR_register_on_exit( SCG1 + SCG0 + OSCOFF + CPUOFF ); __bic_SR_register_on_exit( SCG1 + SCG0 + OSCOFF + CPUOFF );
} }
/*-----------------------------------------------------------*/ /*-----------------------------------------------------------*/
@ -252,17 +251,16 @@ signed portBASE_TYPE xReturn;
sTHREEmpty = pdTRUE; sTHREEmpty = pdTRUE;
} }
/* Make sure any low power mode bits are clear before leaving the ISR. */
__bic_SR_register_on_exit( SCG1 + SCG0 + OSCOFF + CPUOFF ); __bic_SR_register_on_exit( SCG1 + SCG0 + OSCOFF + CPUOFF );
} }
/*-----------------------------------------------------------*/
#endif #elif configINTERRUPT_EXAMPLE_METHOD == 2
/*-----------------------------------------------------------*/
#ifdef MSP_ROWLEY_MP_PORT
/* Serial port interrupts for the alternative port code. */ /* This is a standard C function as an assembly file wrapper is used as an
interrupt entry point. */
void ISRCom1Rx( void ) void vRxISR( void )
{ {
signed portCHAR cChar; signed portCHAR cChar;
portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE; portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
@ -273,17 +271,16 @@ signed portBASE_TYPE xReturn;
xQueueSendFromISR( xRxedChars, &cChar, &xHigherPriorityTaskWoken ); 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
/*If the post causes a task to wake force a context switch interrupted. */
as the woken task may have a higher priority than the task we have portYIELD_FROM_ISR( xHigherPriorityTaskWoken );
interrupted. */
portEXIT_SWITCHING_ISR( pdTRUE );
}
} }
/*-----------------------------------------------------------*/ /*-----------------------------------------------------------*/
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; signed portCHAR cChar;
portBASE_TYPE xTaskWoken = pdFALSE; portBASE_TYPE xTaskWoken = pdFALSE;
@ -303,5 +300,5 @@ signed portBASE_TYPE xReturn;
} }
} }
#endif #endif /* configINTERRUPT_EXAMPLE_METHOD */
/*-----------------------------------------------------------*/ /*-----------------------------------------------------------*/

@ -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
Loading…
Cancel
Save