]> git.sur5r.net Git - freertos/commitdiff
Continue to develop the MSP430X IAR demo project - still a work in progress.
authorrichardbarry <richardbarry@1d2547de-c912-0410-9cb9-b8ca96c0e9e2>
Fri, 31 Dec 2010 14:51:15 +0000 (14:51 +0000)
committerrichardbarry <richardbarry@1d2547de-c912-0410-9cb9-b8ca96c0e9e2>
Fri, 31 Dec 2010 14:51:15 +0000 (14:51 +0000)
git-svn-id: https://svn.code.sf.net/p/freertos/code/trunk@1196 1d2547de-c912-0410-9cb9-b8ca96c0e9e2

Demo/MSP430X_MSP430F5438_IAR/FreeRTOSConfig.h
Demo/MSP430X_MSP430F5438_IAR/ParTest.c [new file with mode: 0644]
Demo/MSP430X_MSP430F5438_IAR/RTOSDemo.ewd
Demo/MSP430X_MSP430F5438_IAR/RTOSDemo.ewp
Demo/MSP430X_MSP430F5438_IAR/lnk430F5438A_mod.xcl
Demo/MSP430X_MSP430F5438_IAR/low_level_init.c
Demo/MSP430X_MSP430F5438_IAR/main.c
Demo/MSP430X_MSP430F5438_IAR/serial.c [new file with mode: 0644]

index ebafb803f34aeb1ba962d789b25219237dfac8ef..5024dbfe5ace04a908726906496fec0853c18d35 100644 (file)
 #define configUSE_PREEMPTION                   1\r
 #define configUSE_IDLE_HOOK                            1\r
 #define configUSE_TICK_HOOK                            1\r
 #define configUSE_PREEMPTION                   1\r
 #define configUSE_IDLE_HOOK                            1\r
 #define configUSE_TICK_HOOK                            1\r
-#define configCPU_CLOCK_HZ                             ( 16000000UL )  \r
+#define configCPU_CLOCK_HZ                             ( 8000000UL )   \r
 #define configTICK_RATE_HZ                             ( ( portTickType ) 1000 )\r
 #define configMAX_PRIORITIES                   ( ( unsigned portBASE_TYPE ) 5 )\r
 #define configMINIMAL_STACK_SIZE               ( ( unsigned short ) 60 )\r
 #define configTICK_RATE_HZ                             ( ( portTickType ) 1000 )\r
 #define configMAX_PRIORITIES                   ( ( unsigned portBASE_TYPE ) 5 )\r
 #define configMINIMAL_STACK_SIZE               ( ( unsigned short ) 60 )\r
-#define configTOTAL_HEAP_SIZE                  ( ( size_t ) ( 5 * 1024 ) )\r
+#define configTOTAL_HEAP_SIZE                  ( ( size_t ) ( 10 * 1024 ) )\r
 #define configMAX_TASK_NAME_LEN                        ( 16 )\r
 #define configUSE_TRACE_FACILITY               0\r
 #define configUSE_16_BIT_TICKS                 0\r
 #define configIDLE_SHOULD_YIELD                        1\r
 #define configUSE_MUTEXES                              1\r
 #define configQUEUE_REGISTRY_SIZE              5\r
 #define configMAX_TASK_NAME_LEN                        ( 16 )\r
 #define configUSE_TRACE_FACILITY               0\r
 #define configUSE_16_BIT_TICKS                 0\r
 #define configIDLE_SHOULD_YIELD                        1\r
 #define configUSE_MUTEXES                              1\r
 #define configQUEUE_REGISTRY_SIZE              5\r
-#define configGENERATE_RUN_TIME_STATS  0\r
+#define configGENERATE_RUN_TIME_STATS  1\r
 #define configCHECK_FOR_STACK_OVERFLOW 2\r
 #define configUSE_RECURSIVE_MUTEXES            0\r
 #define configUSE_MALLOC_FAILED_HOOK   1\r
 #define configCHECK_FOR_STACK_OVERFLOW 2\r
 #define configUSE_RECURSIVE_MUTEXES            0\r
 #define configUSE_MALLOC_FAILED_HOOK   1\r
@@ -103,6 +103,16 @@ to exclude the API function. */
 \r
 #define configTICK_INTERRUPT_VECTOR            TIMER0_A0_VECTOR\r
 \r
 \r
 #define configTICK_INTERRUPT_VECTOR            TIMER0_A0_VECTOR\r
 \r
+/* Prevent the following definitions being included when FreeRTOSConfig.h\r
+is included from an asm file. */\r
+#ifdef __ICC430__\r
+       extern void vConfigureTimerForRunTimeStats( void );\r
+       extern inline unsigned long ulGetRunTimeStatsTime( void );\r
+       extern volatile unsigned long ulStatsOverflowCount;\r
+#endif /* __ICCARM__ */\r
+\r
+#define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() vConfigureTimerForRunTimeStats()\r
+#define portGET_RUN_TIME_COUNTER_VALUE() ulGetRunTimeStatsTime()\r
 \r
 #endif /* FREERTOS_CONFIG_H */\r
 \r
 \r
 #endif /* FREERTOS_CONFIG_H */\r
 \r
diff --git a/Demo/MSP430X_MSP430F5438_IAR/ParTest.c b/Demo/MSP430X_MSP430F5438_IAR/ParTest.c
new file mode 100644 (file)
index 0000000..477ff98
--- /dev/null
@@ -0,0 +1,136 @@
+/*\r
+    FreeRTOS V6.1.0 - Copyright (C) 2010 Real Time Engineers Ltd.\r
+\r
+    ***************************************************************************\r
+    *                                                                         *\r
+    * If you are:                                                             *\r
+    *                                                                         *\r
+    *    + New to FreeRTOS,                                                   *\r
+    *    + Wanting to learn FreeRTOS or multitasking in general quickly       *\r
+    *    + Looking for basic training,                                        *\r
+    *    + Wanting to improve your FreeRTOS skills and productivity           *\r
+    *                                                                         *\r
+    * then take a look at the FreeRTOS books - available as PDF or paperback  *\r
+    *                                                                         *\r
+    *        "Using the FreeRTOS Real Time Kernel - a Practical Guide"        *\r
+    *                  http://www.FreeRTOS.org/Documentation                  *\r
+    *                                                                         *\r
+    * A pdf reference manual is also available.  Both are usually delivered   *\r
+    * to your inbox within 20 minutes to two hours when purchased between 8am *\r
+    * and 8pm GMT (although please allow up to 24 hours in case of            *\r
+    * exceptional circumstances).  Thank you for your support!                *\r
+    *                                                                         *\r
+    ***************************************************************************\r
+\r
+    This file is part of the FreeRTOS distribution.\r
+\r
+    FreeRTOS is free software; you can redistribute it and/or modify it under\r
+    the terms of the GNU General Public License (version 2) as published by the\r
+    Free Software Foundation AND MODIFIED BY the FreeRTOS exception.\r
+    ***NOTE*** The exception to the GPL is included to allow you to distribute\r
+    a combined work that includes FreeRTOS without being obliged to provide the\r
+    source code for proprietary components outside of the FreeRTOS kernel.\r
+    FreeRTOS is distributed in the hope that it will be useful, but WITHOUT\r
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\r
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for\r
+    more details. You should have received a copy of the GNU General Public\r
+    License and the FreeRTOS license exception along with FreeRTOS; if not it\r
+    can be viewed here: http://www.freertos.org/a00114.html and also obtained\r
+    by writing to Richard Barry, contact details for whom are available on the\r
+    FreeRTOS WEB site.\r
+\r
+    1 tab == 4 spaces!\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
+/*-----------------------------------------------------------\r
+ * Simple parallel port IO routines to flash LEDs.\r
+ *-----------------------------------------------------------*/\r
+\r
+/* Kernel includes. */\r
+#include "FreeRTOS.h"\r
+#include "task.h"\r
+\r
+/* Hardware includes. */\r
+#include "msp430.h"\r
+#include "hal_MSP-EXP430F5438.h"\r
+\r
+/*-----------------------------------------------------------*/\r
+\r
+void vParTestInitialise( void )\r
+{\r
+       /* The port used by the two LEDs is configured from halBoardInit() so\r
+       nothing needs to be done here. */\r
+}\r
+/*-----------------------------------------------------------*/\r
+\r
+void vParTestSetLED( unsigned portBASE_TYPE uxLED, signed portBASE_TYPE xValue )\r
+{\r
+       taskENTER_CRITICAL();\r
+       {\r
+               if( xValue != pdFALSE )\r
+               {\r
+                       switch( uxLED )\r
+                       {\r
+                               case 0: LED_PORT_OUT |= LED_1;\r
+                                               break;\r
+       \r
+                               case 1: LED_PORT_OUT |= LED_2;\r
+                                               break;\r
+                       }\r
+               }\r
+               else\r
+               {\r
+                       switch( uxLED )\r
+                       {\r
+                               case 0: LED_PORT_OUT &= ~LED_1;\r
+                                               break;\r
+       \r
+                               case 1: LED_PORT_OUT &= ~LED_2;\r
+                                               break;\r
+                       }\r
+               }\r
+       }\r
+       taskEXIT_CRITICAL();\r
+}\r
+/*-----------------------------------------------------------*/\r
+\r
+void vParTestToggleLED( unsigned portBASE_TYPE uxLED )\r
+{\r
+       taskENTER_CRITICAL();\r
+       {\r
+               switch( uxLED )\r
+               {\r
+                       case 0: if( ( LED_PORT_OUT & LED_1 ) == 0 )\r
+                                       {\r
+                                               LED_PORT_OUT |= LED_1;\r
+                                       }\r
+                                       else\r
+                                       {\r
+                                               LED_PORT_OUT &= ~LED_1;\r
+                                       }\r
+                                       break;\r
+\r
+                       case 1: if( ( LED_PORT_OUT & LED_2 ) == 0 )\r
+                                       {\r
+                                               LED_PORT_OUT |= LED_2;\r
+                                       }\r
+                                       else\r
+                                       {\r
+                                               LED_PORT_OUT &= ~LED_2;\r
+                                       }\r
+                                       break;\r
+               }\r
+       }\r
+       taskEXIT_CRITICAL();\r
+}\r
+/*-----------------------------------------------------------*/\r
+\r
index 64ed02cb47da37ec2905f9e2303d1eaef4bc0a12..aba9d35fcd79bb1f2b0de49fda59891da7ce05a0 100644 (file)
         </option>\r
         <option>\r
           <name>EMUVerifyDownloadP7</name>\r
         </option>\r
         <option>\r
           <name>EMUVerifyDownloadP7</name>\r
-          <state>0</state>\r
+          <state>1</state>\r
         </option>\r
         <option>\r
           <name>EraseOptionSlaveP7</name>\r
         </option>\r
         <option>\r
           <name>EraseOptionSlaveP7</name>\r
         </option>\r
         <option>\r
           <name>TargetSettlingtime</name>\r
         </option>\r
         <option>\r
           <name>TargetSettlingtime</name>\r
-          <state>0</state>\r
+          <state>10</state>\r
         </option>\r
         <option>\r
           <name>AllowAccessToBSL</name>\r
         </option>\r
         <option>\r
           <name>AllowAccessToBSL</name>\r
index 783d014d7271100a678bd1ab28521d8ecfc8fdfd..73ada9785448ce60c0032cd3906d30c90cad7576 100644 (file)
       <name>$PROJ_DIR$\MSP-EXP430F5438_HAL\hal_usb.h</name>\r
     </file>\r
   </group>\r
       <name>$PROJ_DIR$\MSP-EXP430F5438_HAL\hal_usb.h</name>\r
     </file>\r
   </group>\r
+  <group>\r
+    <name>Standard_Demo_Tasks</name>\r
+    <file>\r
+      <name>$PROJ_DIR$\..\Common\Minimal\comtest.c</name>\r
+    </file>\r
+  </group>\r
   <group>\r
     <name>UserExperienceDemo</name>\r
     <file>\r
   <group>\r
     <name>UserExperienceDemo</name>\r
     <file>\r
   <file>\r
     <name>$PROJ_DIR$\main.c</name>\r
   </file>\r
   <file>\r
     <name>$PROJ_DIR$\main.c</name>\r
   </file>\r
+  <file>\r
+    <name>$PROJ_DIR$\ParTest.c</name>\r
+  </file>\r
   <file>\r
     <name>$PROJ_DIR$\readme.txt</name>\r
   </file>\r
   <file>\r
     <name>$PROJ_DIR$\RegTest.s43</name>\r
   </file>\r
   <file>\r
     <name>$PROJ_DIR$\readme.txt</name>\r
   </file>\r
   <file>\r
     <name>$PROJ_DIR$\RegTest.s43</name>\r
   </file>\r
+  <file>\r
+    <name>$PROJ_DIR$\serial.c</name>\r
+  </file>\r
 </project>\r
 \r
 \r
 </project>\r
 \r
 \r
index 5c747173d70aa600733873c94eb4dbe95b4261b7..001b52bbc8febf1dc247225026c9a6b037ef7156 100644 (file)
 \r
 // *** Modified to place code in high memory and insodoing, testing the port.\r
 // Original code\r
 \r
 // *** Modified to place code in high memory and insodoing, testing the port.\r
 // Original code\r
-//-P(CODE)CODE=5C00-FF7F,10000-45BFF\r
+-P(CODE)CODE=5C00-FF7F,10000-45BFF\r
 // Modified code\r
 // Modified code\r
--P(CODE)CODE=10000-45BFF\r
+//-P(CODE)CODE=10000-45BFF\r
 -Z(CODE)CODE_ID\r
 \r
 // ---------------------------\r
 -Z(CODE)CODE_ID\r
 \r
 // ---------------------------\r
index 9eba236522d7c21c5c3f51d3cb01bee29d3ebc81..33bef37a4dd9995850d7a9e980878c2d7c5aebc4 100644 (file)
 int __low_level_init(void)\r
 {\r
   /* Insert your low-level initializations here */\r
 int __low_level_init(void)\r
 {\r
   /* Insert your low-level initializations here */\r
-  \r
+  _DINT();\r
   WDTCTL = WDTPW+WDTHOLD;\r
   WDTCTL = WDTPW+WDTHOLD;\r
-  \r
+\r
+\r
   /*\r
    * Return value:\r
    *\r
   /*\r
    * Return value:\r
    *\r
index 4bcfe27ed5a6761091032474a74c14f5bbb29e12..1367461a0bd52689a2d15c1f5a0297f40a18d22e 100644 (file)
     http://www.OpenRTOS.com - Commercial support, development, porting,\r
     licensing and training services.\r
 */\r
     http://www.OpenRTOS.com - Commercial support, development, porting,\r
     licensing and training services.\r
 */\r
+\r
+/* Standard includes. */\r
 #include <stdio.h>\r
 \r
 #include <stdio.h>\r
 \r
+/* FreeRTOS includes. */\r
 #include "FreeRTOS.h"\r
 #include "task.h"\r
 #include "queue.h"\r
 \r
 #include "FreeRTOS.h"\r
 #include "task.h"\r
 #include "queue.h"\r
 \r
+/* Hardware includes. */\r
 #include "msp430.h"\r
 #include "hal_MSP-EXP430F5438.h"\r
 \r
 #include "msp430.h"\r
 #include "hal_MSP-EXP430F5438.h"\r
 \r
+/* Standard demo includes. */\r
+#include "ParTest.h"\r
+#include "comtest2.h"\r
+\r
 /* Codes sent within messages to the LCD task so the LCD task can interpret\r
 exactly what the message it just received was.  These are sent in the\r
 cMessageID member of the message structure (defined below). */\r
 /* Codes sent within messages to the LCD task so the LCD task can interpret\r
 exactly what the message it just received was.  These are sent in the\r
 cMessageID member of the message structure (defined below). */\r
@@ -67,7 +75,7 @@ cMessageID member of the message structure (defined below). */
 #define mainMESSAGE_STATUS                             ( 3 )\r
 \r
 /* When the cMessageID member of the message sent to the LCD task is\r
 #define mainMESSAGE_STATUS                             ( 3 )\r
 \r
 /* When the cMessageID member of the message sent to the LCD task is\r
-mainMESSAGE_STATUS then these definitions are sent in the cMessageValue member\r
+mainMESSAGE_STATUS then these definitions are sent in the ulMessageValue member\r
 of the same message and indicate what the status actually is. */\r
 #define mainERROR_DYNAMIC_TASKS                        ( pdPASS + 1 )\r
 #define mainERROR_COM_TEST                             ( pdPASS + 2 )\r
 of the same message and indicate what the status actually is. */\r
 #define mainERROR_DYNAMIC_TASKS                        ( pdPASS + 1 )\r
 #define mainERROR_COM_TEST                             ( pdPASS + 2 )\r
@@ -79,6 +87,13 @@ to send messages from tasks and interrupts the the LCD task. */
 #define mainQUEUE_LENGTH                               ( 5 )\r
 \r
 #define mainLCD_TASK_PRIORITY                  ( tskIDLE_PRIORITY + 1 )\r
 #define mainQUEUE_LENGTH                               ( 5 )\r
 \r
 #define mainLCD_TASK_PRIORITY                  ( tskIDLE_PRIORITY + 1 )\r
+#define mainCOM_TEST_PRIORITY                  ( tskIDLE_PRIORITY + 2 )\r
+\r
+/* The LED used by the comtest tasks. See the comtest.c file for more\r
+information.  In this case it is deliberately out of range as there are only\r
+two LEDs, and they are both already in use. */\r
+#define mainCOM_TEST_LED                       ( 3 )\r
+\r
 \r
 /*-----------------------------------------------------------*/\r
 \r
 \r
 /*-----------------------------------------------------------*/\r
 \r
@@ -92,6 +107,7 @@ static void prvGenerateStatusMessage( char *pcBuffer, long lStatusValue );
 /*-----------------------------------------------------------*/\r
 \r
 volatile unsigned short usRegTest1Counter = 0, usRegTest2Counter = 0;\r
 /*-----------------------------------------------------------*/\r
 \r
 volatile unsigned short usRegTest1Counter = 0, usRegTest2Counter = 0;\r
+volatile unsigned long ulStatsOverflowCount = 0;\r
 \r
 /* The handle of the queue used to send messages from tasks and interrupts to\r
 the LCD task. */\r
 \r
 /* The handle of the queue used to send messages from tasks and interrupts to\r
 the LCD task. */\r
@@ -102,31 +118,34 @@ task. */
 typedef struct\r
 {\r
        char cMessageID;        /* << States what the message is. */\r
 typedef struct\r
 {\r
        char cMessageID;        /* << States what the message is. */\r
-       char cMessageValue; /* << States the message value (can be an integer, string pointer, etc. depending on the value of cMessageID. */\r
+       unsigned long ulMessageValue; /* << States the message value (can be an integer, string pointer, etc. depending on the value of cMessageID. */\r
 } xQueueMessage;\r
 /*-----------------------------------------------------------*/\r
 \r
 void main( void )\r
 {\r
        prvSetupHardware();\r
 } xQueueMessage;\r
 /*-----------------------------------------------------------*/\r
 \r
 void main( void )\r
 {\r
        prvSetupHardware();\r
-       \r
+\r
        /* Create the queue used by tasks and interrupts to send strings to the LCD\r
        task. */\r
        xLCDQueue = xQueueCreate( mainQUEUE_LENGTH, sizeof( xQueueMessage ) );\r
        /* Create the queue used by tasks and interrupts to send strings to the LCD\r
        task. */\r
        xLCDQueue = xQueueCreate( mainQUEUE_LENGTH, sizeof( xQueueMessage ) );\r
-       \r
+\r
        if( xLCDQueue != NULL )\r
        {\r
                /* Add the created queue to the queue registry so it can be viewed in\r
                the IAR FreeRTOS state viewer plug-in. */\r
                vQueueAddToRegistry( xLCDQueue, "LCDQueue" );\r
 \r
        if( xLCDQueue != NULL )\r
        {\r
                /* Add the created queue to the queue registry so it can be viewed in\r
                the IAR FreeRTOS state viewer plug-in. */\r
                vQueueAddToRegistry( xLCDQueue, "LCDQueue" );\r
 \r
+               /* Create the standard demo tasks. */\r
+               vAltStartComTestTasks( mainCOM_TEST_PRIORITY, 9600, mainCOM_TEST_LED );\r
+               \r
                /* Create the terminal IO and button poll tasks, as described at the top\r
                of this file. */\r
                /* Create the terminal IO and button poll tasks, as described at the top\r
                of this file. */\r
-               xTaskCreate( prvTerminalIOTask, ( signed char * ) "IO", configMINIMAL_STACK_SIZE, NULL, mainLCD_TASK_PRIORITY, NULL );\r
-               xTaskCreate( prvButtonPollTask, ( signed char * ) "ButPoll", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL );\r
+               xTaskCreate( prvTerminalIOTask, ( signed char * ) "IO", configMINIMAL_STACK_SIZE * 2, NULL, mainLCD_TASK_PRIORITY, NULL );\r
+               xTaskCreate( prvButtonPollTask, ( signed char * ) "BPoll", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL );\r
 \r
 \r
-               xTaskCreate( vRegTest1Task, "RegTest1", configMINIMAL_STACK_SIZE, NULL, 0, NULL );\r
-               xTaskCreate( vRegTest2Task, "RegTest2", configMINIMAL_STACK_SIZE, NULL, 0, NULL );\r
+               xTaskCreate( vRegTest1Task, "Reg1", configMINIMAL_STACK_SIZE, NULL, 0, NULL );\r
+               xTaskCreate( vRegTest2Task, "Reg2", configMINIMAL_STACK_SIZE, NULL, 0, NULL );\r
                vTaskStartScheduler();\r
        }\r
        for( ;; );\r
                vTaskStartScheduler();\r
        }\r
        for( ;; );\r
@@ -169,7 +188,7 @@ static char cBuffer[ 512 ];
                                                                                                informed this task that the up\r
                                                                                                button on the joystick input has\r
                                                                                                been pressed or released. */\r
                                                                                                informed this task that the up\r
                                                                                                button on the joystick input has\r
                                                                                                been pressed or released. */\r
-                                                                                               sprintf( cBuffer, "Button up = %d", xReceivedMessage.cMessageValue );\r
+                                                                                               sprintf( cBuffer, "Button up = %d", ( int ) xReceivedMessage.ulMessageValue );\r
                                                                                                break;\r
 \r
                        case mainMESSAGE_BUTTON_SEL             :       /* The select button interrupt\r
                                                                                                break;\r
 \r
                        case mainMESSAGE_BUTTON_SEL             :       /* The select button interrupt\r
@@ -180,7 +199,8 @@ static char cBuffer[ 512 ];
                                                                                                the terminal IO window in the IAR\r
                                                                                                embedded workbench. */\r
                                                                                                printf( "\nTask\t     Abs Time\t     %%Time\n*****************************************" );\r
                                                                                                the terminal IO window in the IAR\r
                                                                                                embedded workbench. */\r
                                                                                                printf( "\nTask\t     Abs Time\t     %%Time\n*****************************************" );\r
-//                                                                                             vTaskGetRunTimeStats( ( signed char * ) cBuffer );\r
+                                                                                               fflush( stdout );\r
+                                                                                               vTaskGetRunTimeStats( ( signed char * ) cBuffer );\r
 //                                                                                             printf( cBuffer );\r
                                                                                                break;\r
                                                                                                \r
 //                                                                                             printf( cBuffer );\r
                                                                                                break;\r
                                                                                                \r
@@ -189,7 +209,7 @@ static char cBuffer[ 512 ];
                                                                                                task of the system status.\r
                                                                                                Generate a string in accordance\r
                                                                                                with the status value. */\r
                                                                                                task of the system status.\r
                                                                                                Generate a string in accordance\r
                                                                                                with the status value. */\r
-                                                                                               prvGenerateStatusMessage( cBuffer, xReceivedMessage.cMessageValue );\r
+                                                                                               prvGenerateStatusMessage( cBuffer, xReceivedMessage.ulMessageValue );\r
                                                                                                break;\r
                                                                                                \r
                        default                                                 :       sprintf( cBuffer, "Unknown message" );\r
                                                                                                break;\r
                                                                                                \r
                        default                                                 :       sprintf( cBuffer, "Unknown message" );\r
@@ -214,7 +234,7 @@ static void prvGenerateStatusMessage( char *pcBuffer, long lStatusValue )
                                                                                        break;\r
                case mainERROR_DYNAMIC_TASKS    :       sprintf( pcBuffer, "Error: Dynamic tasks" );\r
                                                                                        break;\r
                                                                                        break;\r
                case mainERROR_DYNAMIC_TASKS    :       sprintf( pcBuffer, "Error: Dynamic tasks" );\r
                                                                                        break;\r
-               case mainERROR_COM_TEST                 :       sprintf( pcBuffer, "Err: loop connected?" ); /* Error in COM test - is the Loopback connector connected? */                                                                                                             \r
+               case mainERROR_COM_TEST                 :       sprintf( pcBuffer, "Err: COM test" ); /* Error in COM test - is the Loopback connector connected? */                                                                                                            \r
                                                                                        break;\r
                case mainERROR_GEN_QUEUE_TEST   :       sprintf( pcBuffer, "Error: Gen Q test" );\r
                                                                                        break;\r
                                                                                        break;\r
                case mainERROR_GEN_QUEUE_TEST   :       sprintf( pcBuffer, "Error: Gen Q test" );\r
                                                                                        break;\r
@@ -247,7 +267,7 @@ xQueueMessage xMessage;
                {\r
                        /* The state has changed, send a message to the LCD task. */\r
                        xMessage.cMessageID = mainMESSAGE_BUTTON_UP;\r
                {\r
                        /* The state has changed, send a message to the LCD task. */\r
                        xMessage.cMessageID = mainMESSAGE_BUTTON_UP;\r
-                       xMessage.cMessageValue = ucState;\r
+                       xMessage.ulMessageValue = ( unsigned long ) ucState;\r
                        ucLastState = ucState;\r
                        xQueueSend( xLCDQueue, &xMessage, portMAX_DELAY );\r
                }\r
                        ucLastState = ucState;\r
                        xQueueSend( xLCDQueue, &xMessage, portMAX_DELAY );\r
                }\r
@@ -261,11 +281,13 @@ xQueueMessage xMessage;
 \r
 static void prvSetupHardware( void )\r
 {\r
 \r
 static void prvSetupHardware( void )\r
 {\r
+unsigned long ulCPU_Clock_KHz = ( configCPU_CLOCK_HZ / 1000UL );\r
+\r
        halBoardInit();\r
        halButtonsInit( BUTTON_ALL );\r
        halButtonsInterruptEnable( BUTTON_SELECT );\r
        halBoardInit();\r
        halButtonsInit( BUTTON_ALL );\r
        halButtonsInterruptEnable( BUTTON_SELECT );\r
-       LFXT_Start (XT1DRIVE_0);\r
-       Init_FLL_Settle( 18000, 488 );\r
+       LFXT_Start( XT1DRIVE_0 );\r
+       Init_FLL_Settle( ( unsigned short ) ulCPU_Clock_KHz, 488 );\r
 }\r
 /*-----------------------------------------------------------*/\r
 \r
 }\r
 /*-----------------------------------------------------------*/\r
 \r
@@ -276,7 +298,7 @@ const unsigned short usACLK_Frequency_Hz = 32768;
        /* Ensure the timer is stopped. */\r
        TA0CTL = 0;\r
 \r
        /* Ensure the timer is stopped. */\r
        TA0CTL = 0;\r
 \r
-       /* Run the timer of the ACLK. */\r
+       /* Run the timer from the ACLK. */\r
        TA0CTL = TASSEL_1;\r
 \r
        /* Clear everything to start with. */\r
        TA0CTL = TASSEL_1;\r
 \r
        /* Clear everything to start with. */\r
@@ -344,26 +366,30 @@ static xQueueMessage xStatusMessage = { mainMESSAGE_STATUS, pdPASS };
                                xStatusMessage.lMessageValue = mainERROR_DYNAMIC_TASKS;\r
                        }\r
                        \r
                                xStatusMessage.lMessageValue = mainERROR_DYNAMIC_TASKS;\r
                        }\r
                        \r
-                       if( xAreComTestTasksStillRunning() != pdPASS )\r
-                       {\r
-                               xStatusMessage.lMessageValue = mainERROR_COM_TEST;\r
-                       }\r
-                       \r
                        if( xAreGenericQueueTasksStillRunning() != pdPASS )\r
                        {\r
                                xStatusMessage.lMessageValue = mainERROR_GEN_QUEUE_TEST;\r
                        }\r
                #else\r
                        if( xAreGenericQueueTasksStillRunning() != pdPASS )\r
                        {\r
                                xStatusMessage.lMessageValue = mainERROR_GEN_QUEUE_TEST;\r
                        }\r
                #else\r
+                       /* See if the standard demo tasks are executing as expected, changing\r
+                       the message that is sent to the LCD task from PASS to an error code if\r
+                       any tasks set reports an error. */\r
+                       if( xAreComTestTasksStillRunning() != pdPASS )\r
+                       {\r
+                               xStatusMessage.ulMessageValue = mainERROR_COM_TEST;\r
+                       }\r
+\r
+\r
                        /* Check the reg test tasks are still cycling.  They will stop incrementing\r
                        their loop counters if they encounter an error. */\r
                        if( usRegTest1Counter == usLastRegTest1Counter )\r
                        {\r
                        /* Check the reg test tasks are still cycling.  They will stop incrementing\r
                        their loop counters if they encounter an error. */\r
                        if( usRegTest1Counter == usLastRegTest1Counter )\r
                        {\r
-                               xStatusMessage.cMessageValue = mainERROR_REG_TEST;\r
+                               xStatusMessage.ulMessageValue = mainERROR_REG_TEST;\r
                        }\r
        \r
                        if( usRegTest2Counter == usLastRegTest2Counter )\r
                        {\r
                        }\r
        \r
                        if( usRegTest2Counter == usLastRegTest2Counter )\r
                        {\r
-                               xStatusMessage.cMessageValue = mainERROR_REG_TEST;\r
+                               xStatusMessage.ulMessageValue = mainERROR_REG_TEST;\r
                        }\r
        \r
                        usLastRegTest1Counter = usRegTest1Counter;\r
                        }\r
        \r
                        usLastRegTest1Counter = usRegTest1Counter;\r
@@ -391,5 +417,70 @@ static xQueueMessage xStatusMessage = { mainMESSAGE_STATUS, pdPASS };
                }\r
        }\r
 }\r
                }\r
        }\r
 }\r
+/*-----------------------------------------------------------*/\r
+\r
+#pragma vector=PORT2_VECTOR\r
+__interrupt static void prvSelectButtonInterrupt(void)\r
+{\r
+/* Define the message sent to the LCD task from this interrupt. */\r
+static const xQueueMessage xMessage = { mainMESSAGE_BUTTON_SEL, ( unsigned long ) "Select Interrupt!" };\r
+portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;\r
+\r
+       /* This is the interrupt handler for the joystick select button input.\r
+       The button has been pushed, write a message to the LCD via the LCD task. */\r
+       xQueueSendFromISR( xLCDQueue, &xMessage, &xHigherPriorityTaskWoken );\r
+\r
+       P2IFG = 0;\r
+       \r
+       /* If writing to xLCDQueue caused a task to unblock, and the unblocked task\r
+       has a priority equal to or above the task that this interrupt interrupted,\r
+       then lHigherPriorityTaskWoken will have been set to pdTRUE internally within\r
+       xQueuesendFromISR(), and portEND_SWITCHING_ISR() will ensure that this\r
+       interrupt returns directly to the higher priority unblocked task. */\r
+       portYIELD_FROM_ISR( xHigherPriorityTaskWoken );\r
+}\r
+/*-----------------------------------------------------------*/\r
+\r
+void vConfigureTimerForRunTimeStats( void )\r
+{\r
+       /* Ensure the timer is stopped. */\r
+       TA1CTL = 0;\r
+\r
+       /* Run the timer from the ACLK/4. */\r
+       TA1CTL = TASSEL_1 | ID__4;\r
+\r
+       /* Clear everything to start with. */\r
+       TA1CTL |= TACLR;\r
+\r
+       /* Enable the interrupts. */\r
+       TA1CCTL0 = CCIE;\r
+\r
+       /* Start up clean. */\r
+       TA1CTL |= TACLR;\r
+\r
+       /* Continuous mode. */\r
+       TA1CTL |= MC__CONTINOUS;\r
+}\r
+/*-----------------------------------------------------------*/\r
+\r
+#pragma vector=TIMER1_A0_VECTOR\r
+static __interrupt void prvRunTimeStatsOverflowISR( void )\r
+{\r
+       ulStatsOverflowCount++;\r
+}\r
+/*-----------------------------------------------------------*/\r
+\r
+inline unsigned long ulGetRunTimeStatsTime( void )\r
+{\r
+unsigned long ulReturn;\r
+\r
+       TA1CTL &= ~MC__CONTINOUS;\r
+       ulReturn = ( ( ulStatsOverflowCount << 16UL ) | ( unsigned long ) TA1R );\r
+       TA1CTL |= MC__CONTINOUS;\r
+       \r
+       return ulReturn;\r
+}\r
+\r
+\r
 \r
 \r
 \r
 \r
diff --git a/Demo/MSP430X_MSP430F5438_IAR/serial.c b/Demo/MSP430X_MSP430F5438_IAR/serial.c
new file mode 100644 (file)
index 0000000..80a63bd
--- /dev/null
@@ -0,0 +1,240 @@
+/*\r
+    FreeRTOS V6.1.0 - Copyright (C) 2010 Real Time Engineers Ltd.\r
+\r
+    ***************************************************************************\r
+    *                                                                         *\r
+    * If you are:                                                             *\r
+    *                                                                         *\r
+    *    + New to FreeRTOS,                                                   *\r
+    *    + Wanting to learn FreeRTOS or multitasking in general quickly       *\r
+    *    + Looking for basic training,                                        *\r
+    *    + Wanting to improve your FreeRTOS skills and productivity           *\r
+    *                                                                         *\r
+    * then take a look at the FreeRTOS books - available as PDF or paperback  *\r
+    *                                                                         *\r
+    *        "Using the FreeRTOS Real Time Kernel - a Practical Guide"        *\r
+    *                  http://www.FreeRTOS.org/Documentation                  *\r
+    *                                                                         *\r
+    * A pdf reference manual is also available.  Both are usually delivered   *\r
+    * to your inbox within 20 minutes to two hours when purchased between 8am *\r
+    * and 8pm GMT (although please allow up to 24 hours in case of            *\r
+    * exceptional circumstances).  Thank you for your support!                *\r
+    *                                                                         *\r
+    ***************************************************************************\r
+\r
+    This file is part of the FreeRTOS distribution.\r
+\r
+    FreeRTOS is free software; you can redistribute it and/or modify it under\r
+    the terms of the GNU General Public License (version 2) as published by the\r
+    Free Software Foundation AND MODIFIED BY the FreeRTOS exception.\r
+    ***NOTE*** The exception to the GPL is included to allow you to distribute\r
+    a combined work that includes FreeRTOS without being obliged to provide the\r
+    source code for proprietary components outside of the FreeRTOS kernel.\r
+    FreeRTOS is distributed in the hope that it will be useful, but WITHOUT\r
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\r
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for\r
+    more details. You should have received a copy of the GNU General Public\r
+    License and the FreeRTOS license exception along with FreeRTOS; if not it\r
+    can be viewed here: http://www.freertos.org/a00114.html and also obtained\r
+    by writing to Richard Barry, contact details for whom are available on the\r
+    FreeRTOS WEB site.\r
+\r
+    1 tab == 4 spaces!\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
+\r
+/* BASIC INTERRUPT DRIVEN SERIAL PORT DRIVER.\r
+ *\r
+ * This file only supports UART A0 in loopback mode, and has not been tested\r
+ * for real UART operation (only loopback mode) so is not guaranteed to have\r
+ * a correct baud rate configuration.\r
+ */\r
+\r
+/* Standard includes. */\r
+#include <stdlib.h>\r
+\r
+/* Scheduler includes. */\r
+#include "FreeRTOS.h"\r
+#include "queue.h"\r
+#include "task.h"\r
+\r
+/* Demo application includes. */\r
+#include "serial.h"\r
+\r
+/* HAL includes. */\r
+#include "hal_usb.h"\r
+\r
+/* Constants required to setup the hardware. */\r
+#define serTX_AND_RX                   ( ( unsigned portCHAR ) 0x03 )\r
+\r
+/* Misc. constants. */\r
+#define serNO_BLOCK                            ( ( portTickType ) 0 )\r
+\r
+/* The queue used to hold received characters. */\r
+static xQueueHandle xRxedChars;\r
+\r
+/* The queue used to hold characters waiting transmission. */\r
+static xQueueHandle xCharsForTx;\r
+\r
+/*-----------------------------------------------------------*/\r
+\r
+xComPortHandle xSerialPortInitMinimal( unsigned portLONG ulWantedBaud, unsigned portBASE_TYPE uxQueueLength )\r
+{\r
+unsigned portLONG ulBaudRateCount;\r
+\r
+       /* Initialise the hardware. */\r
+\r
+       /* Generate the baud rate constants for the wanted baud rate. */\r
+       ulBaudRateCount = configCPU_CLOCK_HZ / ulWantedBaud;\r
+\r
+       portENTER_CRITICAL();\r
+       {\r
+               /* Create the queues used by the com test task. */\r
+               xRxedChars = xQueueCreate( uxQueueLength, ( unsigned portBASE_TYPE ) sizeof( signed portCHAR ) );\r
+               xCharsForTx = xQueueCreate( uxQueueLength, ( unsigned portBASE_TYPE ) sizeof( signed portCHAR ) );\r
+\r
+#if 0\r
+               /* Reset UART. */\r
+               UCA0CTL1 |= UCSWRST;\r
+\r
+               /* Use SMCLK. */\r
+               UCA0CTL1 = UCSSEL0 | UCSSEL1;\r
+               \r
+               /* Setup baud rate low byte. */\r
+               UCA0BR0 = ( unsigned portCHAR ) ( ulBaudRateCount & ( unsigned portLONG ) 0xff );\r
+\r
+               /* Setup baud rate high byte. */\r
+               ulBaudRateCount >>= 8UL;\r
+               UCA0BR1 = ( unsigned portCHAR ) ( ulBaudRateCount & ( unsigned portLONG ) 0xff );\r
+\r
+               /* UCLISTEN sets loopback mode! */\r
+               UCA0STAT = UCLISTEN;\r
+\r
+               /* Clear interrupts. */\r
+//             UCA0IFG = 0;\r
+               \r
+               /* Enable interrupts. */\r
+               UCA0IE |= UCRXIE;\r
+               \r
+               /* Take out of reset. */\r
+               UCA0CTL1 &= ~UCSWRST;\r
+#else\r
+       USB_PORT_SEL |= USB_PIN_RXD + USB_PIN_TXD;\r
+       USB_PORT_DIR |= USB_PIN_TXD;\r
+       USB_PORT_DIR &= ~USB_PIN_RXD;\r
+       \r
+       UCA1CTL1 |= UCSWRST;                          //Reset State\r
+       UCA1CTL0 = UCMODE_0;\r
+       \r
+       UCA1CTL0 &= ~UC7BIT;                      // 8bit char\r
+       UCA1CTL1 |= UCSSEL_2;\r
+//     UCA1BR0 = 16;                             // 8Mhz/57600=138\r
+//     UCA1BR1 = 1;\r
+               /* Setup baud rate low byte. */\r
+               UCA0BR0 = ( unsigned portCHAR ) ( ulBaudRateCount & ( unsigned portLONG ) 0xff );\r
+\r
+               /* Setup baud rate high byte. */\r
+               ulBaudRateCount >>= 8UL;\r
+               UCA0BR1 = ( unsigned portCHAR ) ( ulBaudRateCount & ( unsigned portLONG ) 0xff );\r
+\r
+       UCA1MCTL = 0xE;\r
+       UCA1CTL1 &= ~UCSWRST;\r
+       UCA1IE |= UCRXIE;\r
+#endif\r
+       }\r
+       portEXIT_CRITICAL();\r
+       \r
+       /* Unlike other ports, this serial code does not allow for more than one\r
+       com port.  We therefore don't return a pointer to a port structure and can\r
+       instead just return NULL. */\r
+       return NULL;\r
+}\r
+/*-----------------------------------------------------------*/\r
+\r
+signed portBASE_TYPE xSerialGetChar( xComPortHandle pxPort, signed portCHAR *pcRxedChar, portTickType xBlockTime )\r
+{\r
+       /* Get the next character from the buffer.  Return false if no characters\r
+       are available, or arrive before xBlockTime expires. */\r
+       if( xQueueReceive( xRxedChars, pcRxedChar, xBlockTime ) )\r
+       {\r
+               return pdTRUE;\r
+       }\r
+       else\r
+       {\r
+               return pdFALSE;\r
+       }\r
+}\r
+/*-----------------------------------------------------------*/\r
+\r
+signed portBASE_TYPE xSerialPutChar( xComPortHandle pxPort, signed portCHAR cOutChar, portTickType xBlockTime )\r
+{\r
+signed portBASE_TYPE xReturn;\r
+\r
+       xReturn = xQueueSend( xCharsForTx, &cOutChar, xBlockTime );\r
+       UCA0IE |= UCTXIE;\r
+\r
+       return xReturn;\r
+}\r
+/*-----------------------------------------------------------*/\r
+char cTxedBytes[ 512 ];\r
+char cRxedBytes[ 512 ];\r
+volatile int xIndex = 0;\r
+volatile int xIndex2 = 0;\r
+\r
+#pragma vector=USCI_A0_VECTOR\r
+static __interrupt void prvUSCI_A0_ISR( void )\r
+{\r
+signed portCHAR cChar;\r
+portBASE_TYPE xTaskWoken = pdFALSE;\r
+portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;\r
+\r
+       while( UCA0IFG & UCRXIFG )\r
+       {\r
+               /* Get the character from the UART and post it on the queue of Rxed\r
+               characters. */\r
+               cChar = UCA0RXBUF;\r
+\r
+if( xIndex2 < 500 )\r
+{\r
+       cRxedBytes[ xIndex2++ ] = cChar;\r
+}\r
+\r
+               xQueueSendFromISR( xRxedChars, &cChar, &xHigherPriorityTaskWoken );\r
+       }\r
+       \r
+       if( UCA0IFG & UCTXIFG )\r
+       {\r
+               /* The previous character has been transmitted.  See if there are any\r
+               further characters waiting transmission. */\r
+               if( xQueueReceiveFromISR( xCharsForTx, &cChar, &xTaskWoken ) == pdTRUE )\r
+               {\r
+if( xIndex < 500 )\r
+{\r
+       cTxedBytes[ xIndex++ ] = cChar;\r
+}\r
+\r
+                       /* There was another character queued - transmit it now. */\r
+                       UCA0TXBUF = cChar;\r
+               }\r
+               else\r
+               {\r
+                       /* There were no other characters to transmit - disable the Tx\r
+                       interrupt. */\r
+                       UCA0IE &= ~UCTXIE;\r
+               }\r
+       }\r
+\r
+       __bic_SR_register_on_exit( SCG1 + SCG0 + OSCOFF + CPUOFF );     \r
+       portYIELD_FROM_ISR( xHigherPriorityTaskWoken );\r
+}\r
+\r
+\r