]> git.sur5r.net Git - freertos/commitdiff
Prepare the MSP430X IAR demo for release.
authorrichardbarry <richardbarry@1d2547de-c912-0410-9cb9-b8ca96c0e9e2>
Sat, 1 Jan 2011 11:27:48 +0000 (11:27 +0000)
committerrichardbarry <richardbarry@1d2547de-c912-0410-9cb9-b8ca96c0e9e2>
Sat, 1 Jan 2011 11:27:48 +0000 (11:27 +0000)
git-svn-id: https://svn.code.sf.net/p/freertos/code/trunk@1202 1d2547de-c912-0410-9cb9-b8ca96c0e9e2

12 files changed:
Demo/MSP430X_MSP430F5438_IAR/FreeRTOSConfig.h
Demo/MSP430X_MSP430F5438_IAR/MSP-EXP430F5438_HAL/hal_lcd.c
Demo/MSP430X_MSP430F5438_IAR/ParTest.c
Demo/MSP430X_MSP430F5438_IAR/RTOSDemo.ewp
Demo/MSP430X_MSP430F5438_IAR/RegTest.s43
Demo/MSP430X_MSP430F5438_IAR/RunTimeStatsConfig.c [new file with mode: 0644]
Demo/MSP430X_MSP430F5438_IAR/lnk430F5438A_mod.xcl
Demo/MSP430X_MSP430F5438_IAR/main.c
Demo/MSP430X_MSP430F5438_IAR/serial.c
Demo/MSP430X_MSP430F5438_IAR/settings/RTOSDemo.dbgdt
Demo/MSP430X_MSP430F5438_IAR/settings/RTOSDemo.dni
Demo/MSP430X_MSP430F5438_IAR/settings/RTOSDemo.wsdt

index c7bb39210c81bf4e29e0a617fdd929f30ba502ce..45a9615b1076e4e0a435e6fae8e2ed1634be7df5 100644 (file)
@@ -74,7 +74,7 @@
 #define configMAX_PRIORITIES                   ( ( unsigned portBASE_TYPE ) 5 )\r
 #define configMINIMAL_STACK_SIZE               ( ( unsigned short ) 70 )\r
 #define configTOTAL_HEAP_SIZE                  ( ( size_t ) ( 10 * 1024 ) )\r
-#define configMAX_TASK_NAME_LEN                        ( 16 )\r
+#define configMAX_TASK_NAME_LEN                        ( 10 )\r
 #define configUSE_TRACE_FACILITY               0\r
 #define configUSE_16_BIT_TICKS                 0\r
 #define configIDLE_SHOULD_YIELD                        1\r
 \r
 /* Set the following definitions to 1 to include the API function, or zero\r
 to exclude the API function. */\r
-\r
 #define INCLUDE_vTaskPrioritySet               1\r
 #define INCLUDE_uxTaskPriorityGet              1\r
-#define INCLUDE_vTaskDelete                            1\r
+#define INCLUDE_vTaskDelete                            0\r
 #define INCLUDE_vTaskCleanUpResources  0\r
 #define INCLUDE_vTaskSuspend                   1\r
 #define INCLUDE_vTaskDelayUntil                        1\r
 #define INCLUDE_vTaskDelay                             1\r
 \r
+/* The MSP430X port uses a callback function to configure its tick interrupt.\r
+This allows the application to choose the tick interrupt source.\r
+configTICK_INTERRUPT_VECTOR must also be set in FreeRTOSConfig.h to the correct\r
+interrupt vector for the chosen tick interrupt source.  This implementation of\r
+vApplicationSetupTimerInterrupt() generates the tick from timer A0, so in this\r
+case configTICK_INTERRUPT_VECTOR is set to TIMER0_A0_VECTOR. */\r
 #define configTICK_INTERRUPT_VECTOR            TIMER0_A0_VECTOR\r
 \r
 /* Prevent the following definitions being included when FreeRTOSConfig.h\r
index 12c611ed7f55be4a5118140509f72be63edf0b9b..f589c23dd2b94c3daf07497f8f1a8cbfac53bc4d 100644 (file)
@@ -1,6 +1,6 @@
-/** \r
+/**\r
  * @file  hal_lcd.c\r
- * \r
+ *\r
  * Copyright 2010 Texas Instruments, Inc.\r
 ***************************************************************************/\r
 \r
@@ -19,88 +19,88 @@ unsigned char LcdInitMacro[]={
             0x74,0x00,0x07,0x76,0x00,0x15,  // R07 Display control\r
             0x74,0x00,0x08,0x76,0x00,0x03,  // R08 Cursor Control\r
             0x74,0x00,0x09,0x76,0x00,0x00,  // R09 RAM data write mask\r
-            0x74,0x00,0x0A,0x76,0x00,0x15,  // R0A \r
+            0x74,0x00,0x0A,0x76,0x00,0x15,  // R0A\r
             0x74,0x00,0x0B,0x76,0x00,0x03,  // R0B Horizontal Cursor Position\r
             0x74,0x00,0x0C,0x76,0x00,0x03,  // R0C Vertical Cursor Position\r
-            0x74,0x00,0x0D,0x76,0x00,0x00,  // R0D \r
-            0x74,0x00,0x0E,0x76,0x00,0x15,  // R0E \r
-            0x74,0x00,0x0F,0x76,0x00,0x03,  // R0F \r
-            0x74,0x00,0x10,0x76,0x00,0x15,  // R0E \r
-            0x74,0x00,0x11,0x76,0x00,0x03,  // R0F \r
+            0x74,0x00,0x0D,0x76,0x00,0x00,  // R0D\r
+            0x74,0x00,0x0E,0x76,0x00,0x15,  // R0E\r
+            0x74,0x00,0x0F,0x76,0x00,0x03,  // R0F\r
+            0x74,0x00,0x10,0x76,0x00,0x15,  // R0E\r
+            0x74,0x00,0x11,0x76,0x00,0x03,  // R0F\r
 };\r
 \r
-unsigned char Read_Block_Address_Macro[]= {0x74,0x00,0x12,0x77,0x00,0x00};                                     \r
+unsigned char Read_Block_Address_Macro[]= {0x74,0x00,0x12,0x77,0x00,0x00};\r
 unsigned char Draw_Block_Value_Macro[]={0x74,0x00,0x12,0x76,0xFF,0xFF};\r
 unsigned char Draw_Block_Address_Macro[]={0x74,0x00,0x11,0x76,0x00,0x00};\r
 \r
 unsigned int  LcdAddress = 0, LcdTableAddress = 0;\r
 unsigned char contrast   = 0x66;\r
 unsigned char backlight  = 8;\r
-int LCD_MEM[110*17];           //This array stores a copy of all data on the LCD \r
-                                                       //screen. If memory is an issue though, this array \r
+int LCD_MEM[110*17];           //This array stores a copy of all data on the LCD\r
+                                                       //screen. If memory is an issue though, this array\r
                                                        //can be eliminated and the halLcdReadBlock()\r
-                                                       //command can be used instead whenever you are \r
+                                                       //command can be used instead whenever you are\r
                                                        //manipulating the currently displayed data.\r
 \r
 /**********************************************************************//**\r
  * @brief  Sends 3+3 bytes of data to the LCD using the format specified\r
  *         by the LCD Guide.\r
- * \r
- * @param  Data[] Data array for transmission \r
- * \r
+ *\r
+ * @param  Data[] Data array for transmission\r
+ *\r
  * @return none\r
  *************************************************************************/\r
-void halLcdSendCommand(unsigned char Data[]) \r
+void halLcdSendCommand(unsigned char Data[])\r
 {\r
   unsigned char i;\r
 \r
   LCD_CS_RST_OUT &= ~LCD_CS_PIN;            //CS = 0 --> Start Transfer\r
   for ( i = 0; i < 6; i++ )\r
   {\r
-    while (!(UCB2IFG & UCTXIFG));           // Wait for TXIFG    \r
-    UCB2TXBUF = Data[i];                    // Load data \r
+    while (!(UCB2IFG & UCTXIFG));           // Wait for TXIFG\r
+    UCB2TXBUF = Data[i];                    // Load data\r
 \r
     if (i == 2)                             //Pull CS up after 3 bytes\r
     {\r
       while (UCB2STAT & UCBUSY);       \r
       LCD_CS_RST_OUT |= LCD_CS_PIN;         //CS = 1 --> Stop Transfer\r
-      LCD_CS_RST_OUT &= ~LCD_CS_PIN;        //CS = 0 --> Start Transfer         \r
+      LCD_CS_RST_OUT &= ~LCD_CS_PIN;        //CS = 0 --> Start Transfer        \r
     }\r
   }\r
   while (UCB2STAT & UCBUSY);           \r
-  LCD_CS_RST_OUT |= LCD_CS_PIN;             //CS = 1 --> Stop Transfer \r
+  LCD_CS_RST_OUT |= LCD_CS_PIN;             //CS = 1 --> Stop Transfer\r
 }\r
 \r
 /**********************************************************************//**\r
- * @brief  Initializes the USCI module, LCD device for communication. \r
- *           \r
+ * @brief  Initializes the USCI module, LCD device for communication.\r
+ *\r
  * - Sets up the SPI2C Communication Module\r
  * - Performs Hitachi LCD Initialization Procedure\r
- * \r
+ *\r
  * @param  none\r
- * \r
+ *\r
  * @return none\r
  *************************************************************************/\r
-void halLcdInit(void) \r
+void halLcdInit(void)\r
 {\r
   volatile unsigned int i=0;\r
 \r
   LCD_CS_RST_OUT |= LCD_CS_PIN | LCD_RESET_PIN ;\r
-  LCD_CS_RST_DIR |= LCD_CS_PIN | LCD_RESET_PIN ;     \r
+  LCD_CS_RST_DIR |= LCD_CS_PIN | LCD_RESET_PIN ;\r
 \r
   LCD_BACKLT_SEL |= LCD_BACKLIGHT_PIN;\r
 \r
   LCD_CS_RST_OUT &= ~LCD_RESET_PIN;         // Reset LCD\r
   __delay_cycles(0x47FF);                   //Reset Pulse\r
-  LCD_CS_RST_OUT |= LCD_RESET_PIN;    \r
+  LCD_CS_RST_OUT |= LCD_RESET_PIN;\r
 \r
   // UCLK,MOSI setup, SOMI cleared\r
   LCD_SPI_SEL |= LCD_MOSI_PIN + LCD_CLK_PIN;\r
   LCD_SPI_SEL &= ~LCD_MISO_PIN;\r
   LCD_SPI_DIR &= ~(LCD_MISO_PIN + LCD_MOSI_PIN);            // Pin direction controlled by module,\r
                                                             // Set both pins to input as default\r
\r
-  // Initialize the USCI_B2 module for SPI operation \r
+\r
+  // Initialize the USCI_B2 module for SPI operation\r
   UCB2CTL1 = UCSWRST;                       // Hold USCI in SW reset mode while configuring it\r
   UCB2CTL0 = UCMST+UCSYNC+UCCKPL+UCMSB;     // 3-pin, 8-bit SPI master\r
   UCB2CTL1 |= UCSSEL_2;                     // SMCLK\r
@@ -111,7 +111,7 @@ void halLcdInit(void)
 \r
   // Wake-up the LCD as per datasheet specifications\r
   halLcdActive();\r
-  \r
+\r
   // LCD Initialization Routine Using Predefined Macros\r
   halLcdSendCommand(&LcdInitMacro[ 1 * 6 ]);\r
   halLcdSendCommand(&LcdInitMacro[ 2 * 6 ]);\r
@@ -123,122 +123,122 @@ void halLcdInit(void)
 }\r
 \r
 /**********************************************************************//**\r
- * @brief  Shuts down the LCD display and hdisables the USCI communication. \r
- * \r
+ * @brief  Shuts down the LCD display and hdisables the USCI communication.\r
+ *\r
  * @param  none\r
- * \r
+ *\r
  * @return none\r
  *************************************************************************/\r
 void halLcdShutDown(void)\r
 {\r
-  halLcdStandby();  \r
+  halLcdStandby();\r
 \r
   LCD_CS_RST_DIR |= LCD_CS_PIN | LCD_RESET_PIN ;\r
-  LCD_CS_RST_OUT &= ~(LCD_CS_PIN | LCD_RESET_PIN );  \r
-  LCD_CS_RST_OUT &= ~LCD_RESET_PIN;                                         \r
-  \r
+  LCD_CS_RST_OUT &= ~(LCD_CS_PIN | LCD_RESET_PIN );\r
+  LCD_CS_RST_OUT &= ~LCD_RESET_PIN;\r
+\r
   LCD_SPI_SEL &= ~(LCD_MOSI_PIN + LCD_CLK_PIN + LCD_MISO_PIN);\r
   LCD_CS_RST_DIR |= LCD_MOSI_PIN + LCD_CLK_PIN + LCD_MISO_PIN;\r
-  LCD_CS_RST_OUT &= ~(LCD_MOSI_PIN + LCD_CLK_PIN + LCD_MISO_PIN);  \r
-  \r
-  UCB2CTL0 = UCSWRST; \r
-}  \r
+  LCD_CS_RST_OUT &= ~(LCD_MOSI_PIN + LCD_CLK_PIN + LCD_MISO_PIN);\r
+\r
+  UCB2CTL0 = UCSWRST;\r
+}\r
 \r
 /**********************************************************************//**\r
- * @brief  Initializes the LCD backlight PWM signal. \r
- * \r
+ * @brief  Initializes the LCD backlight PWM signal.\r
+ *\r
  * @param  none\r
- * \r
+ *\r
  * @return none\r
- * \r
+ *\r
  *************************************************************************/\r
 void halLcdBackLightInit(void)\r
 {\r
   LCD_BACKLT_DIR |= LCD_BACKLIGHT_PIN;\r
-  LCD_BACKLT_OUT |= LCD_BACKLIGHT_PIN;     \r
+  LCD_BACKLT_OUT |= LCD_BACKLIGHT_PIN;\r
   LCD_BACKLT_SEL |= LCD_BACKLIGHT_PIN;\r
 \r
   TA0CCTL3 = OUTMOD_7;\r
   TA0CCR3 = TA0CCR0 >> 1 ;\r
   backlight = 8;\r
-  \r
+\r
   TA0CCR0 = 400;\r
-  TA0CTL = TASSEL_2+MC_1;   \r
+  TA0CTL = TASSEL_2+MC_1;\r
 }\r
 \r
 /**********************************************************************//**\r
- * @brief  Get function for the backlight PWM's duty cycle. \r
- * \r
- * @param  none \r
- * \r
- * @return backlight One of the the 17 possible settings - valued 0 to 16. \r
+ * @brief  Get function for the backlight PWM's duty cycle.\r
+ *\r
+ * @param  none\r
+ *\r
+ * @return backlight One of the the 17 possible settings - valued 0 to 16.\r
  *\r
  *************************************************************************/\r
 unsigned int halLcdGetBackLight(void)\r
-{  \r
+{\r
   return backlight;\r
 }\r
 \r
 /**********************************************************************//**\r
- * @brief  Set function for the backlight PWM's duty cycle \r
- * \r
+ * @brief  Set function for the backlight PWM's duty cycle\r
+ *\r
  * @param  BackLightLevel The target backlight duty cycle - valued 0 to 16.\r
- * \r
+ *\r
  * @return none\r
  *************************************************************************/\r
 void halLcdSetBackLight(unsigned char BackLightLevel)\r
-{ \r
-  unsigned int dutyCycle = 0, i, dummy; \r
-  \r
+{\r
+  unsigned int dutyCycle = 0, i, dummy;\r
+\r
   if (BackLightLevel > 0)\r
   {\r
     TA0CCTL3 = OUTMOD_7;\r
     dummy = (TA0CCR0 >> 4);\r
-    \r
-    for (i = 0; i < BackLightLevel; i++) \r
+\r
+    for (i = 0; i < BackLightLevel; i++)\r
       dutyCycle += dummy;\r
-      \r
+\r
     TA0CCR3 = dutyCycle;\r
-    \r
-    // If the backlight was previously turned off, turn it on. \r
-    if (!backlight)                         \r
-      TA0CTL |= MC0;  \r
+\r
+    // If the backlight was previously turned off, turn it on.\r
+    if (!backlight)\r
+      TA0CTL |= MC0;\r
   }\r
   else\r
   {    \r
     TA0CCTL3 = 0;\r
     TA0CTL &= ~MC0;\r
-  }  \r
+  }\r
   backlight = BackLightLevel;\r
 }\r
 \r
 /**********************************************************************//**\r
- * @brief  Turns off the backlight. \r
- * \r
+ * @brief  Turns off the backlight.\r
+ *\r
  * Clears the respective GPIO and timer settings.\r
- * \r
+ *\r
  * @param  none\r
- * \r
+ *\r
  * @return none\r
  *************************************************************************/\r
 void halLcdShutDownBackLight(void)\r
 {\r
   LCD_BACKLT_DIR |= LCD_BACKLIGHT_PIN;\r
-  LCD_BACKLT_OUT &= ~(LCD_BACKLIGHT_PIN);  \r
+  LCD_BACKLT_OUT &= ~(LCD_BACKLIGHT_PIN);\r
   LCD_BACKLT_SEL &= ~LCD_BACKLIGHT_PIN;\r
-  \r
+\r
   TA0CCTL3 = 0;\r
-  TA0CTL = 0;  \r
-  \r
-  backlight = 0;  \r
+  TA0CTL = 0;\r
+\r
+  backlight = 0;\r
 }\r
 \r
 /**********************************************************************//**\r
- * @brief  Set function for the contrast level of the LCD. \r
- * \r
- * @param  ContrastLevel The target contrast level \r
- * \r
- * @return none \r
+ * @brief  Set function for the contrast level of the LCD.\r
+ *\r
+ * @param  ContrastLevel The target contrast level\r
+ *\r
+ * @return none\r
  *************************************************************************/\r
 void halLcdSetContrast(unsigned char ContrastLevel)\r
 {\r
@@ -246,13 +246,13 @@ void halLcdSetContrast(unsigned char ContrastLevel)
   if (ContrastLevel < 70) ContrastLevel = 70;\r
   LcdInitMacro[ 0x04 * 6 + 5 ] = ContrastLevel;\r
   halLcdSendCommand(&LcdInitMacro[ 0x04 * 6 ]);\r
-} \r
+}\r
 \r
 /**********************************************************************//**\r
- * @brief  Get function for the contrast level of the LCD. \r
- * \r
+ * @brief  Get function for the contrast level of the LCD.\r
+ *\r
  * @param  none\r
- * \r
+ *\r
  * @return ContrastLevel The LCD constrast level\r
  *************************************************************************/\r
 unsigned char halLcdGetContrast(void)\r
@@ -262,31 +262,31 @@ unsigned char halLcdGetContrast(void)
 \r
 /**********************************************************************//**\r
  * @brief  Turns the LCD cursor on at the current text position.\r
- * \r
+ *\r
  * @param  none\r
- * \r
+ *\r
  * @return none\r
  *************************************************************************/\r
 void halLcdCursor(void)\r
 {\r
   LcdInitMacro[  8 * 6 + 5 ] ^= BIT2;\r
   halLcdSendCommand(&LcdInitMacro[ 8 * 6 ]);\r
-  \r
+\r
   LcdInitMacro[ 0x0B * 6 + 5 ] = ((LcdAddress & 0x1F) << 3) ;\r
   LcdInitMacro[ 0x0B * 6 + 4 ] = ( (LcdAddress & 0x1F) << 3 ) + 3;\r
   LcdInitMacro[ 0x0C * 6 + 5 ] = (LcdAddress >> 5);\r
   LcdInitMacro[ 0x0C * 6 + 4 ] = (LcdAddress >> 5) + 7;\r
   halLcdSendCommand(&LcdInitMacro[ 0x0B * 6 ]);\r
   halLcdSendCommand(&LcdInitMacro[ 0x0C * 6 ]);\r
-  \r
+\r
   halLcdSetAddress(LcdAddress);\r
 }\r
 \r
 /**********************************************************************//**\r
  * @brief  Turns off the LCD cursor.\r
- * \r
+ *\r
  * @param  none\r
- * \r
+ *\r
  * @return none\r
  *************************************************************************/\r
 void halLcdCursorOff(void)\r
@@ -296,10 +296,10 @@ void halLcdCursorOff(void)
 }\r
 \r
 /**********************************************************************//**\r
- * @brief  Inverts the grayscale values of the LCD display (Black <> white).  \r
- * \r
+ * @brief  Inverts the grayscale values of the LCD display (Black <> white).\r
+ *\r
  * @param  none\r
- * \r
+ *\r
  * @return none\r
  *************************************************************************/\r
 void halLcdReverse(void)\r
@@ -310,9 +310,9 @@ void halLcdReverse(void)
 \r
 /**********************************************************************//**\r
  * @brief  Sets the LCD in standby mode to reduce power consumption.\r
- * \r
+ *\r
  * @param  none\r
- * \r
+ *\r
  * @return none\r
  *************************************************************************/\r
 void halLcdStandby(void)\r
@@ -324,60 +324,60 @@ void halLcdStandby(void)
 \r
 /**********************************************************************//**\r
  * @brief  Puts the LCD into active mode.\r
- * \r
+ *\r
  * @param  none\r
- * \r
+ *\r
  * @return none\r
  *************************************************************************/\r
 void halLcdActive(void)\r
 {\r
   halLcdSendCommand(LcdInitMacro);                  // R00 start oscillation\r
-  \r
+\r
   // Wait a minimum of 25ms after issuing "start oscillation"\r
-  // command (to accomodate for MCLK up to 25MHz)    \r
-  __delay_cycles(250000);  \r
-  \r
+  // command (to accomodate for MCLK up to 25MHz)\r
+  __delay_cycles(250000);\r
+\r
   LcdInitMacro[ 3 * 6 + 5 ] |= BIT3;\r
   LcdInitMacro[ 3 * 6 + 5 ] &= ~BIT0;\r
   halLcdSendCommand(&LcdInitMacro[ 3 * 6 ]);        // R03 Power control\r
 }\r
 \r
 /**********************************************************************//**\r
- * @brief  Sets the pointer location in the LCD. \r
- *         \r
- * - LcdAddress      = Address                                          \r
- * - LcdTableAddress = Correct Address Row + Column \r
- *                   = (Address / 0x20)* 17 + Column  \r
- * \r
+ * @brief  Sets the pointer location in the LCD.\r
+ *\r
+ * - LcdAddress      = Address                                         \r
+ * - LcdTableAddress = Correct Address Row + Column\r
+ *                   = (Address / 0x20)* 17 + Column\r
+ *\r
  * @param  Address The target pointer location in the LCD.\r
- * \r
+ *\r
  * @return none\r
  *************************************************************************/\r
 void halLcdSetAddress(int Address)\r
 {\r
   int temp;\r
-  \r
+\r
   Draw_Block_Address_Macro[4] = Address >> 8;\r
   Draw_Block_Address_Macro[5] = Address & 0xFF;\r
   halLcdSendCommand(Draw_Block_Address_Macro);\r
   LcdAddress = Address;\r
   temp = Address >> 5;                      // Divided by 0x20\r
-  temp = temp + (temp << 4); \r
+  temp = temp + (temp << 4);\r
   //Multiplied by (1+16) and added by the offset\r
-  LcdTableAddress = temp + (Address & 0x1F); \r
+  LcdTableAddress = temp + (Address & 0x1F);\r
 }\r
 \r
 /**********************************************************************//**\r
- * @brief  Draws a block at the specified LCD address. \r
- * \r
+ * @brief  Draws a block at the specified LCD address.\r
+ *\r
  * A block is the smallest addressable memory on the LCD and is\r
  * equivalent to 8 pixels, each of which is represented by 2 bits\r
- * that represent a grayscale value between 00b and 11b.   \r
- * \r
+ * that represent a grayscale value between 00b and 11b.\r
+ *\r
  * @param  Address The address at which to draw the block.\r
- * \r
- * @param  Value   The value of the block \r
- * \r
+ *\r
+ * @param  Value   The value of the block\r
+ *\r
  * @return none\r
  *************************************************************************/\r
 void halLcdDrawBlock(unsigned int Address, unsigned int Value)\r
@@ -387,182 +387,182 @@ void halLcdDrawBlock(unsigned int Address, unsigned int Value)
 }\r
 \r
 /**********************************************************************//**\r
- * @brief  Writes Value to LCD CGram and MSP430 internal LCD table. \r
- * \r
+ * @brief  Writes Value to LCD CGram and MSP430 internal LCD table.\r
+ *\r
  * Also updates the LcdAddress and LcdTableAddress to the correct values.\r
- *  \r
- * @param  Value The value of the block to be written to the LCD. \r
- * \r
+ *\r
+ * @param  Value The value of the block to be written to the LCD.\r
+ *\r
  * @return none\r
  *************************************************************************/\r
 void halLcdDrawCurrentBlock(unsigned int Value)\r
-{   \r
+{\r
   int temp;\r
 \r
   Draw_Block_Value_Macro[4] = Value >> 8;\r
   Draw_Block_Value_Macro[5] = Value & 0xFF;\r
   LCD_MEM[ LcdTableAddress ] = Value;\r
-  \r
+\r
   halLcdSendCommand(Draw_Block_Value_Macro);\r
-  \r
+\r
   LcdAddress++;\r
   temp = LcdAddress >> 5;                   // Divided by 0x20\r
-  temp = temp + (temp << 4); \r
+  temp = temp + (temp << 4);\r
   // Multiplied by (1+16) and added by the offset\r
-  LcdTableAddress = temp + (LcdAddress & 0x1F); \r
-  \r
+  LcdTableAddress = temp + (LcdAddress & 0x1F);\r
+\r
   // If LcdAddress gets off the right edge, move to next line\r
   if ((LcdAddress & 0x1F) > 0x11)\r
     halLcdSetAddress( (LcdAddress & 0xFFE0) + 0x20 );\r
   if (LcdAddress == LCD_Size)\r
-    halLcdSetAddress( 0 );  \r
+    halLcdSetAddress( 0 );\r
 }\r
 \r
 /**********************************************************************//**\r
  * @brief  Returns the LCD CGRAM value at location Address.\r
- * \r
- * @param  Address The address of the block to be read from the LCD. \r
- * \r
+ *\r
+ * @param  Address The address of the block to be read from the LCD.\r
+ *\r
  * @return Value   The value held at the specified address.\r
  *************************************************************************/\r
 int halLcdReadBlock(unsigned int Address)\r
 {\r
-  int i = 0, Value = 0, ReadData[7]; \r
-  \r
-  halLcdSetAddress( Address );    \r
-  halLcdSendCommand(Read_Block_Address_Macro);      \r
-  \r
+  int i = 0, Value = 0, ReadData[7];\r
+\r
+  halLcdSetAddress( Address );\r
+  halLcdSendCommand(Read_Block_Address_Macro);\r
+\r
   LCD_CS_RST_OUT &= ~LCD_CS_PIN;              // start transfer CS=0\r
   UCB2TXBUF = 0x77;                         // Transmit first character 0x77\r
-  \r
-  while (!(UCB2IFG & UCTXIFG)); \r
+\r
+  while (!(UCB2IFG & UCTXIFG));\r
   while (UCB2STAT & UCBUSY);\r
-  \r
-  //Read 5 dummies values and 2 valid address data  \r
+\r
+  //Read 5 dummies values and 2 valid address data\r
   LCD_SPI_SEL &= ~LCD_MOSI_PIN;             //Change SPI2C Dir\r
-  LCD_SPI_SEL |= LCD_MISO_PIN;  \r
-  \r
+  LCD_SPI_SEL |= LCD_MISO_PIN;\r
+\r
   for (i = 0; i < 7; i ++ )\r
   {\r
     UCB2IFG &= ~UCRXIFG;\r
     UCB2TXBUF = 1;                          // load dummy byte 1 for clk\r
-    while (!(UCB2IFG & UCRXIFG)); \r
-    ReadData[i] = UCB2RXBUF; \r
-  } \r
+    while (!(UCB2IFG & UCRXIFG));\r
+    ReadData[i] = UCB2RXBUF;\r
+  }\r
   LCD_CS_RST_OUT |= LCD_CS_PIN;              // Stop Transfer CS = 1\r
-  \r
+\r
   LCD_SPI_SEL |= LCD_MOSI_PIN;               //Change SPI2C Dir\r
   LCD_SPI_SEL &= ~LCD_MISO_PIN;\r
   LCD_CS_RST_DIR |= LCD_MOSI_PIN + LCD_CLK_PIN;\r
   LCD_CS_RST_DIR &= ~LCD_MISO_PIN;\r
-  \r
-  Value = (ReadData[5] << 8) + ReadData[6];  \r
+\r
+  Value = (ReadData[5] << 8) + ReadData[6];\r
   return Value;\r
 }\r
 \r
 /**********************************************************************//**\r
- * @brief  Draw a Pixel of grayscale at coordinate (x,y) to LCD \r
- * \r
- * @param  x         x-coordinate for grayscale value \r
- * \r
+ * @brief  Draw a Pixel of grayscale at coordinate (x,y) to LCD\r
+ *\r
+ * @param  x         x-coordinate for grayscale value\r
+ *\r
  * @param  y         y-coordinate for grayscale value\r
- * \r
- * @param  GrayScale The intended grayscale value of the pixel - one of \r
+ *\r
+ * @param  GrayScale The intended grayscale value of the pixel - one of\r
  *                   four possible settings.\r
- * \r
+ *\r
  * @return none\r
  *************************************************************************/\r
 void halLcdPixel( int x, int y, unsigned char GrayScale)\r
 {\r
   int  Address, Value;\r
   unsigned char offset;\r
-  \r
+\r
   //Each line increments by 0x20\r
   if ( (x>=0 ) && (x<LCD_COL) && (y>=0) && (y<LCD_ROW))\r
   {\r
-    Address = (y << 5) + (x >> 3) ;         //Narrow down to 8 possible pixels    \r
-    \r
+    Address = (y << 5) + (x >> 3) ;         //Narrow down to 8 possible pixels\r
+\r
     Value = LCD_MEM[(y << 4)+ y + (x>>3)];  //y * 17 --> row. x>>3 --> column\r
-    \r
+\r
     offset = (x & 0x07) << 1;      //3 LSBs = pos. within the 8 columns\r
     Value &= ~  (3 << offset);     //clear out the corresponding bits\r
     Value |= GrayScale << offset;  //set pixel to GrayScale level\r
-    \r
+\r
     halLcdDrawBlock( Address, Value );\r
   }\r
 }\r
 \r
 /**********************************************************************//**\r
  * @brief  Clears entire LCD CGRAM as well as LCD_MEM.\r
- * \r
+ *\r
  * @param  none\r
- * \r
+ *\r
  * @return none\r
  *************************************************************************/\r
 void halLcdClearScreen(void)\r
 {\r
   int i, j, k, Current_Location = 0;\r
-  halLcdSetAddress(0);  \r
\r
+  halLcdSetAddress(0);\r
+\r
   for (i=0; i < 110; i++)\r
   {\r
     //prepare to send image\r
     LCD_CS_RST_OUT &= ~LCD_CS_PIN;            //CS = 0 --> Start Transfer\r
     for ( k = 0; k < 3; k++ )\r
     {\r
-      while (!(UCB2IFG & UCTXIFG));           // Wait for TXIFG    \r
+      while (!(UCB2IFG & UCTXIFG));           // Wait for TXIFG\r
       UCB2TXBUF = Draw_Block_Value_Macro[k];     // Load data\r
     }\r
     while (UCB2STAT & UCBUSY);         \r
     LCD_CS_RST_OUT |= LCD_CS_PIN;         //CS = 1 --> Stop Transfer\r
     LCD_CS_RST_OUT &= ~LCD_CS_PIN;        //CS = 0 --> Start Transfer  \r
-    while (!(UCB2IFG & UCTXIFG));           // Wait for TXIFG    \r
+    while (!(UCB2IFG & UCTXIFG));           // Wait for TXIFG\r
     UCB2TXBUF = Draw_Block_Value_Macro[3];     // Load data\r
-  \r
+\r
     //send blank line\r
     for (j=0; j < 17; j++)\r
     {\r
          LCD_MEM[ LcdTableAddress++ ] = 0x00;\r
-      while (!(UCB2IFG & UCTXIFG));       // Wait for TXIFG    \r
+      while (!(UCB2IFG & UCTXIFG));       // Wait for TXIFG\r
       UCB2TXBUF = 0x00;                   // Load data\r
-      while (!(UCB2IFG & UCTXIFG));       // Wait for TXIFG    \r
+      while (!(UCB2IFG & UCTXIFG));       // Wait for TXIFG\r
       UCB2TXBUF = 0x00;                   // Load data\r
-    }  \r
-    //Clear the partially visible block at the edge of the screen  \r
-    while (!(UCB2IFG & UCTXIFG));       // Wait for TXIFG    \r
+    }\r
+    //Clear the partially visible block at the edge of the screen\r
+    while (!(UCB2IFG & UCTXIFG));       // Wait for TXIFG\r
       UCB2TXBUF = 0x00;                   // Load data\r
-    while (!(UCB2IFG & UCTXIFG));       // Wait for TXIFG    \r
+    while (!(UCB2IFG & UCTXIFG));       // Wait for TXIFG\r
       UCB2TXBUF = 0x00;                   // Load data\r
     while (UCB2STAT & UCBUSY);         \r
     LCD_CS_RST_OUT |= LCD_CS_PIN;             //CS = 1 --> Stop Transfer\r
-    \r
+\r
     Current_Location += 0x20;\r
     halLcdSetAddress(Current_Location );\r
   }\r
-  \r
+\r
   halLcdSetAddress(0);\r
 }\r
 \r
 /**********************************************************************//**\r
- * @brief  Loads an image of size = rows * columns, starting at the \r
+ * @brief  Loads an image of size = rows * columns, starting at the\r
  *         coordinate (x,y).\r
- * \r
+ *\r
  * @param  Image[] The image to be loaded\r
- * \r
+ *\r
  * @param  Rows    The number of rows in the image. Size = Rows * Columns.\r
- * \r
+ *\r
  * @param  Columns The number of columns in the image. Size = Rows * Columns.\r
- * \r
- * @param  x       x-coordinate of the image's starting location \r
- * \r
- * @param  y       y-coordinate of the image's starting location \r
- * \r
+ *\r
+ * @param  x       x-coordinate of the image's starting location\r
+ *\r
+ * @param  y       y-coordinate of the image's starting location\r
+ *\r
  * @return none\r
  *************************************************************************/\r
 void halLcdImage(const unsigned int Image[], int Columns, int Rows, int x, int y)\r
-{  \r
+{\r
   int i, CurrentLocation;\r
-   \r
+\r
   CurrentLocation = (y << 5) + (x >> 3);\r
   halLcdSetAddress(CurrentLocation);\r
   for (i=0; i < Rows; i++)\r
@@ -575,31 +575,31 @@ void halLcdImage(const unsigned int Image[], int Columns, int Rows, int x, int y
 }\r
 \r
 /**********************************************************************//**\r
- * @brief  Writes Value to LCD CGram and MSP430 internal LCD table. \r
- * \r
+ * @brief  Writes Value to LCD CGram and MSP430 internal LCD table.\r
+ *\r
  * Also updates the LcdAddress and LcdTableAddress to the correct values.\r
- *  \r
- * @param  *value Pointer to the line to be written to the LCD. \r
- * \r
+ *\r
+ * @param  *value Pointer to the line to be written to the LCD.\r
+ *\r
  * @return none\r
  *************************************************************************/\r
 void halLcdDrawCurrentLine(const unsigned int *value, int Columns)\r
-{    \r
+{\r
   unsigned char i;\r
-  \r
+\r
   //prepare to send image\r
   LCD_CS_RST_OUT &= ~LCD_CS_PIN;            //CS = 0 --> Start Transfer\r
   for ( i = 0; i < 3; i++ )\r
   {\r
-      while (!(UCB2IFG & UCTXIFG));           // Wait for TXIFG    \r
+      while (!(UCB2IFG & UCTXIFG));           // Wait for TXIFG\r
       UCB2TXBUF = Draw_Block_Value_Macro[i];     // Load data\r
   }\r
   while (UCB2STAT & UCBUSY);           \r
   LCD_CS_RST_OUT |= LCD_CS_PIN;         //CS = 1 --> Stop Transfer\r
   LCD_CS_RST_OUT &= ~LCD_CS_PIN;        //CS = 0 --> Start Transfer    \r
-  while (!(UCB2IFG & UCTXIFG));           // Wait for TXIFG    \r
+  while (!(UCB2IFG & UCTXIFG));           // Wait for TXIFG\r
   UCB2TXBUF = Draw_Block_Value_Macro[3];     // Load data\r
-  \r
+\r
   //send the image\r
   for ( i = 0; i < Columns; i++ )\r
   {    \r
@@ -608,27 +608,27 @@ void halLcdDrawCurrentLine(const unsigned int *value, int Columns)
        break;\r
     }\r
        LCD_MEM[ LcdTableAddress++ ] = *value;\r
-       while (!(UCB2IFG & UCTXIFG));           // Wait for TXIFG    \r
+       while (!(UCB2IFG & UCTXIFG));           // Wait for TXIFG\r
     UCB2TXBUF = (*value) >> 8;                   // Load data\r
-    while (!(UCB2IFG & UCTXIFG));           // Wait for TXIFG    \r
+    while (!(UCB2IFG & UCTXIFG));           // Wait for TXIFG\r
     UCB2TXBUF = (*value++) & 0xFF;                   // Load data\r
   }\r
 \r
   while (UCB2STAT & UCBUSY);           \r
-  LCD_CS_RST_OUT |= LCD_CS_PIN;             //CS = 1 --> Stop Transfer \r
+  LCD_CS_RST_OUT |= LCD_CS_PIN;             //CS = 1 --> Stop Transfer\r
 }\r
 \r
 /**********************************************************************//**\r
- * @brief  Clears an image of size rows x columns starting at (x, y). \r
- * \r
+ * @brief  Clears an image of size rows x columns starting at (x, y).\r
+ *\r
  * @param  Columns The size, in columns, of the image to be cleared.\r
- * \r
+ *\r
  * @param  Rows    The size, in rows, of the image to be cleared.\r
- * \r
+ *\r
  * @param  x       x-coordinate of the image to be cleared\r
- * \r
+ *\r
  * @param  y       y-coordinate of the image to be cleared\r
- * \r
+ *\r
  * @return none\r
  *************************************************************************/\r
 void halLcdClearImage(int Columns, int Rows, int x, int y)\r
@@ -636,111 +636,111 @@ void halLcdClearImage(int Columns, int Rows, int x, int y)
   int i,j,k, Current_Location;\r
   Current_Location = (y << 5) + (x >> 3);\r
   halLcdSetAddress( Current_Location );\r
\r
+\r
   for (i=0; i < Rows; i++)\r
   {\r
     //prepare to send image\r
     LCD_CS_RST_OUT &= ~LCD_CS_PIN;            //CS = 0 --> Start Transfer\r
     for ( k = 0; k < 3; k++ )\r
     {\r
-      while (!(UCB2IFG & UCTXIFG));           // Wait for TXIFG    \r
+      while (!(UCB2IFG & UCTXIFG));           // Wait for TXIFG\r
       UCB2TXBUF = Draw_Block_Value_Macro[k];     // Load data\r
     }\r
     while (UCB2STAT & UCBUSY);         \r
     LCD_CS_RST_OUT |= LCD_CS_PIN;         //CS = 1 --> Stop Transfer\r
     LCD_CS_RST_OUT &= ~LCD_CS_PIN;        //CS = 0 --> Start Transfer  \r
-    while (!(UCB2IFG & UCTXIFG));           // Wait for TXIFG    \r
+    while (!(UCB2IFG & UCTXIFG));           // Wait for TXIFG\r
     UCB2TXBUF = Draw_Block_Value_Macro[3];     // Load data\r
-  \r
+\r
     //send blank line\r
     for (j=0; j < Columns; j++)\r
     {\r
          LCD_MEM[ LcdTableAddress++ ] = 0x00;\r
-      while (!(UCB2IFG & UCTXIFG));       // Wait for TXIFG    \r
+      while (!(UCB2IFG & UCTXIFG));       // Wait for TXIFG\r
       UCB2TXBUF = 0x00;                   // Load data\r
-      while (!(UCB2IFG & UCTXIFG));       // Wait for TXIFG    \r
+      while (!(UCB2IFG & UCTXIFG));       // Wait for TXIFG\r
       UCB2TXBUF = 0x00;                   // Load data\r
-    }     \r
+    }\r
     while (UCB2STAT & UCBUSY);         \r
     LCD_CS_RST_OUT |= LCD_CS_PIN;             //CS = 1 --> Stop Transfer\r
-    \r
+\r
     Current_Location += 0x20;\r
     halLcdSetAddress(Current_Location );\r
   }\r
 }\r
 \r
 /**********************************************************************//**\r
- * @brief  Writes Value to LCD CGRAM. Pointers internal to the LCD \r
- *         are also updated. \r
- * \r
+ * @brief  Writes Value to LCD CGRAM. Pointers internal to the LCD\r
+ *         are also updated.\r
+ *\r
  * @param  Value The value to be written to the current LCD pointer\r
- * \r
+ *\r
  * @return none\r
  *************************************************************************/\r
 void halLcdDrawTextBlock(unsigned int Value)\r
-{   \r
+{\r
   int temp;\r
-  \r
-  Draw_Block_Value_Macro[4] = Value >> 8;    \r
-  Draw_Block_Value_Macro[5] = Value & 0xFF;  \r
-  LCD_MEM[ LcdTableAddress ] = Value;        \r
-  \r
+\r
+  Draw_Block_Value_Macro[4] = Value >> 8;\r
+  Draw_Block_Value_Macro[5] = Value & 0xFF;\r
+  LCD_MEM[ LcdTableAddress ] = Value;\r
+\r
   halLcdSendCommand(Draw_Block_Value_Macro);\r
-  \r
+\r
   LcdAddress++;\r
   temp = LcdAddress >> 5;                   // Divided by 0x20\r
-  temp = temp + (temp << 4); \r
+  temp = temp + (temp << 4);\r
   //Multiplied by (1+16) and added by the offset\r
-  LcdTableAddress = temp + (LcdAddress & 0x1F); \r
-  \r
-  // If LcdAddress gets off the right edge, move to next line \r
+  LcdTableAddress = temp + (LcdAddress & 0x1F);\r
+\r
+  // If LcdAddress gets off the right edge, move to next line\r
   if ((LcdAddress & 0x1F) > 0x10)\r
     halLcdSetAddress( (LcdAddress & 0xFFE0) + 0x20 );\r
-  \r
+\r
   if (LcdAddress >= LCD_Size)\r
-    halLcdSetAddress( 0 );  \r
+    halLcdSetAddress( 0 );\r
 }\r
 \r
 /**********************************************************************//**\r
  * @brief  Displays the string to the LCD starting at current location.\r
- * \r
- * Writes all the data to LCD_MEM first, then updates all corresponding \r
+ *\r
+ * Writes all the data to LCD_MEM first, then updates all corresponding\r
  * LCD CGRAM locations at once, in a continuous fashion.\r
- *  \r
+ *\r
  * @param  String[]  The string to be displayed on LCD.\r
- * \r
- * @param  TextStyle Value that specifies whether the string is to be \r
- *                   inverted or overwritten. \r
- *                   - Invert    = 0x01 \r
- *                   - Overwrite = 0x04 \r
- * \r
+ *\r
+ * @param  TextStyle Value that specifies whether the string is to be\r
+ *                   inverted or overwritten.\r
+ *                   - Invert    = 0x01\r
+ *                   - Overwrite = 0x04\r
+ *\r
  * @return none\r
  *************************************************************************/\r
-void halLcdPrint( char String[], unsigned char TextStyle) \r
+void halLcdPrint( char String[], unsigned char TextStyle)\r
 {\r
   int i, j, Counter=0, BlockValue;\r
   int Address, LCD_MEM_Add, ActualAddress;\r
   int temp;\r
   char LookUpChar;\r
-  \r
+\r
   ActualAddress = LcdAddress;\r
-  Counter =  LcdAddress & 0x1F;  \r
+  Counter =  LcdAddress & 0x1F;\r
   i=0;\r
-  \r
+\r
   while (String[i]!=0)                      // Stop on null character\r
-  { \r
-    LookUpChar = fonts_lookup[String[i]]; \r
-    \r
-    for (j=0;j < FONT_HEIGHT ;j++)      \r
+  {\r
+    LookUpChar = fonts_lookup[String[i]];\r
+\r
+    for (j=0;j < FONT_HEIGHT ;j++)\r
     {\r
       Address = ActualAddress + j*0x20;\r
       temp = Address >> 5;\r
       temp += (temp <<4);\r
 \r
-      LCD_MEM_Add = temp + (Address & 0x1F); \r
-      \r
+      LCD_MEM_Add = temp + (Address & 0x1F);\r
+\r
       BlockValue = LCD_MEM[ LCD_MEM_Add ];\r
-      \r
+\r
       if(TextStyle & GRAYSCALE_TEXT)\r
       {\r
        if (TextStyle & INVERT_TEXT)\r
@@ -750,130 +750,130 @@ void halLcdPrint( char String[], unsigned char TextStyle)
            BlockValue |= 0xAAAA - GrayScale_fonts[LookUpChar*(FONT_HEIGHT+1) +j];\r
        else\r
          if (TextStyle & OVERWRITE_TEXT)\r
-            BlockValue = GrayScale_fonts[LookUpChar*(FONT_HEIGHT+1) +j]; \r
+            BlockValue = GrayScale_fonts[LookUpChar*(FONT_HEIGHT+1) +j];\r
           else\r
             BlockValue |= GrayScale_fonts[LookUpChar*(FONT_HEIGHT+1) +j];\r
       }\r
       else\r
-      {      \r
-        if (TextStyle & INVERT_TEXT)         \r
+      {\r
+        if (TextStyle & INVERT_TEXT)\r
           if (TextStyle & OVERWRITE_TEXT)\r
-            BlockValue = 0xFFFF - fonts[LookUpChar*13+j]; \r
+            BlockValue = 0xFFFF - fonts[LookUpChar*13+j];\r
           else\r
-            BlockValue |= 0xFFFF - fonts[LookUpChar*13+j]; \r
-        \r
-        else     \r
+            BlockValue |= 0xFFFF - fonts[LookUpChar*13+j];\r
+\r
+        else\r
           if (TextStyle & OVERWRITE_TEXT)\r
-            BlockValue = fonts[LookUpChar*(FONT_HEIGHT+1) +j]; \r
+            BlockValue = fonts[LookUpChar*(FONT_HEIGHT+1) +j];\r
           else\r
-            BlockValue |= fonts[LookUpChar*(FONT_HEIGHT+1) +j]; \r
+            BlockValue |= fonts[LookUpChar*(FONT_HEIGHT+1) +j];\r
       }\r
-      halLcdDrawBlock( Address, BlockValue);          \r
+      halLcdDrawBlock( Address, BlockValue);\r
     }\r
-    \r
+\r
     Counter++;\r
     if (Counter == 17)\r
     {\r
-      Counter = 0;        \r
+      Counter = 0;\r
       ActualAddress += 0x20*FONT_HEIGHT  - 16;\r
       if (ActualAddress > LCD_Last_Pixel-0x20*FONT_HEIGHT )\r
         ActualAddress = 0;\r
     }\r
-    else \r
+    else\r
       ActualAddress++;\r
     i++;\r
   }\r
   halLcdSetAddress(ActualAddress);\r
-  \r
+\r
 }\r
 \r
 /**********************************************************************//**\r
- * @brief  Displays the string to the LCD starting at (x,y) location. \r
- * \r
- * Writes all the data to LCD_MEM first, then updates all corresponding \r
+ * @brief  Displays the string to the LCD starting at (x,y) location.\r
+ *\r
+ * Writes all the data to LCD_MEM first, then updates all corresponding\r
  * LCD CGRAM locations at once, in a continuous fashion.\r
- * \r
+ *\r
  * @param  String[]  String to be displayed on LCD\r
- * \r
- * @param  x         x-coordinate of the write location on the LCD \r
- * \r
+ *\r
+ * @param  x         x-coordinate of the write location on the LCD\r
+ *\r
  * @param  y         y-coordinate of the write location on the LCD\r
- * \r
- * @param  TextStyle Value that specifies whether the string is to be \r
- *                   inverted or overwritten. \r
- *                   - Invert    = 0x01 \r
- *                   - Overwrite = 0x04 \r
+ *\r
+ * @param  TextStyle Value that specifies whether the string is to be\r
+ *                   inverted or overwritten.\r
+ *                   - Invert    = 0x01\r
+ *                   - Overwrite = 0x04\r
  *************************************************************************/\r
-void halLcdPrintXY( char String[], int x, int y, unsigned char TextStyle)  \r
+void halLcdPrintXY( char String[], int x, int y, unsigned char TextStyle)\r
 {\r
   //Each line increments by 0x20\r
-  halLcdSetAddress( (y << 5) + (x >> 3)) ;  //Narrow down to 8 possible pixels    \r
+  halLcdSetAddress( (y << 5) + (x >> 3)) ;  //Narrow down to 8 possible pixels\r
   halLcdPrint(String,  TextStyle);\r
 }\r
 \r
 /**********************************************************************//**\r
- * @brief  Displays a string on the LCD on the specified line.  \r
- * \r
+ * @brief  Displays a string on the LCD on the specified line.\r
+ *\r
  * @param  String[]  The string to be displayed on LCD.\r
- * \r
+ *\r
  * @param  Line      The line on the LCD on which to print the string.\r
- * \r
- * @param  TextStyle Value that specifies whether the string is to be \r
- *                   inverted or overwritten. \r
- *                   - Invert    = 0x01 \r
- *                   - Overwrite = 0x04 \r
- * \r
+ *\r
+ * @param  TextStyle Value that specifies whether the string is to be\r
+ *                   inverted or overwritten.\r
+ *                   - Invert    = 0x01\r
+ *                   - Overwrite = 0x04\r
+ *\r
  * @return none\r
  *************************************************************************/\r
-void halLcdPrintLine(char String[], unsigned char Line, unsigned char TextStyle)  \r
+void halLcdPrintLine(char String[], unsigned char Line, unsigned char TextStyle)\r
 {\r
-  int temp; \r
+  int temp;\r
   temp = Line * FONT_HEIGHT ;\r
-  halLcdSetAddress( temp << 5 ) ;           // 0x20 = 2^5  \r
+  halLcdSetAddress( temp << 5 ) ;           // 0x20 = 2^5\r
   halLcdPrint(String, TextStyle);\r
 }\r
 \r
 /**********************************************************************//**\r
- * @brief  Prints a string beginning on a given line and column.  \r
- * \r
+ * @brief  Prints a string beginning on a given line and column.\r
+ *\r
  * @param  String[]  The string to be displayed on LCD.\r
- * \r
+ *\r
  * @param  Line      The line on which to print the string of text\r
- * \r
+ *\r
  * @param  Col       The column on which to print the string of text\r
- * \r
- * @param  TextStyle Value that specifies whether the string is to be \r
- *                   inverted or overwritten. \r
- *                   - Invert    = 0x01 \r
- *                   - Overwrite = 0x04 \r
- * \r
+ *\r
+ * @param  TextStyle Value that specifies whether the string is to be\r
+ *                   inverted or overwritten.\r
+ *                   - Invert    = 0x01\r
+ *                   - Overwrite = 0x04\r
+ *\r
  * @return none\r
  *************************************************************************/\r
 void halLcdPrintLineCol(char String[], unsigned char Line, unsigned char Col,\r
-                        unsigned char TextStyle)  \r
+                        unsigned char TextStyle)\r
 {\r
-  int temp; \r
-  \r
+  int temp;\r
+\r
   temp = Line * FONT_HEIGHT;\r
   temp <<= 5;\r
   temp += Col;\r
-  \r
-  halLcdSetAddress( temp ) ;                // 0x20 = 2^5                     \r
+\r
+  halLcdSetAddress( temp ) ;                // 0x20 = 2^5\r
   halLcdPrint(String, TextStyle);\r
 }\r
 \r
 \r
 /**********************************************************************//**\r
  * @brief  Draws a horizontral line from (x1,y) to (x2,y) of GrayScale level\r
- * \r
- * @param  x1        x-coordinate of the first point \r
- * \r
+ *\r
+ * @param  x1        x-coordinate of the first point\r
+ *\r
  * @param  x2        x-coordinate of the second point\r
- * \r
+ *\r
  * @param  y         y-coordinate of both points\r
- * \r
+ *\r
  * @param  GrayScale Grayscale level of the horizontal line\r
- * \r
+ *\r
  * @return none\r
  *************************************************************************/\r
 void halLcdHLine( int x1, int x2, int y, unsigned char GrayScale)\r
@@ -881,27 +881,27 @@ void halLcdHLine( int x1, int x2, int y, unsigned char GrayScale)
   int x_dir, x;\r
   if ( x1 < x2 )\r
     x_dir = 1;\r
-  else \r
+  else\r
     x_dir = -1;\r
-  x = x1;    \r
+  x = x1;\r
   while (x != x2)\r
   {\r
-    halLcdPixel( x,y, GrayScale); \r
+    halLcdPixel( x,y, GrayScale);\r
     x += x_dir;\r
   }\r
 }\r
 \r
 /**********************************************************************//**\r
  * @brief  Draws a vertical line from (x,y1) to (x,y2) of GrayScale level\r
- * \r
+ *\r
  * @param  x         x-coordinate of both points\r
- * \r
- * @param  y1        y-coordinate of the first point \r
- * \r
+ *\r
+ * @param  y1        y-coordinate of the first point\r
+ *\r
  * @param  y2        y-coordinate of the second point\r
- * \r
+ *\r
  * @param  GrayScale GrayScale level of the vertical line\r
- * \r
+ *\r
  * @return none\r
  *************************************************************************/\r
 void halLcdVLine( int x, int y1, int y2, unsigned char GrayScale)\r
@@ -909,36 +909,36 @@ void halLcdVLine( int x, int y1, int y2, unsigned char GrayScale)
   int y_dir, y;\r
   if ( y1 < y2 )\r
     y_dir = 1;\r
-  else \r
+  else\r
     y_dir = -1;\r
-  y = y1;    \r
+  y = y1;\r
   while (y != y2)\r
   {\r
-    halLcdPixel( x,y, GrayScale); \r
+    halLcdPixel( x,y, GrayScale);\r
     y += y_dir;\r
   }\r
 }\r
 \r
 /**********************************************************************//**\r
  * @brief  Draws a line from (x1,y1) to (x2,y2) of GrayScale level.\r
- *         \r
+ *\r
  * Uses Bresenham's line algorithm.\r
- * \r
- * @param  x1         x-coordinate of the first point        \r
- *  \r
+ *\r
+ * @param  x1         x-coordinate of the first point\r
+ *\r
  * @param  y1         y-coordinate of the first point\r
- * \r
+ *\r
  * @param  x2         x-coordinate of the second point\r
- * \r
+ *\r
  * @param  y2         y-coordinate of the second point\r
- * \r
- * @param  GrayScale  Grayscale level of the line \r
- * \r
+ *\r
+ * @param  GrayScale  Grayscale level of the line\r
+ *\r
  * @return none\r
  *************************************************************************/\r
-void halLcdLine( int x1, int y1, int x2, int y2, unsigned char GrayScale) \r
+void halLcdLine( int x1, int y1, int x2, int y2, unsigned char GrayScale)\r
 {\r
-  int x, y, deltay, deltax, d;  \r
+  int x, y, deltay, deltax, d;\r
   int x_dir, y_dir;\r
 \r
   if ( x1 == x2 )\r
@@ -955,7 +955,7 @@ void halLcdLine( int x1, int y1, int x2, int y2, unsigned char GrayScale)
       if (y1 > y2)\r
         y_dir = -1;\r
       else y_dir = 1;\r
-      \r
+\r
       x = x1;\r
       y = y1;\r
       deltay = ABS(y2 - y1);\r
@@ -975,7 +975,7 @@ void halLcdLine( int x1, int y1, int x2, int y2, unsigned char GrayScale)
             y += y_dir;\r
           }\r
           x += x_dir;\r
-        }                \r
+        }\r
       }\r
       else\r
       {\r
@@ -991,30 +991,30 @@ void halLcdLine( int x1, int y1, int x2, int y2, unsigned char GrayScale)
             x += x_dir;\r
           }\r
           y += y_dir;\r
-        }        \r
+        }\r
       }\r
-    }  \r
+    }\r
   }\r
 }\r
 \r
 \r
 /**********************************************************************//**\r
  * @brief  Draw a circle of Radius with center at (x,y) of GrayScale level.\r
- *         \r
+ *\r
  * Uses Bresenham's circle algorithm\r
- * \r
+ *\r
  * @param  x         x-coordinate of the circle's center point\r
- * \r
+ *\r
  * @param  y         y-coordinate of the circle's center point\r
- * \r
+ *\r
  * @param  Radius    Radius of the circle\r
- * \r
- * @param  GrayScale Grayscale level of the circle \r
+ *\r
+ * @param  GrayScale Grayscale level of the circle\r
  *************************************************************************/\r
 void halLcdCircle(int x, int y, int Radius, int GrayScale)\r
 {\r
   int xx, yy, ddF_x, ddF_y, f;\r
-  \r
+\r
   ddF_x = 0;\r
   ddF_y = -(2 * Radius);\r
   f = 1 - Radius;\r
@@ -1052,71 +1052,71 @@ void halLcdCircle(int x, int y, int Radius, int GrayScale)
 }\r
 \r
 /**********************************************************************//**\r
- * @brief  Scrolls a single row of pixels one column to the left. \r
- * \r
- * The column that is scrolled out of the left side of the LCD will be \r
- * displayed the right side of the LCD. \r
- * \r
+ * @brief  Scrolls a single row of pixels one column to the left.\r
+ *\r
+ * The column that is scrolled out of the left side of the LCD will be\r
+ * displayed the right side of the LCD.\r
+ *\r
  * @param  y    The row of pixels to scroll. y = 0 is at the top-left\r
- *              corner of the LCD. \r
- * \r
+ *              corner of the LCD.\r
+ *\r
  * @return none\r
  *************************************************************************/\r
 void halLcdScrollRow(int y)\r
 {\r
   int i, Address, LcdTableAddressTemp;\r
   unsigned int temp;\r
-  \r
+\r
   Address = y << 5;\r
-  \r
+\r
   halLcdSetAddress( Address );\r
-  \r
+\r
   //Multiplied by (1+16) and added by the offset\r
-  LcdTableAddressTemp = y + (y << 4);       \r
+  LcdTableAddressTemp = y + (y << 4);\r
   temp = ((LCD_MEM[LcdTableAddressTemp] & 0x0003) <<14);\r
-  \r
-  for (i = 0; i < 0x10; i++)      \r
+\r
+  for (i = 0; i < 0x10; i++)\r
     halLcdDrawCurrentBlock( ( (LCD_MEM[LcdTableAddressTemp+i] & 0xFFFC ) >> 2 ) \\r
     + ((LCD_MEM[LcdTableAddressTemp+i+1] & 0x0003) << 14 ));\r
-    \r
-  halLcdDrawCurrentBlock( (( LCD_MEM[LcdTableAddressTemp + 0x10] & 0xFFFC ) >> 2) + temp);    \r
+\r
+  halLcdDrawCurrentBlock( (( LCD_MEM[LcdTableAddressTemp + 0x10] & 0xFFFC ) >> 2) + temp);\r
 }\r
 \r
 /**********************************************************************//**\r
- * @brief  Scrolls multiple rows of pixels, yStart to yEnd, \r
- *         one column to the left. \r
- * \r
- * The column that is scrolled out of the left side of the LCD will be \r
- * displayed the right side of the LCD. y = 0 is at the top-left of the \r
+ * @brief  Scrolls multiple rows of pixels, yStart to yEnd,\r
+ *         one column to the left.\r
+ *\r
+ * The column that is scrolled out of the left side of the LCD will be\r
+ * displayed the right side of the LCD. y = 0 is at the top-left of the\r
  * LCD screen.\r
- * \r
+ *\r
  * @param  yStart The beginning row to be scrolled\r
- * \r
- * @param  yEnd   The last row to be scrolled \r
- * \r
+ *\r
+ * @param  yEnd   The last row to be scrolled\r
+ *\r
  * @return none\r
  *************************************************************************/\r
 void halLcdHScroll(int yStart, int yEnd)\r
 {\r
-  int i ;  \r
-  \r
+  int i ;\r
+\r
   for (i = yStart; i < yEnd+1; i++)\r
     halLcdScrollRow(i);\r
 }\r
 \r
 /**********************************************************************//**\r
- * @brief  Scrolls a line of text one column to the left. \r
- * \r
- * @param  Line The line of text to be scrolled.  \r
- * \r
+ * @brief  Scrolls a line of text one column to the left.\r
+ *\r
+ * @param  Line The line of text to be scrolled.\r
+ *\r
  * @return none\r
  *************************************************************************/\r
 void halLcdScrollLine(int Line)\r
 {\r
   int i, Row ;\r
-  \r
+\r
   Row = Line * FONT_HEIGHT;\r
-  \r
+\r
   for (i = Row; i < Row + FONT_HEIGHT ; i++)\r
     halLcdScrollRow(i);\r
 }\r
index 477ff9836d59c6055e19fd7b419cce4ea985f259..688deaa5c9f526f4cea2c23c9df76787db0d720c 100644 (file)
@@ -74,6 +74,7 @@ void vParTestInitialise( void )
 \r
 void vParTestSetLED( unsigned portBASE_TYPE uxLED, signed portBASE_TYPE xValue )\r
 {\r
+       /* Only two LEDs are provided on the hardware. */\r
        taskENTER_CRITICAL();\r
        {\r
                if( xValue != pdFALSE )\r
@@ -85,6 +86,9 @@ void vParTestSetLED( unsigned portBASE_TYPE uxLED, signed portBASE_TYPE xValue )
        \r
                                case 1: LED_PORT_OUT |= LED_2;\r
                                                break;\r
+                                               \r
+                               default: /* Nothing to do here, there are only two LEDs. */\r
+                                               break;\r
                        }\r
                }\r
                else\r
@@ -96,6 +100,8 @@ void vParTestSetLED( unsigned portBASE_TYPE uxLED, signed portBASE_TYPE xValue )
        \r
                                case 1: LED_PORT_OUT &= ~LED_2;\r
                                                break;\r
+                               default: /* Nothing to do here, there are only two LEDs. */\r
+                                               break;\r
                        }\r
                }\r
        }\r
@@ -128,6 +134,8 @@ void vParTestToggleLED( unsigned portBASE_TYPE uxLED )
                                                LED_PORT_OUT &= ~LED_2;\r
                                        }\r
                                        break;\r
+                       default: /* Nothing to do here, there are only two LEDs. */\r
+                                       break;\r
                }\r
        }\r
        taskEXIT_CRITICAL();\r
index c05a495b55bb2066cb82dc413055f7285bb65eb6..1262bc5cb7d26bb3da9ae272ad3b63f39aaa8a74 100644 (file)
   <file>\r
     <name>$PROJ_DIR$\RegTest.s43</name>\r
   </file>\r
+  <file>\r
+    <name>$PROJ_DIR$\RunTimeStatsConfig.c</name>\r
+  </file>\r
   <file>\r
     <name>$PROJ_DIR$\serial.c</name>\r
   </file>\r
index a750e826987460ef358f1eb27c3c1434eb393ec2..98478adc668ae3a08b61723195a1f4c01df6d88a 100644 (file)
 #include "msp430.h"\r
 #include "FreeRTOSConfig.h"\r
 \r
+/*\r
+ * The definition of the "register test" tasks, as described at the top of\r
+ * main.c\r
+ */\r
+\r
+\r
+\r
        IMPORT usRegTest1Counter\r
        IMPORT usRegTest2Counter\r
+       IMPORT vPortYield\r
        \r
        EXPORT vRegTest1Task\r
        EXPORT vRegTest2Task\r
@@ -63,6 +71,7 @@
 \r
 vRegTest1Task:\r
 \r
+       /* Fill each general purpose register with a known value. */\r
        movx.a  #0x44444, r4\r
        movx.a  #0x55555, r5\r
        movx.a  #0x66666, r6\r
@@ -78,6 +87,9 @@ vRegTest1Task:
        \r
 prvRegTest1Loop:\r
 \r
+       /* Test each general purpose register to check that it still contains the\r
+       expected known value, jumping to vRegTest1Error if any register contains\r
+       an unexpected value. */\r
        cmpx.a  #0x44444, r4\r
        jne             vRegTest1Error\r
        cmpx.a  #0x55555, r5\r
@@ -102,7 +114,12 @@ prvRegTest1Loop:
        jne             vRegTest1Error\r
        cmpx.a  #0xfffff, r15\r
        jne             vRegTest1Error\r
+       \r
+       /* This task is still running without jumping to vRegTest1Error, so increment\r
+       the loop counter so the check task knows the task is running error free. */\r
        incx.w  &usRegTest1Counter\r
+       \r
+       /* Loop again, performing the same tests. */\r
        jmp             prvRegTest1Loop\r
        nop\r
 \r
@@ -110,49 +127,56 @@ prvRegTest1Loop:
 vRegTest1Error:\r
        jmp vRegTest1Error\r
        nop\r
+       \r
 /*-----------------------------------------------------------*/\r
 \r
+/* See the comments in vRegTest1Task.  This task is the same, it just uses\r
+different values in its registers. */\r
 vRegTest2Task:\r
 \r
-       movx.a  #0x44444, r4\r
-       movx.a  #0x55555, r5\r
-       movx.a  #0x66666, r6\r
-       movx.a  #0x77777, r7\r
-       movx.a  #0x88888, r8\r
-       movx.a  #0x99999, r9\r
-       movx.a  #0xaaaaa, r10\r
-       movx.a  #0xbbbbb, r11\r
-       movx.a  #0xccccc, r12\r
-       movx.a  #0xddddd, r13\r
-       movx.a  #0xeeeee, r14\r
-       movx.a  #0xfffff, r15\r
+       movx.a  #0x14441, r4\r
+       movx.a  #0x15551, r5\r
+       movx.a  #0x16661, r6\r
+       movx.a  #0x17771, r7\r
+       movx.a  #0x18881, r8\r
+       movx.a  #0x19991, r9\r
+       movx.a  #0x1aaa1, r10\r
+       movx.a  #0x1bbb1, r11\r
+       movx.a  #0x1ccc1, r12\r
+       movx.a  #0x1ddd1, r13\r
+       movx.a  #0x1eee1, r14\r
+       movx.a  #0x1fff1, r15\r
        \r
 prvRegTest2Loop:\r
 \r
-       cmpx.a  #0x44444, r4\r
+       cmpx.a  #0x14441, r4\r
        jne             vRegTest2Error\r
-       cmpx.a  #0x55555, r5\r
+       cmpx.a  #0x15551, r5\r
        jne             vRegTest2Error\r
-       cmpx.a  #0x66666, r6\r
+       cmpx.a  #0x16661, r6\r
        jne             vRegTest2Error\r
-       cmpx.a  #0x77777, r7\r
+       cmpx.a  #0x17771, r7\r
        jne             vRegTest2Error\r
-       cmpx.a  #0x88888, r8\r
+       cmpx.a  #0x18881, r8\r
        jne             vRegTest2Error\r
-       cmpx.a  #0x99999, r9\r
+       cmpx.a  #0x19991, r9\r
        jne             vRegTest2Error\r
-       cmpx.a  #0xaaaaa, r10\r
+       cmpx.a  #0x1aaa1, r10\r
        jne             vRegTest2Error\r
-       cmpx.a  #0xbbbbb, r11\r
+       cmpx.a  #0x1bbb1, r11\r
        jne             vRegTest2Error\r
-       cmpx.a  #0xccccc, r12\r
+       cmpx.a  #0x1ccc1, r12\r
        jne             vRegTest2Error\r
-       cmpx.a  #0xddddd, r13\r
+       cmpx.a  #0x1ddd1, r13\r
        jne             vRegTest2Error\r
-       cmpx.a  #0xeeeee, r14\r
+       cmpx.a  #0x1eee1, r14\r
        jne             vRegTest2Error\r
-       cmpx.a  #0xfffff, r15\r
+       cmpx.a  #0x1fff1, r15\r
        jne             vRegTest2Error\r
+       \r
+       /* Also perform a manual yield, just to increase the scope of the test. */\r
+       calla   #vPortYield\r
+       \r
        incx.w  &usRegTest2Counter\r
        jmp             prvRegTest2Loop\r
        nop\r
diff --git a/Demo/MSP430X_MSP430F5438_IAR/RunTimeStatsConfig.c b/Demo/MSP430X_MSP430F5438_IAR/RunTimeStatsConfig.c
new file mode 100644 (file)
index 0000000..94dd0f9
--- /dev/null
@@ -0,0 +1,115 @@
+/*\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
+/* FreeRTOS includes. */\r
+#include "FreeRTOS.h"\r
+\r
+/* Hardware includes. */\r
+#include "msp430.h"\r
+#include "hal_MSP-EXP430F5438.h"\r
+\r
+/* This demo uses Timer A1 to generate the time base for gathering run time\r
+statistics information.  Run time statistics show much processing time has\r
+been allocated to each task since the application booted. */\r
+\r
+/* The time base for the run time stats is generated by a 16 bit timer.  Each\r
+time the timer overflows ulStatsOverflowCount is incremented.  Therefore,\r
+when converting the total run time to a 32 bit number, the most significant two\r
+bytes are given by ulStatsOverflowCount and the least significant two bytes are\r
+given by the current timer counter value.  Care must be taken with data\r
+consistency when combining the two in case a timer overflow occurs as the\r
+value is being read. */\r
+volatile unsigned long ulStatsOverflowCount = 0;\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
index 99dc499d94db3838c09fd6aa8bb32ac73b654eac..332a195949644ef1b11c42193c13f521e8d16cff 100644 (file)
 \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
--P(CODE)CODE=10000-45BFF\r
+//-P(CODE)CODE=10000-45BFF\r
 \r
 -Z(CODE)CODE_ID\r
 \r
index 9a922b81cb9b82cd49b208071de17aa79b7107b3..fe5e57fd2749c6a11c9d8cb9bf78e034aaf8984b 100644 (file)
     licensing and training services.\r
 */\r
 \r
+/*\r
+ * The documentation page for this demo available on http://www.FreeRTOS.org\r
+ * documents the hardware configuration required to run this demo.  It also\r
+ * provides more information on the expected demo application behaviour.\r
+ *\r
+ * main() creates all the demo application tasks, then starts the scheduler.\r
+ * A lot of the created tasks are from the pool of "standard demo" tasks.  The\r
+ * web documentation provides more details of the standard demo tasks, which\r
+ * provide no particular functionality but do provide good examples of how to\r
+ * use the FreeRTOS API.\r
+ *\r
+ * In addition to the standard demo tasks, the following tasks, interrupts and\r
+ * tests are defined and/or created within this file:\r
+ *\r
+ * "LCD" task - The LCD task is a 'gatekeeper' task.  It is the only task that\r
+ * is permitted to access the LCD and therefore ensures access to the LCD is\r
+ * always serialised and there are no mutual exclusion issues.  When a task or\r
+ * an interrupt wants to write to the LCD, it does not access the LCD directly\r
+ * but instead sends the message to the LCD task.  The LCD task then performs\r
+ * the actual LCD output.  This mechanism also allows interrupts to, in effect,\r
+ * write to the LCD by sending messages to the LCD task.\r
+ *\r
+ * The LCD task is also a demonstration of a 'controller' task design pattern.\r
+ * Some tasks do not actually send a string to the LCD task directly, but\r
+ * instead send a command that is interpreted by the LCD task.  In a normal\r
+ * application these commands can be control values or set points, in this\r
+ * simple example the commands just result in messages being displayed on the\r
+ * LCD.\r
+ *\r
+ * "Button Poll" task - This task polls the state of the 'up' key on the\r
+ * joystick input device.  It uses the vTaskDelay() API function to control\r
+ * the poll rate to ensure debouncing is not necessary and that the task does\r
+ * not use all the available CPU processing time.\r
+ *\r
+ * Button Interrupt and run time stats display - The select button on the\r
+ * joystick input device is configured to generate an external interrupt.  The\r
+ * handler for this interrupt sends a message to LCD task, which interprets the\r
+ * message to mean, firstly write a message to the LCD, and secondly, generate\r
+ * a table of run time statistics.  The run time statistics are displayed as a\r
+ * table that contains information on how much processing time each task has\r
+ * been allocated since the application started to execute.  This information\r
+ * is provided both as an absolute time, and as a percentage of the total run\r
+ * time.  The information is displayed in the terminal IO window of the IAR\r
+ * embedded workbench.  The online documentation for this demo shows a screen\r
+ * shot demonstrating where the run time stats can be viewed.\r
+ *\r
+ * Idle Hook - The idle hook is a function that is called on each iteration of\r
+ * the idle task.  In this case it is used to place the processor into a low\r
+ * power mode.  Note however that this application is implemented using standard\r
+ * components, and is therefore not optimised for low power operation.  Lower\r
+ * power consumption would be achieved by converting polling tasks into event\r
+ * driven tasks, and slowing the tick interrupt frequency.\r
+ *\r
+ * "Check" function called from the tick hook - The tick hook is called during\r
+ * each tick interrupt.  It is called from an interrupt context so must execute\r
+ * quickly, not attempt to block, and not call any FreeRTOS API functions that\r
+ * do not end in "FromISR".  In this case the tick hook executes a 'check'\r
+ * function.  This only executes every five seconds.  Its main function is to\r
+ * check that all the standard demo tasks are still operational.  Each time it\r
+ * executes it sends a status code to the LCD task.  The LCD task interprets the\r
+ * code and displays an appropriate message - which will be PASS if no tasks\r
+ * have reported any errors, or a message stating which task has reported an\r
+ * error.\r
+ *\r
+ * "Reg test" tasks - These fill the registers with known values, then check\r
+ * that each register still contains its expected value.  Each task uses\r
+ * different values.  The tasks run with very low priority so get preempted\r
+ * very frequently.  A check variable is incremented on each iteration of the\r
+ * test loop.  A register containing an unexpected value is indicative of an\r
+ * error in the context switching mechanism and will result in a branch to a\r
+ * null loop - which in turn will prevent the check variable from incrementing\r
+ * any further and allow the check task (described a above) to determine that an\r
+ * error has occurred.  The nature of the reg test tasks necessitates that they\r
+ * are written in assembly code.\r
+ *\r
+ * *NOTE 2* vApplicationSetupTimerInterrupt() is called by the kernel to let\r
+ * the application set up a timer to generate the tick interrupt.  In this\r
+ * example a timer A0 is used for this purpose.\r
+ *\r
+*/\r
+\r
 /* Standard includes. */\r
 #include <stdio.h>\r
 \r
@@ -88,30 +169,58 @@ of the same message and indicate what the status actually is. */
 to send messages from tasks and interrupts the the LCD task. */\r
 #define mainQUEUE_LENGTH                               ( 5 )\r
 \r
+/* Priorities used by the test and demo tasks. */\r
 #define mainLCD_TASK_PRIORITY                  ( tskIDLE_PRIORITY + 1 )\r
 #define mainCOM_TEST_PRIORITY                  ( tskIDLE_PRIORITY + 2 )\r
 #define mainGENERIC_QUEUE_TEST_PRIORITY        ( tskIDLE_PRIORITY )\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
+information.  */\r
+#define mainCOM_TEST_LED                               ( 1 )\r
 \r
 /* The baud rate used by the comtest tasks described at the top of this file. */\r
-#define mainCOM_TEST_BAUD_RATE                 ( 9600 )\r
+#define mainCOM_TEST_BAUD_RATE                 ( 115200 )\r
+\r
+/* The maximum number of lines of text that can be displayed on the LCD. */\r
+#define mainMAX_LCD_LINES                              ( 8 )\r
 /*-----------------------------------------------------------*/\r
 \r
+/*\r
+ * The reg test tasks as described at the top of this file.\r
+ */\r
 extern void vRegTest1Task( void *pvParameters );\r
 extern void vRegTest2Task( void *pvParameters );\r
+\r
+/*\r
+ * Configures clocks, LCD, port pints, etc. necessary to execute this demo.\r
+ */\r
 static void prvSetupHardware( void );\r
-static void prvTerminalIOTask( void *pvParameters );\r
+\r
+/*\r
+ * Definition of the LCD/controller task described in the comments at the top\r
+ * of this file.\r
+ */\r
+static void prvLCDTask( void *pvParameters );\r
+\r
+/*\r
+ * Definition of the button poll task described in the comments at the top of\r
+ * this file.\r
+ */\r
 static void prvButtonPollTask( void *pvParameters );\r
+\r
+/*\r
+ * Converts a status message value into an appropriate string for display on\r
+ * the LCD.  The string is written to pcBuffer.\r
+ */\r
 static void prvGenerateStatusMessage( char *pcBuffer, long lStatusValue );\r
 \r
 /*-----------------------------------------------------------*/\r
 \r
+/* Variables that are incremented on each iteration of the reg test tasks -\r
+provided the tasks have not reported any errors.  The check task inspects these\r
+variables to ensure they are still incrementing as expected.  If a variable\r
+stops incrementing then it is likely that its associate task has stalled. */\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
@@ -121,19 +230,24 @@ static xQueueHandle xLCDQueue = NULL;
 task. */\r
 typedef struct\r
 {\r
-       char cMessageID;        /* << States what the message is. */\r
-       unsigned long ulMessageValue; /* << States the message value (can be an integer, string pointer, etc. depending on the value of cMessageID. */\r
+       char cMessageID;                                /* << States what the message is. */\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
 \r
 void main( void )\r
 {\r
+       /* Configure the peripherals used by this demo application.  This includes\r
+       configuring the joystick input select button to generate interrupts. */\r
        prvSetupHardware();\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
 \r
+       /* If the queue could not be created then don't create any tasks that might\r
+       attempt to use the queue. */\r
        if( xLCDQueue != NULL )\r
        {\r
                /* Add the created queue to the queue registry so it can be viewed in\r
@@ -145,22 +259,26 @@ void main( void )
                vStartDynamicPriorityTasks();\r
                vStartGenericQueueTasks( mainGENERIC_QUEUE_TEST_PRIORITY );\r
                \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 * 2, NULL, mainLCD_TASK_PRIORITY, NULL );\r
+               /* Create the LCD, button poll and register test tasks, as described at\r
+               the top of this file. */\r
+               xTaskCreate( prvLCDTask, ( signed char * ) "LCD", configMINIMAL_STACK_SIZE * 2, NULL, mainLCD_TASK_PRIORITY, NULL );\r
                xTaskCreate( prvButtonPollTask, ( signed char * ) "BPoll", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL );\r
-\r
-               /* Create the register test tasks as described at the top of this file. */\r
                xTaskCreate( vRegTest1Task, "Reg1", configMINIMAL_STACK_SIZE, NULL, 0, NULL );\r
                xTaskCreate( vRegTest2Task, "Reg2", configMINIMAL_STACK_SIZE, NULL, 0, NULL );\r
+\r
+               /* Start the scheduler. */\r
                vTaskStartScheduler();\r
        }\r
        \r
+       /* If all is well then this line will never be reached.  If it is reached\r
+       then it is likely that there was insufficient (FreeRTOS) heap memory space\r
+       to create the idle task.  This may have been trapped by the malloc() failed\r
+       hook function, if one is configured. */ \r
        for( ;; );\r
 }\r
 /*-----------------------------------------------------------*/\r
 \r
-static void prvTerminalIOTask( void *pvParameters )\r
+static void prvLCDTask( void *pvParameters )\r
 {\r
 xQueueMessage xReceivedMessage;\r
 \r
@@ -192,7 +310,7 @@ unsigned char ucLine = 1;
                xQueueReceive( xLCDQueue, &xReceivedMessage, portMAX_DELAY );\r
 \r
                /* Clear the LCD if no room remains for any more text output. */\r
-               if( ucLine > 8 )\r
+               if( ucLine > mainMAX_LCD_LINES )\r
                {\r
                        halLcdClearScreen();\r
                        ucLine = 0;\r
@@ -225,7 +343,7 @@ unsigned char ucLine = 1;
                                                                                                the LCD - in this case the\r
                                                                                                pointer to the string to print\r
                                                                                                is sent directly in the\r
-                                                                                               lMessageValue member of the\r
+                                                                                               ulMessageValue member of the\r
                                                                                                message.  This just demonstrates\r
                                                                                                a different communication\r
                                                                                                technique. */\r
@@ -244,6 +362,9 @@ unsigned char ucLine = 1;
                                                                                                break;\r
                }\r
                \r
+               /* Output the message that was placed into the cBuffer array within the\r
+               switch statement above, then move onto the next line ready for the next\r
+               message to arrive on the queue. */\r
                halLcdPrintLine( cBuffer, ucLine,  OVERWRITE_TEXT );\r
                ucLine++;\r
        }\r
@@ -260,7 +381,7 @@ static void prvGenerateStatusMessage( char *pcBuffer, long lStatusValue )
                                                                                        break;\r
                case mainERROR_DYNAMIC_TASKS    :       sprintf( pcBuffer, "Err: Dynamic tsks" );\r
                                                                                        break;\r
-               case mainERROR_COM_TEST                 :       sprintf( pcBuffer, "Err: COM test" ); /* Error in COM test - is the Loopback connector connected? */                                                                                                            \r
+               case mainERROR_COM_TEST                 :       sprintf( pcBuffer, "Err: COM test" );\r
                                                                                        break;\r
                case mainERROR_GEN_QUEUE_TEST   :       sprintf( pcBuffer, "Error: Gen Q test" );\r
                                                                                        break;\r
@@ -286,6 +407,7 @@ xQueueMessage xMessage;
                \r
                if( ucState != 0 )\r
                {\r
+                       /* The button was pressed. */\r
                        ucState = pdTRUE;\r
                }\r
                \r
@@ -307,6 +429,8 @@ xQueueMessage xMessage;
 \r
 static void prvSetupHardware( void )\r
 {\r
+/* Convert a Hz value to a KHz value, as required by the Init_FLL_Settle()\r
+function. */\r
 unsigned long ulCPU_Clock_KHz = ( configCPU_CLOCK_HZ / 1000UL );\r
 \r
        halBoardInit();\r
@@ -316,64 +440,18 @@ unsigned long ulCPU_Clock_KHz = ( configCPU_CLOCK_HZ / 1000UL );
 \r
        halButtonsInit( BUTTON_ALL );\r
        halButtonsInterruptEnable( BUTTON_SELECT );\r
+\r
+       /* Initialise the LCD, but note that the backlight is not used as the\r
+       library function uses timer A0 to modulate the backlight, and this file\r
+       defines vApplicationSetupTimerInterrupt() to also use timer A0 to generate\r
+       the tick interrupt.  If the backlight is required, then change either the\r
+       halLCD library or vApplicationSetupTimerInterrupt() to use a different\r
+       timer.  Timer A1 is used for the run time stats time base6. */\r
        halLcdInit();\r
-       halLcdBackLightInit();\r
-       halLcdSetBackLight( 0 );\r
        halLcdSetContrast( 100 );\r
        halLcdClearScreen();\r
        \r
        halLcdPrintLine( " www.FreeRTOS.org", 0,  OVERWRITE_TEXT );\r
-       \r
-while( ( halButtonsPressed() & BUTTON_UP ) == 0 );\r
-}\r
-/*-----------------------------------------------------------*/\r
-\r
-void vApplicationSetupTimerInterrupt( void )\r
-{\r
-const unsigned short usACLK_Frequency_Hz = 32768;\r
-\r
-       /* Ensure the timer is stopped. */\r
-       TA0CTL = 0;\r
-\r
-       /* Run the timer from the ACLK. */\r
-       TA0CTL = TASSEL_1;\r
-\r
-       /* Clear everything to start with. */\r
-       TA0CTL |= TACLR;\r
-\r
-       /* Set the compare match value according to the tick rate we want. */\r
-       TA0CCR0 = usACLK_Frequency_Hz / configTICK_RATE_HZ;\r
-\r
-       /* Enable the interrupts. */\r
-       TA0CCTL0 = CCIE;\r
-\r
-       /* Start up clean. */\r
-       TA0CTL |= TACLR;\r
-\r
-       /* Up mode. */\r
-       TA0CTL |= MC_1;\r
-}\r
-/*-----------------------------------------------------------*/\r
-\r
-void vApplicationMallocFailedHook( void )\r
-{\r
-       for( ;; );\r
-}\r
-/*-----------------------------------------------------------*/\r
-\r
-void vApplicationStackOverflowHook( xTaskHandle *pxTask, signed char *pcTaskName )\r
-{\r
-       ( void ) pxTask;\r
-       ( void ) pcTaskName;\r
-       \r
-       for( ;; );\r
-}\r
-/*-----------------------------------------------------------*/\r
-\r
-void vApplicationIdleHook( void )\r
-{\r
-       /* Want to leave the SMCLK running so the COMTest tasks don't fail. */\r
-       __bis_SR_register( LPM1_bits + GIE );\r
 }\r
 /*-----------------------------------------------------------*/\r
 \r
@@ -413,8 +491,8 @@ static xQueueMessage xStatusMessage = { mainMESSAGE_STATUS, pdPASS };
                        xStatusMessage.ulMessageValue = mainERROR_GEN_QUEUE_TEST;\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
+               /* Check the reg test tasks are still cycling.  They will stop\r
+               incrementing their loop counters if they encounter an error. */\r
                if( usRegTest1Counter == usLastRegTest1Counter )\r
                {\r
                        xStatusMessage.ulMessageValue = mainERROR_REG_TEST;\r
@@ -435,17 +513,18 @@ static xQueueMessage xStatusMessage = { mainMESSAGE_STATUS, pdPASS };
                ulCounter = 0;\r
        }\r
 \r
+       /* Just periodically toggle an LED to show that the tick interrupt is\r
+       running.  Note that this access LED_PORT_OUT in a non-atomic way, so tasks\r
+       that access the same port must do so from a critical section. */\r
        if( ( ulCounter & 0xff ) == 0 )\r
        {\r
                if( ( LED_PORT_OUT & LED_1 ) == 0 )\r
                {\r
                        LED_PORT_OUT |= LED_1;\r
-                       LED_PORT_OUT &= ~LED_2;\r
                }\r
                else\r
                {\r
                        LED_PORT_OUT &= ~LED_1;\r
-                       LED_PORT_OUT |= LED_2;\r
                }\r
        }\r
 }\r
@@ -473,46 +552,68 @@ portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
 }\r
 /*-----------------------------------------------------------*/\r
 \r
-void vConfigureTimerForRunTimeStats( void )\r
+/* The MSP430X port uses this callback function to configure its tick interrupt.\r
+This allows the application to choose the tick interrupt source.\r
+configTICK_INTERRUPT_VECTOR must also be set in FreeRTOSConfig.h to the correct\r
+interrupt vector for the chosen tick interrupt source.  This implementation of\r
+vApplicationSetupTimerInterrupt() generates the tick from timer A0, so in this\r
+case configTICK_INTERRUPT_VECTOR is set to TIMER0_A0_VECTOR. */\r
+void vApplicationSetupTimerInterrupt( void )\r
 {\r
+const unsigned short usACLK_Frequency_Hz = 32768;\r
+\r
        /* Ensure the timer is stopped. */\r
-       TA1CTL = 0;\r
+       TA0CTL = 0;\r
 \r
-       /* Run the timer from the ACLK/4. */\r
-       TA1CTL = TASSEL_1 | ID__4;\r
+       /* Run the timer from the ACLK. */\r
+       TA0CTL = TASSEL_1;\r
 \r
        /* Clear everything to start with. */\r
-       TA1CTL |= TACLR;\r
+       TA0CTL |= TACLR;\r
+\r
+       /* Set the compare match value according to the tick rate we want. */\r
+       TA0CCR0 = usACLK_Frequency_Hz / configTICK_RATE_HZ;\r
 \r
        /* Enable the interrupts. */\r
-       TA1CCTL0 = CCIE;\r
+       TA0CCTL0 = CCIE;\r
 \r
        /* Start up clean. */\r
-       TA1CTL |= TACLR;\r
+       TA0CTL |= TACLR;\r
 \r
-       /* Continuous mode. */\r
-       TA1CTL |= MC__CONTINOUS;\r
+       /* Up mode. */\r
+       TA0CTL |= MC_1;\r
 }\r
 /*-----------------------------------------------------------*/\r
 \r
-#pragma vector=TIMER1_A0_VECTOR\r
-static __interrupt void prvRunTimeStatsOverflowISR( void )\r
+void vApplicationIdleHook( void )\r
 {\r
-       ulStatsOverflowCount++;\r
+       /* Called on each iteration of the idle task.  In this case the idle task\r
+       just enters a low(ish) power mode. */\r
+       __bis_SR_register( LPM1_bits + GIE );\r
 }\r
 /*-----------------------------------------------------------*/\r
 \r
-inline unsigned long ulGetRunTimeStatsTime( void )\r
+void vApplicationMallocFailedHook( void )\r
 {\r
-unsigned long ulReturn;\r
+       /* Called if a call to pvPortMalloc() fails because there is insufficient\r
+       free memory available in the FreeRTOS heap.  pvPortMalloc() is called\r
+       internally by FreeRTOS API functions that create tasks, queues or\r
+       semaphores. */\r
+       taskDISABLE_INTERRUPTS();\r
+       for( ;; );\r
+}\r
+/*-----------------------------------------------------------*/\r
 \r
-       TA1CTL &= ~MC__CONTINOUS;\r
-       ulReturn = ( ( ulStatsOverflowCount << 16UL ) | ( unsigned long ) TA1R );\r
-       TA1CTL |= MC__CONTINOUS;\r
+void vApplicationStackOverflowHook( xTaskHandle *pxTask, signed char *pcTaskName )\r
+{\r
+       ( void ) pxTask;\r
+       ( void ) pcTaskName;\r
        \r
-       return ulReturn;\r
+       /* Run time stack overflow checking is performed if\r
+       configconfigCHECK_FOR_STACK_OVERFLOW is defined to 1 or 2.  This hook\r
+       function is called if a stack overflow is detected. */\r
+       taskDISABLE_INTERRUPTS();\r
+       for( ;; );\r
 }\r
-\r
-\r
-\r
+/*-----------------------------------------------------------*/\r
 \r
index 3e861f2f209004b1421130e065787df12a575e39..89ca091bd43ebd3c789fd82b43452459cebbf8f6 100644 (file)
 \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
+ * This is not a proper UART driver.  It only supports one port, uses loopback\r
+ * mode, and is used to test interrupts that use the FreeRTOS API as part of \r
+ * a wider test suite.  Nor is it intended to show an efficient implementation\r
+ * of a UART interrupt service routine as queues are used to pass individual\r
+ * characters one at a time!\r
  */\r
 \r
 /* Standard includes. */\r
@@ -70,9 +72,6 @@
 /* Demo application includes. */\r
 #include "serial.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
@@ -123,9 +122,8 @@ unsigned portLONG ulBaudRateCount;
        }\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
+       /* Note the comments at the top of this file about this not being a generic\r
+       UART driver. */\r
        return NULL;\r
 }\r
 /*-----------------------------------------------------------*/\r
@@ -149,6 +147,9 @@ signed portBASE_TYPE xSerialPutChar( xComPortHandle pxPort, signed portCHAR cOut
 {\r
 signed portBASE_TYPE xReturn;\r
 \r
+       /* Send the next character to the queue of characters waiting transmission,\r
+       then enable the UART Tx interrupt, just in case UART transmission has already\r
+       completed and switched itself off. */\r
        xReturn = xQueueSend( xCharsForTx, &cOutChar, xBlockTime );\r
        UCA1IE |= UCTXIE;\r
 \r
@@ -190,6 +191,14 @@ portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
        }\r
 \r
        __bic_SR_register_on_exit( SCG1 + SCG0 + OSCOFF + CPUOFF );\r
+       \r
+       /* If writing to a queue 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
+       \r
+       THIS MUST BE THE LAST THING DONE IN THE ISR. */ \r
        portYIELD_FROM_ISR( xHigherPriorityTaskWoken );\r
 }\r
 \r
index f81cb106b76ff051f2988bd344cc66235d768dd3..ebf6bdf2071fe48ab2ae155641ee65c3b9ed757f 100644 (file)
         \r
         \r
       <PreferedWindows><Position>2</Position><ScreenPosX>0</ScreenPosX><ScreenPosY>0</ScreenPosY><Windows/></PreferedWindows><MixedMode>1</MixedMode><CodeCovShow>1</CodeCovShow><InstrProfShow>1</InstrProfShow></Disassembly>\r
-    <Register><PreferedWindows><Position>2</Position><ScreenPosX>0</ScreenPosX><ScreenPosY>0</ScreenPosY><Windows/></PreferedWindows></Register><Memory><PreferedWindows><Position>3</Position><ScreenPosX>0</ScreenPosX><ScreenPosY>0</ScreenPosY><Windows/></PreferedWindows><FindDirection>1</FindDirection><FindAsHex>0</FindAsHex></Memory><Watch><Format><struct_types/><watch_formats><Fmt><Key>{W}Watch-0:TA1CTL</Key><Value>4</Value></Fmt><Fmt><Key>{W}Watch-0:ulSP_PC_Combined</Key><Value>4</Value></Fmt></watch_formats></Format><PreferedWindows><Position>3</Position><ScreenPosX>0</ScreenPosX><ScreenPosY>0</ScreenPosY><Windows/></PreferedWindows><Column0>134</Column0><Column1>139</Column1><Column2>124</Column2><Column3>100</Column3></Watch><Breakpoints><PreferedWindows><Position>3</Position><ScreenPosX>0</ScreenPosX><ScreenPosY>0</ScreenPosY><Windows><Window><Factory>Debug-Log</Factory></Window></Windows></PreferedWindows></Breakpoints><TASKVIEW><PreferedWindows><Position>3</Position><ScreenPosX>0</ScreenPosX><ScreenPosY>0</ScreenPosY><Windows/></PreferedWindows><Column0>200</Column0><Column1>100</Column1><Column2>100</Column2><Column3>100</Column3><Column4>100</Column4><Column5>100</Column5><Column6>100</Column6><Column7>150</Column7></TASKVIEW><TerminalIO><InputSource>1</InputSource><InputMode>10</InputMode><Filename>$PROJ_DIR$\TermIOInput.txt</Filename><InputEcho>1</InputEcho><ShowReset>0</ShowReset></TerminalIO><DeviceInformationWindow><PreferedWindows><Position>3</Position><ScreenPosX>0</ScreenPosX><ScreenPosY>0</ScreenPosY><Windows/></PreferedWindows><Column0>150</Column0><Column1>150</Column1></DeviceInformationWindow><StateStorageDialog><PreferedWindows><Position>3</Position><ScreenPosX>0</ScreenPosX><ScreenPosY>0</ScreenPosY><Windows/></PreferedWindows></StateStorageDialog><SequencerDialog><PreferedWindows><Position>3</Position><ScreenPosX>0</ScreenPosX><ScreenPosY>0</ScreenPosY><Windows/></PreferedWindows><SequencerMask>0</SequencerMask><Advanced>0</Advanced></SequencerDialog></Static>\r
+    <Register><PreferedWindows><Position>2</Position><ScreenPosX>0</ScreenPosX><ScreenPosY>0</ScreenPosY><Windows/></PreferedWindows></Register><Memory><PreferedWindows><Position>3</Position><ScreenPosX>0</ScreenPosX><ScreenPosY>0</ScreenPosY><Windows/></PreferedWindows><FindDirection>1</FindDirection><FindAsHex>0</FindAsHex></Memory><Watch><Format><struct_types/><watch_formats><Fmt><Key>{W}Watch-0:TA1CTL</Key><Value>4</Value></Fmt><Fmt><Key>{W}Watch-0:ulSP_PC_Combined</Key><Value>4</Value></Fmt></watch_formats></Format><PreferedWindows><Position>3</Position><ScreenPosX>0</ScreenPosX><ScreenPosY>0</ScreenPosY><Windows/></PreferedWindows><Column0>134</Column0><Column1>139</Column1><Column2>124</Column2><Column3>100</Column3></Watch><Breakpoints><PreferedWindows><Position>3</Position><ScreenPosX>0</ScreenPosX><ScreenPosY>0</ScreenPosY><Windows><Window><Factory>Debug-Log</Factory></Window></Windows></PreferedWindows></Breakpoints><TASKVIEW><PreferedWindows><Position>3</Position><ScreenPosX>0</ScreenPosX><ScreenPosY>0</ScreenPosY><Windows/></PreferedWindows><Column0>200</Column0><Column1>100</Column1><Column2>100</Column2><Column3>100</Column3><Column4>100</Column4><Column5>100</Column5><Column6>100</Column6><Column7>150</Column7></TASKVIEW><TerminalIO><InputSource>1</InputSource><InputMode>10</InputMode><Filename>$PROJ_DIR$\TermIOInput.txt</Filename><InputEcho>1</InputEcho><ShowReset>0</ShowReset></TerminalIO><DeviceInformationWindow><PreferedWindows><Position>3</Position><ScreenPosX>0</ScreenPosX><ScreenPosY>0</ScreenPosY><Windows/></PreferedWindows><Column0>150</Column0><Column1>150</Column1></DeviceInformationWindow><StateStorageDialog><PreferedWindows><Position>3</Position><ScreenPosX>0</ScreenPosX><ScreenPosY>0</ScreenPosY><Windows/></PreferedWindows></StateStorageDialog><SequencerDialog><PreferedWindows><Position>3</Position><ScreenPosX>0</ScreenPosX><ScreenPosY>0</ScreenPosY><Windows/></PreferedWindows><SequencerMask>0</SequencerMask><Advanced>0</Advanced></SequencerDialog><CallStack><PreferedWindows><Position>1</Position><ScreenPosX>0</ScreenPosX><ScreenPosY>0</ScreenPosY><Windows/></PreferedWindows><ViewArgs>1</ViewArgs></CallStack></Static>\r
     <Windows>\r
       \r
       \r
       \r
-    <Wnd1>\r
+    <Wnd0>\r
         <Tabs>\r
           <Tab>\r
             <Identity>TabID-11539-27703</Identity>\r
             <Factory>Workspace</Factory>\r
             <Session>\r
               \r
-            <NodeDict><ExpandedNode>RTOSDemo</ExpandedNode></NodeDict></Session>\r
+            <NodeDict><ExpandedNode>RTOSDemo</ExpandedNode><ExpandedNode>RTOSDemo/FreeRTOS_Source</ExpandedNode><ExpandedNode>RTOSDemo/FreeRTOS_Source/Portable</ExpandedNode></NodeDict></Session>\r
           </Tab>\r
         </Tabs>\r
         \r
-      <SelectedTab>0</SelectedTab></Wnd1><Wnd2><Tabs><Tab><Identity>TabID-12395-27916</Identity><TabName>Terminal I/O</TabName><Factory>TerminalIO</Factory><Session/></Tab></Tabs><SelectedTab>0</SelectedTab></Wnd2><Wnd4><Tabs><Tab><Identity>TabID-25408-8444</Identity><TabName>Tasks</TabName><Factory>TASKVIEW</Factory><Session/></Tab></Tabs><SelectedTab>0</SelectedTab></Wnd4></Windows>\r
+      <SelectedTab>0</SelectedTab></Wnd0><Wnd1><Tabs><Tab><Identity>TabID-12395-27916</Identity><TabName>Terminal I/O</TabName><Factory>TerminalIO</Factory><Session/></Tab></Tabs><SelectedTab>0</SelectedTab></Wnd1><Wnd3><Tabs><Tab><Identity>TabID-28694-31512</Identity><TabName>Debug Log</TabName><Factory>Debug-Log</Factory><Session/></Tab></Tabs><SelectedTab>0</SelectedTab></Wnd3></Windows>\r
     <Editor>\r
       \r
       \r
       \r
       \r
-    <Pane><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\MSP-EXP430F5438_HAL\hal_lcd.c</Filename><XPos>0</XPos><YPos>809</YPos><SelStart>27981</SelStart><SelEnd>27996</SelEnd></Tab><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\main.c</Filename><XPos>0</XPos><YPos>353</YPos><SelStart>13834</SelStart><SelEnd>13834</SelEnd></Tab><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\..\..\Source\queue.c</Filename><XPos>0</XPos><YPos>451</YPos><SelStart>19345</SelStart><SelEnd>19345</SelEnd></Tab><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\FreeRTOSConfig.h</Filename><XPos>0</XPos><YPos>54</YPos><SelStart>3921</SelStart><SelEnd>3921</SelEnd></Tab><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\lnk430F5438A_mod.xcl</Filename><XPos>0</XPos><YPos>177</YPos><SelStart>5081</SelStart><SelEnd>5081</SelEnd></Tab><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\..\..\Source\tasks.c</Filename><XPos>0</XPos><YPos>1590</YPos><SelStart>50218</SelStart><SelEnd>50218</SelEnd></Tab><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\..\..\Source\portable\IAR\MSP430X\port.c</Filename><XPos>0</XPos><YPos>163</YPos><SelStart>7271</SelStart><SelEnd>7271</SelEnd></Tab><ActiveTab>6</ActiveTab></Pane><ActivePane>0</ActivePane><Sizes><Pane><X>1000000</X><Y>1000000</Y></Pane></Sizes><SplitMode>1</SplitMode></Editor>\r
+    <Pane><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\main.c</Filename><XPos>0</XPos><YPos>237</YPos><SelStart>12630</SelStart><SelEnd>12630</SelEnd></Tab><ActiveTab>0</ActiveTab></Pane><ActivePane>0</ActivePane><Sizes><Pane><X>1000000</X><Y>1000000</Y></Pane></Sizes><SplitMode>1</SplitMode></Editor>\r
     <Positions>\r
       \r
       \r
       \r
       \r
       \r
-    <Top><Row0><Sizes><Toolbar-012aad68><key>iaridepm.enu1</key></Toolbar-012aad68><Toolbar-0917a2f0><key>430fet1</key></Toolbar-0917a2f0></Sizes></Row0><Row1><Sizes><Toolbar-078c7038><key>debuggergui.enu1</key></Toolbar-078c7038></Sizes></Row1><Row2><Sizes/></Row2><Row3><Sizes/></Row3><Row4><Sizes/></Row4><Row5><Sizes/></Row5><Row6><Sizes/></Row6><Row7><Sizes/></Row7><Row8><Sizes/></Row8><Row9><Sizes/></Row9><Row10><Sizes/></Row10></Top><Left><Row0><Sizes><Wnd1><Rect><Top>-2</Top><Left>-2</Left><Bottom>532</Bottom><Right>321</Right><x>-2</x><y>-2</y><xscreen>121</xscreen><yscreen>150</yscreen><sizeHorzCX>72024</sizeHorzCX><sizeHorzCY>152749</sizeHorzCY><sizeVertCX>192262</sizeVertCX><sizeVertCY>543788</sizeVertCY></Rect></Wnd1></Sizes></Row0></Left><Right><Row0><Sizes><Wnd2><Rect><Top>-2</Top><Left>-2</Left><Bottom>532</Bottom><Right>399</Right><x>-2</x><y>-2</y><xscreen>121</xscreen><yscreen>150</yscreen><sizeHorzCX>72024</sizeHorzCX><sizeHorzCY>152749</sizeHorzCY><sizeVertCX>238690</sizeVertCX><sizeVertCY>543788</sizeVertCY></Rect></Wnd2></Sizes></Row0></Right><Bottom><Row0><Sizes><Wnd4><Rect><Top>-2</Top><Left>-2</Left><Bottom>382</Bottom><Right>1682</Right><x>-2</x><y>-2</y><xscreen>1684</xscreen><yscreen>384</yscreen><sizeHorzCX>1002381</sizeHorzCX><sizeHorzCY>391039</sizeHorzCY><sizeVertCX>119048</sizeVertCX><sizeVertCY>203666</sizeVertCY></Rect></Wnd4></Sizes></Row0></Bottom><Float><Sizes/></Float></Positions>\r
+    <Top><Row0><Sizes><Toolbar-012aad68><key>iaridepm.enu1</key></Toolbar-012aad68><Toolbar-091d9c00><key>430fet1</key></Toolbar-091d9c00></Sizes></Row0><Row1><Sizes><Toolbar-0695a348><key>debuggergui.enu1</key></Toolbar-0695a348></Sizes></Row1><Row2><Sizes/></Row2><Row3><Sizes/></Row3><Row4><Sizes/></Row4><Row5><Sizes/></Row5><Row6><Sizes/></Row6><Row7><Sizes/></Row7><Row8><Sizes/></Row8><Row9><Sizes/></Row9><Row10><Sizes/></Row10><Row11><Sizes/></Row11><Row12><Sizes/></Row12><Row13><Sizes/></Row13><Row14><Sizes/></Row14><Row15><Sizes/></Row15><Row16><Sizes/></Row16><Row17><Sizes/></Row17><Row18><Sizes/></Row18><Row19><Sizes/></Row19><Row20><Sizes/></Row20><Row21><Sizes/></Row21><Row22><Sizes/></Row22><Row23><Sizes/></Row23><Row24><Sizes/></Row24><Row25><Sizes/></Row25><Row26><Sizes/></Row26><Row27><Sizes/></Row27><Row28><Sizes/></Row28><Row29><Sizes/></Row29><Row30><Sizes/></Row30><Row31><Sizes/></Row31><Row32><Sizes/></Row32><Row33><Sizes/></Row33><Row34><Sizes/></Row34><Row35><Sizes/></Row35><Row36><Sizes/></Row36><Row37><Sizes/></Row37><Row38><Sizes/></Row38><Row39><Sizes/></Row39><Row40><Sizes/></Row40><Row41><Sizes/></Row41><Row42><Sizes/></Row42></Top><Left><Row0><Sizes><Wnd0><Rect><Top>-2</Top><Left>-2</Left><Bottom>716</Bottom><Right>321</Right><x>-2</x><y>-2</y><xscreen>121</xscreen><yscreen>150</yscreen><sizeHorzCX>72024</sizeHorzCX><sizeHorzCY>152749</sizeHorzCY><sizeVertCX>192262</sizeVertCX><sizeVertCY>731161</sizeVertCY></Rect></Wnd0></Sizes></Row0></Left><Right><Row0><Sizes><Wnd1><Rect><Top>-2</Top><Left>-2</Left><Bottom>716</Bottom><Right>399</Right><x>-2</x><y>-2</y><xscreen>121</xscreen><yscreen>150</yscreen><sizeHorzCX>72024</sizeHorzCX><sizeHorzCY>152749</sizeHorzCY><sizeVertCX>238690</sizeVertCX><sizeVertCY>731161</sizeVertCY></Rect></Wnd1></Sizes></Row0></Right><Bottom><Row0><Sizes><Wnd3><Rect><Top>-2</Top><Left>-2</Left><Bottom>198</Bottom><Right>1682</Right><x>-2</x><y>-2</y><xscreen>1684</xscreen><yscreen>200</yscreen><sizeHorzCX>1002381</sizeHorzCX><sizeHorzCY>203666</sizeHorzCY><sizeVertCX>119048</sizeVertCX><sizeVertCY>203666</sizeVertCY></Rect></Wnd3></Sizes></Row0></Bottom><Float><Sizes/></Float></Positions>\r
   </Desktop>\r
 </Project>\r
 \r
index a2dda48c2aa8d75892044f5f10a48ec0b2dc0fe7..10b76323cf562cff7c1d1056169ed0b32ffdf3d2 100644 (file)
@@ -1,5 +1,5 @@
 [DebugChecksum]\r
-Checksum=-802929519\r
+Checksum=283457804\r
 [DisAssemblyWindow]\r
 NumStates=_ 1\r
 State 1=_ 1\r
@@ -14,7 +14,7 @@ Control Register=0
 NextState0=0\r
 NextState1=0\r
 [Action Register]\r
-Break=1\r
+Break=6\r
 State Storage=0\r
 [Profiling]\r
 Enabled=0\r
@@ -28,6 +28,10 @@ UseTrigger=1
 TriggerName=main\r
 LimitSize=0\r
 ByteLimit=50\r
+[Log file]\r
+LoggingEnabled=_ 0\r
+LogFile=_ ""\r
+Category=_ 0\r
 [TermIOLog]\r
 LoggingEnabled=_ 0\r
 LogFile=_ ""\r
@@ -35,13 +39,9 @@ LogFile=_ ""
 Enabled=0\r
 [DriverProfiling]\r
 Enabled=0\r
-Mode=303237632\r
+Mode=123810376\r
 Graph=0\r
 Symbiont=0\r
-[Log file]\r
-LoggingEnabled=_ 0\r
-LogFile=_ ""\r
-Category=_ 0\r
 [Breakpoints]\r
 Count=0\r
 [FET]\r
index 1d55954a96a5c62f77ed8cc1b70eb782a40813c3..35acd8698b80514cd7f05c2d1715334fa297a614 100644 (file)
@@ -3,7 +3,7 @@
 <Workspace>\r
   <ConfigDictionary>\r
     \r
-  <CurrentConfigs><Project>RTOSDemo/Release</Project></CurrentConfigs></ConfigDictionary>\r
+  <CurrentConfigs><Project>RTOSDemo/Debug</Project></CurrentConfigs></ConfigDictionary>\r
   <Desktop>\r
     <Static>\r
       <Workspace>\r
@@ -33,7 +33,7 @@
             <Factory>Workspace</Factory>\r
             <Session>\r
               \r
-            <NodeDict><ExpandedNode>RTOSDemo</ExpandedNode><ExpandedNode>RTOSDemo/F5XX_6XX_Core_Lib</ExpandedNode><ExpandedNode>RTOSDemo/MSP-EXP430F5438_HAL</ExpandedNode><ExpandedNode>RTOSDemo/Output</ExpandedNode><ExpandedNode>RTOSDemo/UserExperienceDemo</ExpandedNode></NodeDict></Session>\r
+            <NodeDict><ExpandedNode>RTOSDemo</ExpandedNode><ExpandedNode>RTOSDemo/UserExperienceDemo</ExpandedNode></NodeDict></Session>\r
           </Tab>\r
         </Tabs>\r
         \r
       \r
       \r
       \r
-    <Pane><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\MSP-EXP430F5438_HAL\hal_lcd.c</Filename><XPos>0</XPos><YPos>809</YPos><SelStart>27981</SelStart><SelEnd>27996</SelEnd></Tab><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\main.c</Filename><XPos>0</XPos><YPos>353</YPos><SelStart>13834</SelStart><SelEnd>13834</SelEnd></Tab><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\..\..\Source\queue.c</Filename><XPos>0</XPos><YPos>451</YPos><SelStart>19345</SelStart><SelEnd>19345</SelEnd></Tab><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\FreeRTOSConfig.h</Filename><XPos>0</XPos><YPos>54</YPos><SelStart>3921</SelStart><SelEnd>3921</SelEnd></Tab><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\lnk430F5438A_mod.xcl</Filename><XPos>0</XPos><YPos>177</YPos><SelStart>5081</SelStart><SelEnd>5081</SelEnd></Tab><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\..\..\Source\tasks.c</Filename><XPos>0</XPos><YPos>1590</YPos><SelStart>50218</SelStart><SelEnd>50218</SelEnd></Tab><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\..\..\Source\portable\IAR\MSP430X\port.c</Filename><XPos>0</XPos><YPos>163</YPos><SelStart>7271</SelStart><SelEnd>7271</SelEnd></Tab><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\MSP-EXP430F5438_HAL\hal_MSP-EXP430F5438.h</Filename><XPos>0</XPos><YPos>0</YPos><SelStart>669</SelStart><SelEnd>669</SelEnd></Tab><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\MSP-EXP430F5438_HAL\hal_board.c</Filename><XPos>0</XPos><YPos>44</YPos><SelStart>1725</SelStart><SelEnd>1725</SelEnd></Tab><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\serial.c</Filename><XPos>0</XPos><YPos>83</YPos><SelStart>4515</SelStart><SelEnd>4515</SelEnd></Tab><ActiveTab>9</ActiveTab></Pane><ActivePane>0</ActivePane><Sizes><Pane><X>1000000</X><Y>1000000</Y></Pane></Sizes><SplitMode>1</SplitMode></Editor>\r
+    <Pane><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\main.c</Filename><XPos>0</XPos><YPos>42</YPos><SelStart>11777</SelStart><SelEnd>11777</SelEnd></Tab><ActiveTab>0</ActiveTab></Pane><ActivePane>0</ActivePane><Sizes><Pane><X>1000000</X><Y>1000000</Y></Pane></Sizes><SplitMode>1</SplitMode></Editor>\r
     <Positions>\r
       \r
       \r
       \r
       \r
       \r
-    <Top><Row0><Sizes><Toolbar-012aad68><key>iaridepm.enu1</key></Toolbar-012aad68></Sizes></Row0></Top><Left><Row0><Sizes><Wnd0><Rect><Top>-2</Top><Left>-2</Left><Bottom>645</Bottom><Right>475</Right><x>-2</x><y>-2</y><xscreen>331</xscreen><yscreen>267</yscreen><sizeHorzCX>197024</sizeHorzCX><sizeHorzCY>271894</sizeHorzCY><sizeVertCX>283929</sizeVertCX><sizeVertCY>658859</sizeVertCY></Rect></Wnd0></Sizes></Row0></Left><Right><Row0><Sizes/></Row0></Right><Bottom><Row0><Sizes><Wnd1><Rect><Top>-2</Top><Left>-2</Left><Bottom>293</Bottom><Right>1682</Right><x>-2</x><y>-2</y><xscreen>1684</xscreen><yscreen>295</yscreen><sizeHorzCX>1002381</sizeHorzCX><sizeHorzCY>300407</sizeHorzCY><sizeVertCX>197024</sizeVertCX><sizeVertCY>271894</sizeVertCY></Rect></Wnd1></Sizes></Row0></Bottom><Float><Sizes/></Float></Positions>\r
+    <Top><Row0><Sizes><Toolbar-012aad68><key>iaridepm.enu1</key></Toolbar-012aad68></Sizes></Row0><Row1><Sizes/></Row1><Row2><Sizes/></Row2><Row3><Sizes/></Row3><Row4><Sizes/></Row4><Row5><Sizes/></Row5><Row6><Sizes/></Row6><Row7><Sizes/></Row7><Row8><Sizes/></Row8><Row9><Sizes/></Row9><Row10><Sizes/></Row10><Row11><Sizes/></Row11><Row12><Sizes/></Row12><Row13><Sizes/></Row13><Row14><Sizes/></Row14><Row15><Sizes/></Row15><Row16><Sizes/></Row16><Row17><Sizes/></Row17><Row18><Sizes/></Row18><Row19><Sizes/></Row19><Row20><Sizes/></Row20><Row21><Sizes/></Row21><Row22><Sizes/></Row22><Row23><Sizes/></Row23><Row24><Sizes/></Row24><Row25><Sizes/></Row25><Row26><Sizes/></Row26><Row27><Sizes/></Row27><Row28><Sizes/></Row28><Row29><Sizes/></Row29><Row30><Sizes/></Row30><Row31><Sizes/></Row31><Row32><Sizes/></Row32><Row33><Sizes/></Row33><Row34><Sizes/></Row34><Row35><Sizes/></Row35><Row36><Sizes/></Row36><Row37><Sizes/></Row37><Row38><Sizes/></Row38><Row39><Sizes/></Row39><Row40><Sizes/></Row40><Row41><Sizes/></Row41><Row42><Sizes/></Row42><Row43><Sizes/></Row43><Row44><Sizes/></Row44><Row45><Sizes/></Row45><Row46><Sizes/></Row46></Top><Left><Row0><Sizes><Wnd0><Rect><Top>-2</Top><Left>-2</Left><Bottom>645</Bottom><Right>475</Right><x>-2</x><y>-2</y><xscreen>331</xscreen><yscreen>267</yscreen><sizeHorzCX>197024</sizeHorzCX><sizeHorzCY>271894</sizeHorzCY><sizeVertCX>283929</sizeVertCX><sizeVertCY>658859</sizeVertCY></Rect></Wnd0></Sizes></Row0></Left><Right><Row0><Sizes/></Row0></Right><Bottom><Row0><Sizes><Wnd1><Rect><Top>-2</Top><Left>-2</Left><Bottom>293</Bottom><Right>1682</Right><x>-2</x><y>-2</y><xscreen>1684</xscreen><yscreen>295</yscreen><sizeHorzCX>1002381</sizeHorzCX><sizeHorzCY>300407</sizeHorzCY><sizeVertCX>197024</sizeVertCX><sizeVertCY>271894</sizeVertCY></Rect></Wnd1></Sizes></Row0></Bottom><Float><Sizes/></Float></Positions>\r
   </Desktop>\r
 </Workspace>\r
 \r