]> git.sur5r.net Git - freertos/blobdiff - Demo/MB91460_Softune/SRC/main.c
Remove unnecessary use of portLONG, portCHAR and portSHORT.
[freertos] / Demo / MB91460_Softune / SRC / main.c
index 0128f0b4ea9c3e0387982ea1ed69b4009c82ead4..ce2e1175d3255b6096bd450ed9faecd4a4f28fc4 100644 (file)
@@ -1,30 +1,78 @@
-/* THIS SAMPLE CODE IS PROVIDED AS IS AND IS SUBJECT TO ALTERATIONS. FUJITSU */\r
-/* MICROELECTRONICS ACCEPTS NO RESPONSIBILITY OR LIABILITY FOR ANY ERRORS OR */\r
-/* ELIGIBILITY FOR ANY PURPOSES.                                                                                        */\r
-/*                              (C) Fujitsu Microelectronics Europe GmbH                                 */\r
-/*------------------------------------------------------------------------\r
-  MAIN.C\r
-  - description\r
-  - See README.TXT for project description and disclaimer.\r
--------------------------------------------------------------------------*/\r
+/*\r
+    FreeRTOS V6.0.0 - Copyright (C) 2009 Real Time Engineers Ltd.\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 a\r
+    combined work that includes FreeRTOS without being obliged to provide the\r
+    source code for proprietary components outside of the FreeRTOS kernel.\r
+    Alternative commercial license and support terms are also available upon\r
+    request.  See the licensing section of http://www.FreeRTOS.org for full\r
+    license details.\r
+\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.\r
+\r
+    You should have received a copy of the GNU General Public License along\r
+    with FreeRTOS; if not, write to the Free Software Foundation, Inc., 59\r
+    Temple Place, Suite 330, Boston, MA  02111-1307  USA.\r
+\r
+\r
+    ***************************************************************************\r
+    *                                                                         *\r
+    * The FreeRTOS eBook and reference manual are available to purchase for a *\r
+    * small fee. Help yourself get started quickly while also helping the     *\r
+    * FreeRTOS project! See http://www.FreeRTOS.org/Documentation for details *\r
+    *                                                                         *\r
+    ***************************************************************************\r
+\r
+    1 tab == 4 spaces!\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
 \r
 /*\r
  * Creates all the demo application tasks, then starts the scheduler.  The WEB\r
  * documentation provides more details of the demo application tasks.\r
  * \r
- * Main.c also creates a task called "Check".  This only executes every three \r
- * seconds but has the highest priority so is guaranteed to get processor time.  \r
- * Its main function is to check that all the other tasks are still operational.\r
- * Each task (other than the "flash" tasks) maintains a unique count that is \r
- * incremented each time the task successfully completes its function.  Should \r
- * any error occur within such a task the count is permanently halted.  The \r
- * check task inspects the count of each task to ensure it has changed since\r
- * the last time the check task executed.  If all the count variables have \r
- * changed all the tasks are still executing error free, and the check task\r
- * toggles the onboard LED.  Should any task contain an error at any time \r
+ * In addition to the standard demo tasks, the follow demo specific tasks are\r
+ * create:\r
+ *\r
+ * The "Check" task.  This only executes every three seconds but has the highest \r
+ * priority so is guaranteed to get processor time.  Its main function is to \r
+ * check that all the other tasks are still operational.  Most tasks maintain \r
+ * a unique count that is incremented each time the task successfully completes \r
+ * its function.  Should any error occur within such a task the count is \r
+ * permanently halted.  The check task inspects the count of each task to ensure \r
+ * it has changed since the last time the check task executed.  If all the count \r
+ * variables have changed all the tasks are still executing error free, and the \r
+ * check task toggles the onboard LED.  Should any task contain an error at any time \r
  * the LED toggle rate will change from 3 seconds to 500ms.\r
  *\r
+ * The "Register Check" tasks.  These tasks fill the CPU registers with known\r
+ * values, then check that each register still contains the expected value 0 the\r
+ * discovery of an unexpected value being indicative of an error in the RTOS\r
+ * context switch mechanism.  The register check tasks operate at low priority\r
+ * so are switched in and out frequently.\r
+ *\r
+ * The "Trace Utility" task.  This can be used to obtain trace and debug \r
+ * information via UART5.\r
  */\r
 \r
 \r
 #include "flash.h"\r
 #include "integer.h"\r
 #include "comtest2.h"\r
-#include "PollQ.h"\r
 #include "semtest.h"\r
 #include "BlockQ.h"\r
 #include "dynamic.h"\r
 #include "flop.h"\r
 #include "GenQTest.h"\r
 #include "QPeek.h"\r
-#include "BlockTim.h"\r
+#include "blocktim.h"\r
 #include "death.h"\r
 #include "taskutility.h"\r
 #include "partest.h"\r
+#include "crflash.h"\r
        \r
 /* Demo task priorities. */\r
 #define mainWATCHDOG_TASK_PRIORITY             ( tskIDLE_PRIORITY + 5 )\r
 #define mainCHECK_TASK_PRIORITY                        ( tskIDLE_PRIORITY + 4 )\r
-#define mainUTILITY_TASK_PRIORITY              ( tskIDLE_PRIORITY + 3 )\r
+#define mainUTILITY_TASK_PRIORITY              ( tskIDLE_PRIORITY )\r
 #define mainSEM_TEST_PRIORITY                  ( tskIDLE_PRIORITY + 3 )\r
 #define mainCOM_TEST_PRIORITY                  ( tskIDLE_PRIORITY + 2 )\r
-#define mainQUEUE_POLL_PRIORITY                        ( tskIDLE_PRIORITY + 2 )\r
 #define mainQUEUE_BLOCK_PRIORITY               ( tskIDLE_PRIORITY + 2 )\r
 #define mainDEATH_PRIORITY                             ( tskIDLE_PRIORITY + 1 )\r
 #define mainLED_TASK_PRIORITY                  ( tskIDLE_PRIORITY + 1 )\r
 top of the page.  When the system is operating error free the 'Check' task\r
 toggles an LED every three seconds.  If an error is discovered in any task the\r
 rate is increased to 500 milliseconds.  [in this case the '*' characters on the \r
-LCD represent LED's]*/\r
+LCD represent LEDs]*/\r
 #define mainNO_ERROR_CHECK_DELAY               ( ( portTickType ) 3000 / portTICK_RATE_MS  )\r
 #define mainERROR_CHECK_DELAY                  ( ( portTickType ) 500 / portTICK_RATE_MS  )\r
 \r
@@ -88,13 +135,16 @@ LCD represent LED's]*/
 /* The number of interrupt levels to use. */\r
 #define mainINTERRUPT_LEVELS   ( 31 )\r
 \r
+/* The number of 'flash' co-routines to create - each toggles a different LED. */\r
+#define mainNUM_FLASH_CO_ROUTINES      ( 8 )\r
+\r
 /*---------------------------------------------------------------------------*/\r
 \r
 /* \r
  * The function that implements the Check task.  See the comments at the head\r
  * of the page for implementation details.\r
  */ \r
-static void vErrorChecks( void *pvParameters );\r
+static void prvErrorChecks( void *pvParameters );\r
 \r
 /*\r
  * Called by the Check task.  Returns pdPASS if all the other tasks are found\r
@@ -122,9 +172,6 @@ static void vSecondRegisterTestTask( void *pvParameters );
 register test tasks. */\r
 unsigned portLONG ulRegTestError = pdFALSE;\r
 \r
-/* Variables used to ensure the register check tasks are still executing. */\r
-static volatile unsigned portLONG ulRegTest1Counter = 0UL, ulRegTest2Counter = 0UL;\r
-\r
 /*---------------------------------------------------------------------------*/\r
 \r
 /* Start all the demo application tasks, then start the scheduler. */\r
@@ -137,7 +184,6 @@ void main(void)
        vStartLEDFlashTasks( mainLED_TASK_PRIORITY );   \r
        vStartIntegerMathTasks( tskIDLE_PRIORITY );\r
        vAltStartComTestTasks( mainCOM_TEST_PRIORITY, mainCOM_TEST_BAUD_RATE, mainCOM_TEST_LED - 1 );\r
-       vStartPolledQueueTasks( mainQUEUE_POLL_PRIORITY );\r
        vStartSemaphoreTasks( mainSEM_TEST_PRIORITY );\r
        vStartBlockingQueueTasks ( mainQUEUE_BLOCK_PRIORITY );  \r
        vStartDynamicPriorityTasks();   \r
@@ -145,10 +191,12 @@ void main(void)
        vStartGenericQueueTasks( mainGENERIC_QUEUE_PRIORITY );\r
        vStartQueuePeekTasks();\r
        vCreateBlockTimeTasks();\r
+       vStartFlashCoRoutines( mainNUM_FLASH_CO_ROUTINES );\r
 \r
        /* Start the 'Check' task which is defined in this file. */\r
-       xTaskCreate( vErrorChecks, ( signed portCHAR * ) "Check", configMINIMAL_STACK_SIZE, NULL, mainCHECK_TASK_PRIORITY, NULL );      \r
+       xTaskCreate( prvErrorChecks, ( signed portCHAR * ) "Check", configMINIMAL_STACK_SIZE, NULL, mainCHECK_TASK_PRIORITY, NULL );    \r
 \r
+       /* Start the 'Register Test' tasks as described at the top of this file. */\r
        xTaskCreate( vFirstRegisterTestTask, ( signed portCHAR * ) "Reg1", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL );\r
        xTaskCreate( vSecondRegisterTestTask, ( signed portCHAR * ) "Reg2", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL );\r
 \r
@@ -176,7 +224,7 @@ void main(void)
 }\r
 /*-----------------------------------------------------------*/\r
 \r
-static void vErrorChecks( void *pvParameters )\r
+static void prvErrorChecks( void *pvParameters )\r
 {\r
 portTickType xDelayPeriod = mainNO_ERROR_CHECK_DELAY, xLastExecutionTime;\r
 \r
@@ -212,7 +260,6 @@ portTickType xDelayPeriod = mainNO_ERROR_CHECK_DELAY, xLastExecutionTime;
 static portSHORT prvCheckOtherTasksAreStillRunning( void )\r
 {\r
 portBASE_TYPE lReturn = pdPASS;\r
-static unsigned portLONG ulLastRegTest1Counter = 0UL, ulLastRegTest2Counter = 0UL;\r
 \r
        /* The demo tasks maintain a count that increments every cycle of the task\r
        provided that the task has never encountered an error.  This function \r
@@ -225,11 +272,6 @@ static unsigned portLONG ulLastRegTest1Counter = 0UL, ulLastRegTest2Counter = 0U
                lReturn = pdFAIL;\r
        }\r
 \r
-       if( xArePollingQueuesStillRunning() != pdTRUE )\r
-       {\r
-               lReturn = pdFAIL;\r
-       }\r
-\r
        if( xAreComTestTasksStillRunning() != pdTRUE )\r
        {\r
                lReturn = pdFAIL;\r
@@ -281,20 +323,6 @@ static unsigned portLONG ulLastRegTest1Counter = 0UL, ulLastRegTest2Counter = 0U
                lReturn = pdFAIL;\r
        }\r
 \r
-       /* Are the register test tasks still running? */\r
-       if( ulLastRegTest1Counter == ulRegTest1Counter )\r
-       {\r
-               lReturn = pdFAIL;\r
-       }\r
-       \r
-       if( ulLastRegTest2Counter == ulRegTest2Counter )\r
-       {\r
-               lReturn = pdFAIL;\r
-       }\r
-\r
-       ulLastRegTest1Counter = ulRegTest1Counter;\r
-       ulLastRegTest2Counter = ulRegTest2Counter;\r
-\r
        return lReturn;\r
 }\r
 /*-----------------------------------------------------------*/\r
@@ -317,33 +345,44 @@ static void prvSetupHardware( void )
 }\r
 /*-----------------------------------------------------------*/\r
 \r
-/* The below callback function is called from Delayed ISR if configUSE_IDLE_HOOK \r
-is configured as 1. */  \r
+/* Idle hook function. */\r
 #if configUSE_IDLE_HOOK == 1\r
        void vApplicationIdleHook( void )\r
        {\r
-               /* Are we using the idle task to kick the watchdog? */\r
+               /* Are we using the idle task to kick the watchdog?  See watchdog.h\r
+               for watchdog kicking options. Note this is for demonstration only\r
+               and is not a suggested method of servicing the watchdog in a real\r
+               application. */\r
                #if WATCHDOG == WTC_IN_IDLE\r
                        Kick_Watchdog();\r
                #endif\r
 \r
-               #if configUSE_CO_ROUTINES == 1          \r
-                       vCoRoutineSchedule();\r
-               #endif\r
+               vCoRoutineSchedule();\r
        }\r
+#else\r
+       #if WATCHDOG == WTC_IN_IDLE\r
+               #error configUSE_IDLE_HOOK must be set to 1 in FreeRTOSConfig.h if the watchdog is being cleared in the idle task hook.\r
+       #endif\r
 #endif\r
+\r
 /*-----------------------------------------------------------*/\r
 \r
-/*\r
-The below callback function is called from Tick ISR if configUSE_TICK_HOOK \r
-is configured as 1. */  \r
+/* Tick hook function. */\r
 #if configUSE_TICK_HOOK == 1\r
        void vApplicationTickHook( void )\r
        {\r
+               /* Are we using the tick to kick the watchdog?  See watchdog.h\r
+               for watchdog kicking options.  Note this is for demonstration\r
+               only and is not a suggested method of servicing the watchdog in\r
+               a real application. */\r
                #if WATCHDOG == WTC_IN_TICK\r
                        Kick_Watchdog();\r
                #endif\r
        }\r
+#else\r
+       #if WATCHDOG == WTC_IN_TICK\r
+               #error configUSE_TICK_HOOK must be set to 1 in FreeRTOSConfig.h if the watchdog is being cleared in the tick hook.\r
+       #endif\r
 #endif\r
 /*-----------------------------------------------------------*/\r
 \r
@@ -354,11 +393,7 @@ extern volatile unsigned portLONG ulCriticalNesting;
        /* Fills the registers with known values (different to the values\r
        used in vSecondRegisterTestTask()), then checks that the registers still\r
        all contain the expected value.  This is done to test the context save\r
-       and restore mechanism as this task is swapped onto and off of the CPU.\r
-\r
-       The critical nesting depth is also saved as part of the context so also\r
-       check this maintains an expected value. */\r
-       ulCriticalNesting = 0x12345678;\r
+       and restore mechanism as this task is swapped onto and off of the CPU. */\r
 \r
        for( ;; )\r
        {\r
@@ -382,70 +417,56 @@ extern volatile unsigned portLONG ulCriticalNesting;
                        LDI #0x11111111, R13\r
                        CMP R13, R0\r
                        BNE First_Set_Error\r
-                       NOP\r
 \r
                        LDI #0x22222222, R13\r
                        CMP R13, R1\r
                        BNE First_Set_Error\r
-                       NOP\r
 \r
                        LDI #0x33333333, R13\r
                        CMP R13, R2\r
                        BNE First_Set_Error\r
-                       NOP\r
 \r
                        LDI #0x44444444, R13\r
                        CMP R13, R3\r
                        BNE First_Set_Error\r
-                       NOP\r
 \r
                        LDI #0x55555555, R13\r
                        CMP R13, R4\r
                        BNE First_Set_Error\r
-                       NOP\r
 \r
                        LDI #0x66666666, R13\r
                        CMP R13, R5\r
                        BNE First_Set_Error\r
-                       NOP\r
 \r
                        LDI #0x77777777, R13\r
                        CMP R13, R6\r
                        BNE First_Set_Error\r
-                       NOP\r
 \r
                        LDI #0x88888888, R13\r
                        CMP R13, R7\r
                        BNE First_Set_Error\r
-                       NOP\r
 \r
                        LDI #0x99999999, R13\r
                        CMP R13, R8\r
                        BNE First_Set_Error\r
-                       NOP\r
 \r
                        LDI #0xaaaaaaaa, R13\r
                        CMP R13, R9\r
                        BNE First_Set_Error\r
-                       NOP\r
 \r
                        LDI #0xbbbbbbbb, R13\r
                        CMP R13, R10\r
                        BNE First_Set_Error\r
-                       NOP\r
 \r
                        LDI #0xcccccccc, R13\r
                        CMP R13, R11\r
                        BNE First_Set_Error\r
-                       NOP\r
 \r
                        LDI #0xdddddddd, R13\r
                        CMP R13, R12\r
                        BNE First_Set_Error\r
-                       NOP\r
 \r
                        BRA First_Start_Next_Loop\r
-                       NOP\r
 \r
                First_Set_Error:\r
 \r
@@ -459,13 +480,6 @@ extern volatile unsigned portLONG ulCriticalNesting;
 \r
 \r
                #pragma endasm\r
-\r
-               ulRegTest1Counter++;\r
-\r
-               if( ulCriticalNesting != 0x12345678 )\r
-               {\r
-                       ulRegTestError = pdTRUE;\r
-               }\r
        }\r
 }\r
 /*-----------------------------------------------------------*/\r
@@ -477,11 +491,7 @@ extern volatile unsigned portLONG ulCriticalNesting;
        /* Fills the registers with known values (different to the values\r
        used in vFirstRegisterTestTask()), then checks that the registers still\r
        all contain the expected value.  This is done to test the context save\r
-       and restore mechanism as this task is swapped onto and off of the CPU.\r
-\r
-       The critical nesting depth is also saved as part of the context so also\r
-       check this maintains an expected value. */\r
-       ulCriticalNesting = 0x87654321;\r
+       and restore mechanism as this task is swapped onto and off of the CPU. */\r
 \r
        for( ;; )\r
        {\r
@@ -489,6 +499,7 @@ extern volatile unsigned portLONG ulCriticalNesting;
                        ;Load known values into each register.\r
                        LDI     #0x11111111, R1\r
                        LDI     #0x22222222, R2\r
+                       INT #40H\r
                        LDI     #0x33333333, R3\r
                        LDI #0x44444444, R4\r
                        LDI     #0x55555555, R5\r
@@ -496,6 +507,7 @@ extern volatile unsigned portLONG ulCriticalNesting;
                        LDI     #0x77777777, R7\r
                        LDI     #0x88888888, R8\r
                        LDI     #0x99999999, R9\r
+                       INT #40H\r
                        LDI     #0xaaaaaaaa, R10\r
                        LDI     #0xbbbbbbbb, R11\r
                        LDI     #0xcccccccc, R12\r
@@ -505,70 +517,60 @@ extern volatile unsigned portLONG ulCriticalNesting;
                        LDI #0x11111111, R13\r
                        CMP R13, R1\r
                        BNE Second_Set_Error\r
-                       NOP\r
 \r
                        LDI #0x22222222, R13\r
                        CMP R13, R2\r
                        BNE Second_Set_Error\r
-                       NOP\r
 \r
                        LDI #0x33333333, R13\r
                        CMP R13, R3\r
                        BNE Second_Set_Error\r
-                       NOP\r
 \r
                        LDI #0x44444444, R13\r
                        CMP R13, R4\r
                        BNE Second_Set_Error\r
-                       NOP\r
 \r
                        LDI #0x55555555, R13\r
                        CMP R13, R5\r
                        BNE Second_Set_Error\r
-                       NOP\r
+\r
+                       INT #40H\r
 \r
                        LDI #0x66666666, R13\r
                        CMP R13, R6\r
                        BNE Second_Set_Error\r
-                       NOP\r
 \r
                        LDI #0x77777777, R13\r
                        CMP R13, R7\r
                        BNE Second_Set_Error\r
-                       NOP\r
 \r
                        LDI #0x88888888, R13\r
                        CMP R13, R8\r
                        BNE Second_Set_Error\r
-                       NOP\r
 \r
                        LDI #0x99999999, R13\r
                        CMP R13, R9\r
                        BNE Second_Set_Error\r
-                       NOP\r
+\r
+                       INT #40H\r
 \r
                        LDI #0xaaaaaaaa, R13\r
                        CMP R13, R10\r
                        BNE Second_Set_Error\r
-                       NOP\r
 \r
                        LDI #0xbbbbbbbb, R13\r
                        CMP R13, R11\r
                        BNE Second_Set_Error\r
-                       NOP\r
 \r
                        LDI #0xcccccccc, R13\r
                        CMP R13, R12\r
                        BNE Second_Set_Error\r
-                       NOP\r
 \r
                        LDI #0xdddddddd, R13\r
                        CMP R13, R0\r
                        BNE Second_Set_Error\r
-                       NOP\r
 \r
                        BRA Second_Start_Next_Loop\r
-                       NOP\r
 \r
                Second_Set_Error:\r
 \r
@@ -582,13 +584,6 @@ extern volatile unsigned portLONG ulCriticalNesting;
 \r
 \r
                #pragma endasm\r
-\r
-               ulRegTest2Counter++;\r
-\r
-               if( ulCriticalNesting != 0x87654321 )\r
-               {\r
-                       ulRegTestError = pdTRUE;\r
-               }\r
        }\r
 }\r
 /*-----------------------------------------------------------*/\r