]> git.sur5r.net Git - freertos/blobdiff - FreeRTOS/Source/tasks.c
Make CM3/4 tick configuration a weak function to allow application writers to use...
[freertos] / FreeRTOS / Source / tasks.c
index ef6208fc969c5b065527aa09da66e4e241dfd07c..a7800fcc1c371d5f13e7502bb284407f2a4c2a36 100644 (file)
@@ -1,7 +1,7 @@
 /*\r
     FreeRTOS V7.3.0 - Copyright (C) 2012 Real Time Engineers Ltd.\r
 \r
-    FEATURES AND PORTS ARE ADDED TO FREERTOS ALL THE TIME.  PLEASE VISIT \r
+    FEATURES AND PORTS ARE ADDED TO FREERTOS ALL THE TIME.  PLEASE VISIT\r
     http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.\r
 \r
     ***************************************************************************\r
@@ -42,7 +42,7 @@
     FreeRTOS WEB site.\r
 \r
     1 tab == 4 spaces!\r
-    \r
+\r
     ***************************************************************************\r
      *                                                                       *\r
      *    Having a problem?  Start by reading the FAQ "My application does   *\r
      *                                                                       *\r
     ***************************************************************************\r
 \r
-    \r
-    http://www.FreeRTOS.org - Documentation, training, latest versions, license \r
-    and contact details.  \r
-    \r
+\r
+    http://www.FreeRTOS.org - Documentation, training, latest versions, license\r
+    and contact details.\r
+\r
     http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,\r
     including FreeRTOS+Trace - an indispensable productivity tool.\r
 \r
-    Real Time Engineers ltd license FreeRTOS to High Integrity Systems, who sell \r
-    the code with commercial support, indemnification, and middleware, under \r
+    Real Time Engineers ltd license FreeRTOS to High Integrity Systems, who sell\r
+    the code with commercial support, indemnification, and middleware, under\r
     the OpenRTOS brand: http://www.OpenRTOS.com.  High Integrity Systems also\r
-    provide a safety engineered and independently SIL3 certified version under \r
+    provide a safety engineered and independently SIL3 certified version under\r
     the SafeRTOS brand: http://www.SafeRTOS.com.\r
 */\r
 \r
@@ -463,8 +463,13 @@ static tskTCB *prvAllocateTCBAndStack( unsigned short usStackDepth, portSTACK_TY
 /*\r
  * Return the amount of time, in ticks, that will pass before the kernel will\r
  * next move a task from the Blocked state to the Running state.\r
+ *\r
+ * This conditional compilation should use inequality to 0, not equality to 1.\r
+ * This is to ensure portSUPPRESS_TICKS_AND_SLEEP() can be called when user\r
+ * defined low power mode implementations require configUSE_TICKLESS_IDLE to be\r
+ * set to a value other than 1.\r
  */\r
-#if ( configUSE_TICKLESS_IDLE == 1 )\r
+#if ( configUSE_TICKLESS_IDLE != 0 )\r
 \r
        static portTickType prvGetExpectedIdleTime( void ) PRIVILEGED_FUNCTION;\r
 \r
@@ -1314,28 +1319,32 @@ void vTaskSuspendAll( void )
 }\r
 /*----------------------------------------------------------*/\r
 \r
-portTickType prvGetExpectedIdleTime( void )\r
-{\r
-portTickType xReturn;\r
+#if ( configUSE_TICKLESS_IDLE != 0 )\r
 \r
-       if( pxCurrentTCB->uxPriority > tskIDLE_PRIORITY )\r
+       portTickType prvGetExpectedIdleTime( void )\r
        {\r
-               xReturn = 0;\r
-       }\r
-       else if( listCURRENT_LIST_LENGTH( &( pxReadyTasksLists[ tskIDLE_PRIORITY ] ) ) > 1 )\r
-       {\r
-               /* There are other idle priority tasks in the ready state.  If\r
-               time slicing is used then the very next tick interrupt must be\r
-               processed. */\r
-               xReturn = 0;\r
-       }\r
-       else\r
-       {\r
-               xReturn = xNextTaskUnblockTime - xTickCount;\r
+       portTickType xReturn;\r
+       \r
+               if( pxCurrentTCB->uxPriority > tskIDLE_PRIORITY )\r
+               {\r
+                       xReturn = 0;\r
+               }\r
+               else if( listCURRENT_LIST_LENGTH( &( pxReadyTasksLists[ tskIDLE_PRIORITY ] ) ) > 1 )\r
+               {\r
+                       /* There are other idle priority tasks in the ready state.  If\r
+                       time slicing is used then the very next tick interrupt must be\r
+                       processed. */\r
+                       xReturn = 0;\r
+               }\r
+               else\r
+               {\r
+                       xReturn = xNextTaskUnblockTime - xTickCount;\r
+               }\r
+       \r
+               return xReturn;\r
        }\r
 \r
-       return xReturn;\r
-}\r
+#endif /* configUSE_TICKLESS_IDLE != 0  */\r
 /*----------------------------------------------------------*/\r
 \r
 signed portBASE_TYPE xTaskResumeAll( void )\r
@@ -1627,7 +1636,11 @@ unsigned portBASE_TYPE uxTaskGetNumberOfTasks( void )
 #endif\r
 /*----------------------------------------------------------*/\r
 \r
-#if ( configUSE_TICKLESS_IDLE == 1 )\r
+/* This conditional compilation should use inequality to 0, not equality to 1.\r
+This is to ensure vTaskStepTick() is available when user defined low power mode        \r
+implementations require configUSE_TICKLESS_IDLE to be set to a value other than\r
+1. */\r
+#if ( configUSE_TICKLESS_IDLE != 0 )\r
 \r
        void vTaskStepTick( portTickType xTicksToJump )\r
        {\r
@@ -2146,7 +2159,11 @@ static portTASK_FUNCTION( prvIdleTask, pvParameters )
                }\r
                #endif\r
 \r
-               #if ( configUSE_TICKLESS_IDLE == 1 )\r
+               /* This conditional compilation should use inequality to 0, not equality\r
+               to 1.  This is to ensure portSUPPRESS_TICKS_AND_SLEEP() is called when\r
+               user defined low power mode     implementations require\r
+               configUSE_TICKLESS_IDLE to be set to a value other than 1. */\r
+               #if ( configUSE_TICKLESS_IDLE != 0 )\r
                {\r
                portTickType xExpectedIdleTime;\r
                /* If the expected idle time is 1 then the idle time would end at\r
@@ -2156,34 +2173,29 @@ static portTASK_FUNCTION( prvIdleTask, pvParameters )
                routines returns. */\r
                const portTickType xMinimumExpectedIdleTime = ( portTickType ) 2;\r
 \r
-                       /* Don't enter low power if there are still tasks waiting\r
-                       deletion. */\r
-                       if( uxTasksDeleted == 0 )\r
+                       /* It is not desirable to suspend then resume the scheduler on\r
+                       each iteration of the idle task.  Therefore, a preliminary\r
+                       test of the expected idle time is performed without the\r
+                       scheduler suspended.  The result here is not necessarily\r
+                       valid. */\r
+                       xExpectedIdleTime = prvGetExpectedIdleTime();\r
+\r
+                       if( xExpectedIdleTime >= xMinimumExpectedIdleTime )\r
                        {\r
-                               /* It is not desirable to suspend then resume the scheduler on\r
-                               each iteration of the idle task.  Therefore, a preliminary\r
-                               test of the expected idle time is performed without the\r
-                               scheduler suspended.  The result here is not necessarily\r
-                               valid. */\r
-                               xExpectedIdleTime = prvGetExpectedIdleTime();\r
-\r
-                               if( xExpectedIdleTime >= xMinimumExpectedIdleTime )\r
+                               vTaskSuspendAll();\r
                                {\r
-                                       vTaskSuspendAll();\r
-                                       {\r
-                                               /* Now the scheduler is suspended, the expected idle\r
-                                               time can be sampled again, and this time its value can\r
-                                               be used. */\r
-                                               configASSERT( xNextTaskUnblockTime >= xTickCount );\r
-                                               xExpectedIdleTime = prvGetExpectedIdleTime();\r
+                                       /* Now the scheduler is suspended, the expected idle\r
+                                       time can be sampled again, and this time its value can\r
+                                       be used. */\r
+                                       configASSERT( xNextTaskUnblockTime >= xTickCount );\r
+                                       xExpectedIdleTime = prvGetExpectedIdleTime();\r
 \r
-                                               if( xExpectedIdleTime >= xMinimumExpectedIdleTime )\r
-                                               {\r
-                                                       portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime );\r
-                                               }\r
+                                       if( xExpectedIdleTime >= xMinimumExpectedIdleTime )\r
+                                       {\r
+                                               portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime );\r
                                        }\r
-                                       xTaskResumeAll();\r
                                }\r
+                               xTaskResumeAll();\r
                        }\r
                }\r
                #endif\r
@@ -2328,7 +2340,7 @@ static void prvCheckTasksWaitingTermination( void )
 \r
                /* ucTasksDeleted is used to prevent vTaskSuspendAll() being called\r
                too often in the idle task. */\r
-               if( uxTasksDeleted > ( unsigned portBASE_TYPE ) 0U )\r
+               while( uxTasksDeleted > ( unsigned portBASE_TYPE ) 0U )\r
                {\r
                        vTaskSuspendAll();\r
                                xListIsEmpty = listLIST_IS_EMPTY( &xTasksWaitingTermination );\r