-/*
- 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.
- ***************************************************************************
-*/
-
-/* ------------------------ 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