]> git.sur5r.net Git - freertos/blobdiff - Demo/lwIP_MCF5235_GCC/demo.c
Comment the new MicroBlaze port layer files.
[freertos] / Demo / lwIP_MCF5235_GCC / demo.c
index c9f8e23eea669cbf3bde7cbf519a456bc76a3bbd..f8371c309ef8bdd2e569878ce9aee7f9495d81a0 100644 (file)
-/*
-    FreeRTOS V4.1.0 - copyright (C) 2003-2006 Richard Barry.
-    MCF5235 Port - Copyright (C) 2006 Christian Walter.
-
-    This file is part of the FreeRTOS distribution.
-
-    FreeRTOS is free software; you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation; either version 2 of the License, or
-    (at your option) any later version.
-
-    FreeRTOS is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with FreeRTOS; if not, write to the Free Software
-    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
-
-    A special exception to the GPL can be applied should you wish to distribute
-    a combined work that includes FreeRTOS, without being obliged to provide
-    the source code for any proprietary components.  See the licensing section
-    of http://www.FreeRTOS.org for full details of how and when the exception
-    can be applied.
-
-    ***************************************************************************
-    See http://www.FreeRTOS.org for documentation, latest information, license
-    and contact details.  Please ensure to read the configuration and relevant
-    port sections of the online documentation.\r
-\r
-       Also see http://www.SafeRTOS.com for an IEC 61508 compliant version along\r
-       with commercial development and support options.
-    ***************************************************************************
-*/
-
-/* ------------------------ System includes ------------------------------- */
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <assert.h>
-
-/* ------------------------ FreeRTOS includes ----------------------------- */
-#include "FreeRTOS.h"
-#include "task.h"
-
-/* ------------------------ LWIP includes --------------------------------- */
-#include "lwip/api.h"
-#include "lwip/tcpip.h"
-#include "lwip/memp.h"
-
-/* ------------------------ Project includes ------------------------------ */
-#include "mcf5xxx.h"
-#include "mcf523x.h"
-#include "serial.h"
-
-#include "web.h"
-#include "integer.h"
-#include "PollQ.h"
-#include "semtest.h"
-#include "BlockQ.h"
-#include "dynamic.h"
-#include "flop.h"
-
-/* ------------------------ Defines --------------------------------------- */
-#define mainCOM_TEST_BAUD_RATE      ( ( unsigned portLONG ) 38400 )
-
-/* Priorities for the demo application tasks. */
-#define mainLED_TASK_PRIORITY       ( tskIDLE_PRIORITY + 3 )
-#define mainCOM_TEST_PRIORITY       ( tskIDLE_PRIORITY + 2 )
-#define mainQUEUE_POLL_PRIORITY     ( tskIDLE_PRIORITY + 2 )
-#define mainCHECK_TASK_PRIORITY     ( tskIDLE_PRIORITY + 4 )
-#define mainSEM_TEST_PRIORITY       ( tskIDLE_PRIORITY + 1 )
-#define mainBLOCK_Q_PRIORITY        ( tskIDLE_PRIORITY + 2 )
-#define mainWEB_TASK_PRIORITY       ( tskIDLE_PRIORITY + 3 )
-#define STACK_DEFAULT               ( 1024 )
-
-/* Interval in which tasks are checked. */
-#define mainCHECK_PERIOD            ( ( portTickType ) 2000 / portTICK_RATE_MS  )
-
-/* Constants used by the vMemCheckTask() task. */
-#define mainCOUNT_INITIAL_VALUE     ( ( unsigned portLONG ) 0 )
-#define mainNO_TASK                 ( 0 )
-
-/* The size of the memory blocks allocated by the vMemCheckTask() task. */
-#define mainMEM_CHECK_SIZE_1        ( ( size_t ) 51 )
-#define mainMEM_CHECK_SIZE_2        ( ( size_t ) 52 )
-#define mainMEM_CHECK_SIZE_3        ( ( size_t ) 151 )
-
-/* ------------------------ Static variables ------------------------------ */
-xComPortHandle  xSTDComPort = NULL;
-
-/* ------------------------ Static functions ------------------------------ */
-static          portTASK_FUNCTION( vErrorChecks, pvParameters );
-static portLONG prvCheckOtherTasksAreStillRunning( unsigned portLONG
-                                                   ulMemCheckTaskCount );
-static          portTASK_FUNCTION( vMemCheckTask, pvParameters );
-
-/* ------------------------ Implementation -------------------------------- */
-int
-main( int argc, char *argv[] )
-{
-    asm volatile    ( "move.w  #0x2000, %sr\n\t" );
-
-    xSTDComPort = xSerialPortInitMinimal( 38400, 8 );
-    vlwIPInit(  );
-
-    /* Start the demo/test application tasks. */
-    vStartIntegerMathTasks( tskIDLE_PRIORITY );
-    vStartPolledQueueTasks( mainQUEUE_POLL_PRIORITY );
-    //vStartMathTasks( tskIDLE_PRIORITY );
-    vStartSemaphoreTasks( mainSEM_TEST_PRIORITY );
-    vStartDynamicPriorityTasks(  );
-    vStartBlockingQueueTasks( mainBLOCK_Q_PRIORITY );
-
-    /* Start the webserver. */
-    ( void )sys_thread_new( vBasicWEBServer, NULL, mainWEB_TASK_PRIORITY );
-
-    /* Start the check task - which is defined in this file. */
-    xTaskCreate( vErrorChecks, ( signed portCHAR * )"Check", 512, NULL,
-                 mainCHECK_TASK_PRIORITY, NULL );
-        /* Now all the tasks have been started - start the scheduler. */
-    vTaskStartScheduler(  );
-
-    /* Should never get here! */
-    return 0;
-}
-
-static
-portTASK_FUNCTION( vErrorChecks, pvParameters )
-{
-    unsigned portLONG ulMemCheckTaskRunningCount;
-    xTaskHandle     xCreatedTask;
-
-    /* The parameters are not used in this function. */
-    ( void )pvParameters;
-
-    for( ;; )
-    {
-        ulMemCheckTaskRunningCount = mainCOUNT_INITIAL_VALUE;
-        xCreatedTask = mainNO_TASK;
-        if( xTaskCreate( vMemCheckTask, ( signed portCHAR * )"MEM",
-                         configMINIMAL_STACK_SIZE, ( void * )&ulMemCheckTaskRunningCount,
-                         tskIDLE_PRIORITY, &xCreatedTask ) != pdPASS )
-        {
-            xSerialPutChar( xSTDComPort, 'E', portMAX_DELAY );
-        }
-        /* Delay until it is time to execute again. */
-        vTaskDelay( mainCHECK_PERIOD );
-
-        /* Delete the dynamically created task. */
-        if( xCreatedTask != mainNO_TASK )
-        {
-            vTaskDelete( xCreatedTask );
-        }
-
-        if( prvCheckOtherTasksAreStillRunning( ulMemCheckTaskRunningCount ) != pdPASS )
-        {
-            xSerialPutChar( xSTDComPort, 'E', portMAX_DELAY );
-        }
-        else
-        {
-            xSerialPutChar( xSTDComPort, '.', portMAX_DELAY );
-        }
-    }
-}
-
-static portLONG
-prvCheckOtherTasksAreStillRunning( unsigned portLONG ulMemCheckTaskCount )
-{
-    portLONG        lReturn = ( portLONG ) pdPASS;
-
-    /* Check all the demo tasks (other than the flash tasks) to ensure
-     * that they are all still running, and that none of them have detected
-     * an error.
-     */
-    if( xAreIntegerMathsTaskStillRunning(  ) != pdTRUE )
-    {
-        lReturn = ( portLONG ) pdFAIL;
-    }
-
-    if( xArePollingQueuesStillRunning(  ) != pdTRUE )
-    {
-        lReturn = ( portLONG ) pdFAIL;
-    }
-
-    if( xAreSemaphoreTasksStillRunning(  ) != pdTRUE )
-    {
-        lReturn = ( portLONG ) pdFAIL;
-    }
-
-    if( xAreDynamicPriorityTasksStillRunning(  ) != pdTRUE )
-    {
-        lReturn = ( portLONG ) pdFAIL;
-    }
-
-    if( xAreBlockingQueuesStillRunning(  ) != pdTRUE )
-    {
-        lReturn = ( portLONG ) pdFAIL;
-    }
-
-    if( ulMemCheckTaskCount == mainCOUNT_INITIAL_VALUE )
-    {
-        /* The vMemCheckTask did not increment the counter - it must
-         * have failed.
-         */
-        lReturn = ( portLONG ) pdFAIL;
-    }
-    return lReturn;
-}
-
-static void
-vMemCheckTask( void *pvParameters )
-{
-    unsigned portLONG *pulMemCheckTaskRunningCounter;
-    void           *pvMem1, *pvMem2, *pvMem3;
-    static portLONG lErrorOccurred = pdFALSE;
-
-    /* This task is dynamically created then deleted during each cycle of the
-       vErrorChecks task to check the operation of the memory allocator.  Each time
-       the task is created memory is allocated for the stack and TCB.  Each time
-       the task is deleted this memory is returned to the heap.  This task itself
-       exercises the allocator by allocating and freeing blocks.
-
-       The task executes at the idle priority so does not require a delay.
-
-       pulMemCheckTaskRunningCounter is incremented each cycle to indicate to the
-       vErrorChecks() task that this task is still executing without error. */
-
-    pulMemCheckTaskRunningCounter = ( unsigned portLONG * )pvParameters;
-
-    for( ;; )
-    {
-        if( lErrorOccurred == pdFALSE )
-        {
-            /* We have never seen an error so increment the counter. */
-            ( *pulMemCheckTaskRunningCounter )++;
-        }
-
-        /* Allocate some memory - just to give the allocator some extra
-           exercise.  This has to be in a critical section to ensure the
-           task does not get deleted while it has memory allocated. */
-        vTaskSuspendAll(  );
-        {
-            pvMem1 = pvPortMalloc( mainMEM_CHECK_SIZE_1 );
-            if( pvMem1 == NULL )
-            {
-                lErrorOccurred = pdTRUE;
-            }
-            else
-            {
-                memset( pvMem1, 0xaa, mainMEM_CHECK_SIZE_1 );
-                vPortFree( pvMem1 );
-            }
-        }
-        xTaskResumeAll(  );
-
-        /* Again - with a different size block. */
-        vTaskSuspendAll(  );
-        {
-            pvMem2 = pvPortMalloc( mainMEM_CHECK_SIZE_2 );
-            if( pvMem2 == NULL )
-            {
-                lErrorOccurred = pdTRUE;
-            }
-            else
-            {
-                memset( pvMem2, 0xaa, mainMEM_CHECK_SIZE_2 );
-                vPortFree( pvMem2 );
-            }
-        }
-        xTaskResumeAll(  );
-
-        /* Again - with a different size block. */
-        vTaskSuspendAll(  );
-        {
-            pvMem3 = pvPortMalloc( mainMEM_CHECK_SIZE_3 );
-            if( pvMem3 == NULL )
-            {
-                lErrorOccurred = pdTRUE;
-            }
-            else
-            {
-                memset( pvMem3, 0xaa, mainMEM_CHECK_SIZE_3 );
-                vPortFree( pvMem3 );
-            }
-        }
-        xTaskResumeAll(  );
-    }
-}
+/*\r
+    FreeRTOS V4.6.1 - copyright (C) 2003-2006 Richard Barry.\r
+    MCF5235 Port - Copyright (C) 2006 Christian Walter.\r
+\r
+    This file is part of the FreeRTOS distribution.\r
+\r
+    FreeRTOS is free software; you can redistribute it and/or modify\r
+    it under the terms of the GNU General Public License** as published by\r
+    the Free Software Foundation; either version 2 of the License, or\r
+    (at your option) any later version.\r
+\r
+    FreeRTOS is distributed in the hope that it will be useful,\r
+    but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+    GNU General Public License for more details.\r
+\r
+    You should have received a copy of the GNU General Public License\r
+    along with FreeRTOS; if not, write to the Free Software\r
+    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\r
+\r
+    A special exception to the GPL can be applied should you wish to distribute\r
+    a combined work that includes FreeRTOS, without being obliged to provide\r
+    the source code for any proprietary components.  See the licensing section\r
+    of http://www.FreeRTOS.org for full details of how and when the exception\r
+    can be applied.\r
+\r
+    ***************************************************************************\r
+    ***************************************************************************\r
+    *                                                                         *\r
+    * Get the FreeRTOS eBook!  See http://www.FreeRTOS.org/Documentation      *\r
+       *                                                                         *\r
+       * This is a concise, step by step, 'hands on' guide that describes both   *\r
+       * general multitasking concepts and FreeRTOS specifics. It presents and   *\r
+       * explains numerous examples that are written using the FreeRTOS API.     *\r
+       * Full source code for all the examples is provided in an accompanying    *\r
+       * .zip file.                                                              *\r
+    *                                                                         *\r
+    ***************************************************************************\r
+    ***************************************************************************\r
+\r
+       Please ensure to read the configuration and relevant port sections of the\r
+       online documentation.\r
+\r
+       http://www.FreeRTOS.org - Documentation, latest information, license and \r
+       contact details.\r
+\r
+       http://www.SafeRTOS.com - A version that is certified for use in safety \r
+       critical systems.\r
+\r
+       http://www.OpenRTOS.com - Commercial support, development, porting, \r
+       licensing and training services.\r
+*/\r
+\r
+/* ------------------------ System includes ------------------------------- */\r
+#include <stdlib.h>\r
+#include <stdio.h>\r
+#include <string.h>\r
+#include <assert.h>\r
+\r
+/* ------------------------ FreeRTOS includes ----------------------------- */\r
+#include "FreeRTOS.h"\r
+#include "task.h"\r
+\r
+/* ------------------------ LWIP includes --------------------------------- */\r
+#include "lwip/api.h"\r
+#include "lwip/tcpip.h"\r
+#include "lwip/memp.h"\r
+\r
+/* ------------------------ Project includes ------------------------------ */\r
+#include "mcf5xxx.h"\r
+#include "mcf523x.h"\r
+#include "serial.h"\r
+\r
+#include "web.h"\r
+#include "integer.h"\r
+#include "PollQ.h"\r
+#include "semtest.h"\r
+#include "BlockQ.h"\r
+#include "dynamic.h"\r
+#include "flop.h"\r
+\r
+/* ------------------------ Defines --------------------------------------- */\r
+#define mainCOM_TEST_BAUD_RATE      ( ( unsigned long ) 38400 )\r
+\r
+/* Priorities for the demo application tasks. */\r
+#define mainLED_TASK_PRIORITY       ( tskIDLE_PRIORITY + 3 )\r
+#define mainCOM_TEST_PRIORITY       ( tskIDLE_PRIORITY + 2 )\r
+#define mainQUEUE_POLL_PRIORITY     ( tskIDLE_PRIORITY + 2 )\r
+#define mainCHECK_TASK_PRIORITY     ( tskIDLE_PRIORITY + 4 )\r
+#define mainSEM_TEST_PRIORITY       ( tskIDLE_PRIORITY + 1 )\r
+#define mainBLOCK_Q_PRIORITY        ( tskIDLE_PRIORITY + 2 )\r
+#define mainWEB_TASK_PRIORITY       ( tskIDLE_PRIORITY + 3 )\r
+#define STACK_DEFAULT               ( 1024 )\r
+\r
+/* Interval in which tasks are checked. */\r
+#define mainCHECK_PERIOD            ( ( portTickType ) 2000 / portTICK_RATE_MS  )\r
+\r
+/* Constants used by the vMemCheckTask() task. */\r
+#define mainCOUNT_INITIAL_VALUE     ( ( unsigned long ) 0 )\r
+#define mainNO_TASK                 ( 0 )\r
+\r
+/* The size of the memory blocks allocated by the vMemCheckTask() task. */\r
+#define mainMEM_CHECK_SIZE_1        ( ( size_t ) 51 )\r
+#define mainMEM_CHECK_SIZE_2        ( ( size_t ) 52 )\r
+#define mainMEM_CHECK_SIZE_3        ( ( size_t ) 151 )\r
+\r
+/* ------------------------ Static variables ------------------------------ */\r
+xComPortHandle  xSTDComPort = NULL;\r
+\r
+/* ------------------------ Static functions ------------------------------ */\r
+static          portTASK_FUNCTION( vErrorChecks, pvParameters );\r
+static long prvCheckOtherTasksAreStillRunning( unsigned long\r
+                                                   ulMemCheckTaskCount );\r
+static          portTASK_FUNCTION( vMemCheckTask, pvParameters );\r
+\r
+/* ------------------------ Implementation -------------------------------- */\r
+int\r
+main( int argc, char *argv[] )\r
+{\r
+    asm volatile    ( "move.w  #0x2000, %sr\n\t" );\r
+\r
+    xSTDComPort = xSerialPortInitMinimal( 38400, 8 );\r
+    vlwIPInit(  );\r
+\r
+    /* Start the demo/test application tasks. */\r
+    vStartIntegerMathTasks( tskIDLE_PRIORITY );\r
+    vStartPolledQueueTasks( mainQUEUE_POLL_PRIORITY );\r
+    //vStartMathTasks( tskIDLE_PRIORITY );\r
+    vStartSemaphoreTasks( mainSEM_TEST_PRIORITY );\r
+    vStartDynamicPriorityTasks(  );\r
+    vStartBlockingQueueTasks( mainBLOCK_Q_PRIORITY );\r
+\r
+    /* Start the webserver. */\r
+    ( void )sys_thread_new( vBasicWEBServer, NULL, mainWEB_TASK_PRIORITY );\r
+\r
+    /* Start the check task - which is defined in this file. */\r
+    xTaskCreate( vErrorChecks, ( signed char * )"Check", 512, NULL,\r
+                 mainCHECK_TASK_PRIORITY, NULL );\r
+        /* Now all the tasks have been started - start the scheduler. */\r
+    vTaskStartScheduler(  );\r
+\r
+    /* Should never get here! */\r
+    return 0;\r
+}\r
+\r
+static\r
+portTASK_FUNCTION( vErrorChecks, pvParameters )\r
+{\r
+    unsigned long ulMemCheckTaskRunningCount;\r
+    xTaskHandle     xCreatedTask;\r
+\r
+    /* The parameters are not used in this function. */\r
+    ( void )pvParameters;\r
+\r
+    for( ;; )\r
+    {\r
+        ulMemCheckTaskRunningCount = mainCOUNT_INITIAL_VALUE;\r
+        xCreatedTask = mainNO_TASK;\r
+        if( xTaskCreate( vMemCheckTask, ( signed char * )"MEM",\r
+                         configMINIMAL_STACK_SIZE, ( void * )&ulMemCheckTaskRunningCount,\r
+                         tskIDLE_PRIORITY, &xCreatedTask ) != pdPASS )\r
+        {\r
+            xSerialPutChar( xSTDComPort, 'E', portMAX_DELAY );\r
+        }\r
+        /* Delay until it is time to execute again. */\r
+        vTaskDelay( mainCHECK_PERIOD );\r
+\r
+        /* Delete the dynamically created task. */\r
+        if( xCreatedTask != mainNO_TASK )\r
+        {\r
+            vTaskDelete( xCreatedTask );\r
+        }\r
+\r
+        if( prvCheckOtherTasksAreStillRunning( ulMemCheckTaskRunningCount ) != pdPASS )\r
+        {\r
+            xSerialPutChar( xSTDComPort, 'E', portMAX_DELAY );\r
+        }\r
+        else\r
+        {\r
+            xSerialPutChar( xSTDComPort, '.', portMAX_DELAY );\r
+        }\r
+    }\r
+}\r
+\r
+static long\r
+prvCheckOtherTasksAreStillRunning( unsigned long ulMemCheckTaskCount )\r
+{\r
+    long        lReturn = ( long ) pdPASS;\r
+\r
+    /* Check all the demo tasks (other than the flash tasks) to ensure\r
+     * that they are all still running, and that none of them have detected\r
+     * an error.\r
+     */\r
+    if( xAreIntegerMathsTaskStillRunning(  ) != pdTRUE )\r
+    {\r
+        lReturn = ( long ) pdFAIL;\r
+    }\r
+\r
+    if( xArePollingQueuesStillRunning(  ) != pdTRUE )\r
+    {\r
+        lReturn = ( long ) pdFAIL;\r
+    }\r
+\r
+    if( xAreSemaphoreTasksStillRunning(  ) != pdTRUE )\r
+    {\r
+        lReturn = ( long ) pdFAIL;\r
+    }\r
+\r
+    if( xAreDynamicPriorityTasksStillRunning(  ) != pdTRUE )\r
+    {\r
+        lReturn = ( long ) pdFAIL;\r
+    }\r
+\r
+    if( xAreBlockingQueuesStillRunning(  ) != pdTRUE )\r
+    {\r
+        lReturn = ( long ) pdFAIL;\r
+    }\r
+\r
+    if( ulMemCheckTaskCount == mainCOUNT_INITIAL_VALUE )\r
+    {\r
+        /* The vMemCheckTask did not increment the counter - it must\r
+         * have failed.\r
+         */\r
+        lReturn = ( long ) pdFAIL;\r
+    }\r
+    return lReturn;\r
+}\r
+\r
+static void\r
+vMemCheckTask( void *pvParameters )\r
+{\r
+    unsigned long *pulMemCheckTaskRunningCounter;\r
+    void           *pvMem1, *pvMem2, *pvMem3;\r
+    static long lErrorOccurred = pdFALSE;\r
+\r
+    /* This task is dynamically created then deleted during each cycle of the\r
+       vErrorChecks task to check the operation of the memory allocator.  Each time\r
+       the task is created memory is allocated for the stack and TCB.  Each time\r
+       the task is deleted this memory is returned to the heap.  This task itself\r
+       exercises the allocator by allocating and freeing blocks.\r
+\r
+       The task executes at the idle priority so does not require a delay.\r
+\r
+       pulMemCheckTaskRunningCounter is incremented each cycle to indicate to the\r
+       vErrorChecks() task that this task is still executing without error. */\r
+\r
+    pulMemCheckTaskRunningCounter = ( unsigned long * )pvParameters;\r
+\r
+    for( ;; )\r
+    {\r
+        if( lErrorOccurred == pdFALSE )\r
+        {\r
+            /* We have never seen an error so increment the counter. */\r
+            ( *pulMemCheckTaskRunningCounter )++;\r
+        }\r
+\r
+        /* Allocate some memory - just to give the allocator some extra\r
+           exercise.  This has to be in a critical section to ensure the\r
+           task does not get deleted while it has memory allocated. */\r
+        vTaskSuspendAll(  );\r
+        {\r
+            pvMem1 = pvPortMalloc( mainMEM_CHECK_SIZE_1 );\r
+            if( pvMem1 == NULL )\r
+            {\r
+                lErrorOccurred = pdTRUE;\r
+            }\r
+            else\r
+            {\r
+                memset( pvMem1, 0xaa, mainMEM_CHECK_SIZE_1 );\r
+                vPortFree( pvMem1 );\r
+            }\r
+        }\r
+        xTaskResumeAll(  );\r
+\r
+        /* Again - with a different size block. */\r
+        vTaskSuspendAll(  );\r
+        {\r
+            pvMem2 = pvPortMalloc( mainMEM_CHECK_SIZE_2 );\r
+            if( pvMem2 == NULL )\r
+            {\r
+                lErrorOccurred = pdTRUE;\r
+            }\r
+            else\r
+            {\r
+                memset( pvMem2, 0xaa, mainMEM_CHECK_SIZE_2 );\r
+                vPortFree( pvMem2 );\r
+            }\r
+        }\r
+        xTaskResumeAll(  );\r
+\r
+        /* Again - with a different size block. */\r
+        vTaskSuspendAll(  );\r
+        {\r
+            pvMem3 = pvPortMalloc( mainMEM_CHECK_SIZE_3 );\r
+            if( pvMem3 == NULL )\r
+            {\r
+                lErrorOccurred = pdTRUE;\r
+            }\r
+            else\r
+            {\r
+                memset( pvMem3, 0xaa, mainMEM_CHECK_SIZE_3 );\r
+                vPortFree( pvMem3 );\r
+            }\r
+        }\r
+        xTaskResumeAll(  );\r
+    }\r
+}\r