\r
#include <msp430x44x.h>\r
\r
+/* \r
+Two interrupt examples are provided - \r
+\r
+ + Method 1 does everything in C code.\r
+ + Method 2 uses an assembly file wrapper.\r
+\r
+Code size:\r
+Method 1 uses assembly macros to save and restore the task context, whereas \r
+method 2 uses functions. This means method 1 will be faster, but method 2 will \r
+use less code space. \r
+\r
+Simplicity:\r
+Method 1 is very simplistic, whereas method 2 is more elaborate. This \r
+elaboration results in the code space saving, but also requires a slightly more \r
+complex procedure to define interrupt service routines. \r
+\r
+Interrupt efficiency:\r
+Method 1 uses the compiler generated function prologue and epilogue code to save \r
+and restore the necessary registers within an interrupt service routine (other \r
+than the RTOS tick ISR). Should a context switch be required from within the ISR \r
+the entire processor context is saved. This can result in some registers being saved \r
+twice - once by the compiler generated code, and then again by the FreeRTOS code.\r
+Method 2 saves and restores all the processor registers within each interrupt service \r
+routine, whether or not a context switch actually occurs. This means no registers \r
+ever get saved twice, but imposes an overhead on the occasions that no context switch \r
+occurs. \r
+*/\r
+\r
+#define configINTERRUPT_EXAMPLE_METHOD 1\r
+\r
/*-----------------------------------------------------------\r
* Application specific definitions.\r
*\r
<file file_name="ParTest/ParTest.c" Name="ParTest.c" />
<file file_name="serial/serial.c" Name="serial.c" />
<file file_name="../Common/Minimal/integer.c" Name="integer.c" />
+ <file file_name="serial/serialASM.asm" Name="serialASM.asm" />
</folder>
</project>
<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="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>
<!DOCTYPE CrossStudio_for_MSP430_Session_File>
<session>
+ <Autos>
+ <Watches active="0" />
+ </Autos>
+ <Bookmarks/>
<Breakpoints/>
<ExecutionCountWindow/>
<Memory1>
<ProjectSessionItem path="RTOSDemo" name="unnamed" />
<ProjectSessionItem path="RTOSDemo;RTOSDemo" 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>
<Register1>
- <RegisterWindow unsignedDisplays="" asciiDisplays="" octalDisplays="" visibleGroups="CPU Registers" decimalDisplays="" binaryDisplays="" />
+ <RegisterWindow unsignedDisplays="" asciiDisplays="" octalDisplays="" openGroups="CPU Registers" visibleGroups="CPU Registers" decimalDisplays="" binaryDisplays="" />
</Register1>
<Register2>
- <RegisterWindow unsignedDisplays="" asciiDisplays="" octalDisplays="" visibleGroups="" decimalDisplays="" binaryDisplays="" />
+ <RegisterWindow unsignedDisplays="" asciiDisplays="" octalDisplays="" openGroups="" visibleGroups="" decimalDisplays="" binaryDisplays="" />
</Register2>
<Register3>
- <RegisterWindow unsignedDisplays="" asciiDisplays="" octalDisplays="" visibleGroups="" decimalDisplays="" binaryDisplays="" />
+ <RegisterWindow unsignedDisplays="" asciiDisplays="" octalDisplays="" openGroups="" visibleGroups="" decimalDisplays="" binaryDisplays="" />
</Register3>
<Register4>
- <RegisterWindow unsignedDisplays="" asciiDisplays="" octalDisplays="" visibleGroups="" decimalDisplays="" binaryDisplays="" />
+ <RegisterWindow unsignedDisplays="" asciiDisplays="" octalDisplays="" openGroups="" visibleGroups="" decimalDisplays="" binaryDisplays="" />
</Register4>
<SourceNavigatorWindow/>
<TraceWindow>
<Watches active="0" />
</Watch4>
<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="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" />
+ <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" />
</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>
}\r
/*-----------------------------------------------------------*/\r
\r
-#ifdef MSP_ROWLEY_RB_PORT\r
-\r
-/* Serial interrupt service routines for the RB port. */\r
+#if configINTERRUPT_EXAMPLE_METHOD == 1\r
\r
/*\r
* UART RX interrupt service routine.\r
taskYIELD();\r
}\r
\r
+ /* Make sure any low power mode bits are clear before leaving the ISR. */\r
__bic_SR_register_on_exit( SCG1 + SCG0 + OSCOFF + CPUOFF );\r
}\r
/*-----------------------------------------------------------*/\r
sTHREEmpty = pdTRUE;\r
}\r
\r
+ /* Make sure any low power mode bits are clear before leaving the ISR. */\r
__bic_SR_register_on_exit( SCG1 + SCG0 + OSCOFF + CPUOFF );\r
}\r
+ /*-----------------------------------------------------------*/\r
\r
-#endif\r
-/*-----------------------------------------------------------*/\r
-\r
-#ifdef MSP_ROWLEY_MP_PORT\r
+#elif configINTERRUPT_EXAMPLE_METHOD == 2\r
\r
-/* Serial port interrupts for the alternative port code. */\r
-\r
- void ISRCom1Rx( void )\r
+ /* This is a standard C function as an assembly file wrapper is used as an\r
+ interrupt entry point. */\r
+ void vRxISR( void )\r
{\r
signed portCHAR cChar;\r
portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;\r
\r
xQueueSendFromISR( xRxedChars, &cChar, &xHigherPriorityTaskWoken );\r
\r
- if( xHigherPriorityTaskWoken )\r
- {\r
- /*If the post causes a task to wake force a context switch \r
- as the woken task may have a higher priority than the task we have \r
- interrupted. */\r
- portEXIT_SWITCHING_ISR( pdTRUE );\r
- }\r
+ /*If the post causes a task to wake force a context switch \r
+ as the woken task may have a higher priority than the task we have \r
+ interrupted. */\r
+ portYIELD_FROM_ISR( xHigherPriorityTaskWoken );\r
}\r
/*-----------------------------------------------------------*/\r
\r
- void ISRCom1Tx( void )\r
+ /* This is a standard C function as an assembly file wrapper is used as an\r
+ interrupt entry point. */\r
+ void vTxISR( void )\r
{\r
signed portCHAR cChar;\r
portBASE_TYPE xTaskWoken = pdFALSE;\r
}\r
}\r
\r
-#endif\r
+#endif /* configINTERRUPT_EXAMPLE_METHOD */\r
/*-----------------------------------------------------------*/\r
--- /dev/null
+/*\r
+ FreeRTOS.org V5.0.4 - Copyright (C) 2003-2008 Richard Barry.\r
+\r
+ This file is part of the FreeRTOS.org distribution.\r
+\r
+ FreeRTOS.org is free software; you can redistribute it and/or modify\r
+ it under the terms of the GNU General Public License as published by\r
+ the Free Software Foundation; either version 2 of the License, or\r
+ (at your option) any later version.\r
+\r
+ FreeRTOS.org is distributed in the hope that it will be useful,\r
+ but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r
+ GNU General Public License for more details.\r
+\r
+ You should have received a copy of the GNU General Public License\r
+ along with FreeRTOS.org; if not, write to the Free Software\r
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\r
+\r
+ A special exception to the GPL can be applied should you wish to distribute\r
+ a combined work that includes FreeRTOS.org, without being obliged to provide\r
+ the source code for any proprietary components. See the licensing section \r
+ of http://www.FreeRTOS.org for full details of how and when the exception\r
+ can be applied.\r
+\r
+ ***************************************************************************\r
+ ***************************************************************************\r
+ * *\r
+ * SAVE TIME AND MONEY! We can port FreeRTOS.org to your own hardware, *\r
+ * and even write all or part of your application on your behalf. *\r
+ * See http://www.OpenRTOS.com for details of the services we provide to *\r
+ * expedite your project. *\r
+ * *\r
+ ***************************************************************************\r
+ ***************************************************************************\r
+\r
+ Please ensure to read the configuration and relevant port sections of the\r
+ online documentation.\r
+\r
+ http://www.FreeRTOS.org - Documentation, latest information, license and \r
+ contact details.\r
+\r
+ http://www.SafeRTOS.com - A version that is certified for use in safety \r
+ critical systems.\r
+\r
+ http://www.OpenRTOS.com - Commercial support, development, porting, \r
+ licensing and training services.\r
+*/\r
+\r
+#include "FreeRTOSConfig.h"\r
+#include "portasm.h"\r
+\r
+/* These wrappers are only used when interrupt method 2 is being used. See\r
+FreeRTOSConfig.h for an explanation. */\r
+#if configINTERRUPT_EXAMPLE_METHOD == 2\r
+\r
+.CODE\r
+\r
+\r
+\r
+\r
+\r
+/* Wrapper for the Rx UART interrupt. */\r
+_vUARTRx_Wrapper\r
+\r
+ portSAVE_CONTEXT\r
+ call #_vRxISR\r
+ portRESTORE_CONTEXT\r
+\r
+/*-----------------------------------------------------------*/\r
+\r
+/* Wrapper for the Tx UART interrupt. */\r
+_vUARTTx_Wrapper\r
+\r
+ portSAVE_CONTEXT\r
+ call #_vTxISR\r
+ portRESTORE_CONTEXT\r
+\r
+/*-----------------------------------------------------------*/\r
+\r
+\r
+ \r
+\r
+ /* Place the UART ISRs in the correct vectors. */\r
+\r
+ .VECTORS\r
+\r
+ .KEEP\r
+\r
+ ORG UART1RX_VECTOR\r
+ DW _vUARTRx_Wrapper\r
+\r
+ ORG UART1TX_VECTOR\r
+ DW _vUARTTx_Wrapper \r
+ \r
+\r
+#endif /* configINTERRUPT_EXAMPLE_METHOD */\r
+\r
+ END\r
+ \r
+ \r