mirror of
https://github.com/FreeRTOS/FreeRTOS-Kernel.git
synced 2025-04-20 05:21:59 -04:00
Remove the two separate ports, instead use two demo apps that use a conditional compilation to select the method of interrupt management to use.
This commit is contained in:
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
|
/* This is a standard C function as an assembly file wrapper is used as an
|
||||||
|
interrupt entry point. */
|
||||||
/* Serial port interrupts for the alternative port code. */
|
void vRxISR( void )
|
||||||
|
|
||||||
void ISRCom1Rx( 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
|
/*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
|
as the woken task may have a higher priority than the task we have
|
||||||
interrupted. */
|
interrupted. */
|
||||||
portEXIT_SWITCHING_ISR( pdTRUE );
|
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;
|
signed portCHAR cChar;
|
||||||
portBASE_TYPE xTaskWoken = pdFALSE;
|
portBASE_TYPE xTaskWoken = pdFALSE;
|
||||||
|
@ -303,5 +300,5 @@ signed portBASE_TYPE xReturn;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif /* configINTERRUPT_EXAMPLE_METHOD */
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
101
Demo/msp430_CrossWorks/serial/serialASM.asm
Normal file
101
Demo/msp430_CrossWorks/serial/serialASM.asm
Normal file
|
@ -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…
Reference in a new issue