]> git.sur5r.net Git - freertos/commitdiff
Add default definition for configUSE_QUEUE_SETS.
authorrichardbarry <richardbarry@1d2547de-c912-0410-9cb9-b8ca96c0e9e2>
Mon, 18 Feb 2013 11:20:29 +0000 (11:20 +0000)
committerrichardbarry <richardbarry@1d2547de-c912-0410-9cb9-b8ca96c0e9e2>
Mon, 18 Feb 2013 11:20:29 +0000 (11:20 +0000)
Add eTaskConfirmSleepModeStatus() (not yet tested).
Only call prvQueueUnregisterQueue() when a queue or semaphore is deleted if configQUEUE_REGISTRY_SIZE > 0.
Back out change that checks the configUSE_PORT_OPTMISED_TASK_SELECTION value before uxPriorityUsedOnEntry is set in vTaskPrioritySet as it generated more warnings (with other compilers) than it fixed.

git-svn-id: https://svn.code.sf.net/p/freertos/code/trunk@1828 1d2547de-c912-0410-9cb9-b8ca96c0e9e2

FreeRTOS/Source/include/FreeRTOS.h
FreeRTOS/Source/include/task.h
FreeRTOS/Source/queue.c
FreeRTOS/Source/tasks.c

index a84be03c08ce37ae710d7a495628466882f8a127..52c09a89797067002e6c216db12cc1151ac81e4c 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
@@ -129,11 +129,11 @@ typedef portBASE_TYPE (*pdTASK_HOOK_CODE)( void * );
        #error Missing definition:  INCLUDE_uxTaskPriorityGet should be defined in FreeRTOSConfig.h as either 1 or 0.  See the Configuration section of the FreeRTOS API documentation for details.\r
 #endif\r
 \r
-#ifndef INCLUDE_vTaskDelete            \r
+#ifndef INCLUDE_vTaskDelete\r
        #error Missing definition:  INCLUDE_vTaskDelete          should be defined in FreeRTOSConfig.h as either 1 or 0.  See the Configuration section of the FreeRTOS API documentation for details.\r
 #endif\r
 \r
-#ifndef INCLUDE_vTaskSuspend   \r
+#ifndef INCLUDE_vTaskSuspend\r
        #error Missing definition:  INCLUDE_vTaskSuspend         should be defined in FreeRTOSConfig.h as either 1 or 0.  See the Configuration section of the FreeRTOS API documentation for details.\r
 #endif\r
 \r
@@ -320,7 +320,7 @@ typedef portBASE_TYPE (*pdTASK_HOOK_CODE)( void * );
 \r
 #ifndef traceTASK_PRIORITY_DISINHERIT\r
        /* Called when a task releases a mutex, the holding of which had resulted in\r
-       the task inheriting the priority of a higher priority task.  \r
+       the task inheriting the priority of a higher priority task.\r
        pxTCBOfMutexHolder is a pointer to the TCB of the task that is releasing the\r
        mutex.  uxOriginalPriority is the task's configured (base) priority. */\r
        #define traceTASK_PRIORITY_DISINHERIT( pxTCBOfMutexHolder, uxOriginalPriority )\r
@@ -352,7 +352,7 @@ typedef portBASE_TYPE (*pdTASK_HOOK_CODE)( void * );
        #define traceMOVED_TASK_TO_READY_STATE( pxTCB )\r
 #endif\r
 \r
-#ifndef traceQUEUE_CREATE      \r
+#ifndef traceQUEUE_CREATE\r
        #define traceQUEUE_CREATE( pxNewQueue )\r
 #endif\r
 \r
@@ -558,6 +558,10 @@ typedef portBASE_TYPE (*pdTASK_HOOK_CODE)( void * );
        #define configPOST_SLEEP_PROCESSING( x )\r
 #endif\r
 \r
+#ifndef configUSE_QUEUE_SETS\r
+       #define configUSE_QUEUE_SETS 0\r
+#endif\r
+\r
 /* For backward compatability. */\r
 #define eTaskStateGet eTaskGetState\r
 \r
index b54d21e3b1294ad058db2816dc9d040e2d7e8bd5..9aa7ed51be1fcf549e96c91c4c5ded387938ff70 100644 (file)
@@ -41,7 +41,7 @@
 \r
     1 tab == 4 spaces!\r
 \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 information, \r
+\r
+    http://www.FreeRTOS.org - Documentation, training, latest information,\r
     license and contact details.\r
-       \r
+\r
        http://www.FreeRTOS.org/plus - 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
@@ -141,6 +141,15 @@ typedef enum
        eDeleted                /* The task being queried has been deleted, but its TCB has not yet been freed. */\r
 } eTaskState;\r
 \r
+/* Possible return values for eTaskConfirmSleepModeStatus(). */\r
+typedef enum\r
+{\r
+       eAbortSleep = 0,                /* A task has been made ready or a context switch pended since portSUPPORESS_TICKS_AND_SLEEP() was called - abort entering a sleep mode. */\r
+       eStandardSleep,                 /* Enter a sleep mode that will not last any longer than the expected idle time. */\r
+       eNoTasksWaitingTimeout  /* No tasks are waiting for a timeout so it is safe to enter a sleep mode that can only be exited by an external interrupt. */\r
+} eSleepModeStatus;\r
+\r
+\r
 /*\r
  * Defines the priority used by the idle task.  This must not be modified.\r
  *\r
@@ -332,7 +341,7 @@ static const xTaskParameters xCheckTaskParameters =
        // the task, with appropriate access permissions.  Different processors have\r
        // different memory alignment requirements - refer to the FreeRTOS documentation\r
        // for full information.\r
-       {                                                                                       \r
+       {\r
                // Base address                                 Length  Parameters\r
         { cReadWriteArray,                             32,             portMPU_REGION_READ_WRITE },\r
         { cReadOnlyArray,                              32,             portMPU_REGION_READ_ONLY },\r
@@ -383,7 +392,7 @@ xTaskHandle xHandle;
 // ucOneKByte array.  The other two of the maximum 3 definable regions are\r
 // unused so set to zero.\r
 static const xMemoryRegion xAltRegions[ portNUM_CONFIGURABLE_REGIONS ] =\r
-{                                                                                      \r
+{\r
        // Base address         Length          Parameters\r
        { ucOneKByte,           1024,           portMPU_REGION_READ_WRITE },\r
        { 0,                            0,                      0 },\r
@@ -399,7 +408,7 @@ void vATask( void *pvParameters )
        // for this purpose.  NULL is used as the task handle to indicate that this\r
        // function should modify the MPU regions of the calling task.\r
        vTaskAllocateMPURegions( NULL, xAltRegions );\r
-       \r
+\r
        // Now the task can continue its function, but from this point on can only\r
        // access its stack and the ucOneKByte array (unless any other statically\r
        // defined or shared regions have been declared elsewhere).\r
@@ -618,7 +627,7 @@ unsigned portBASE_TYPE uxTaskPriorityGet( xTaskHandle xTask ) PRIVILEGED_FUNCTIO
  * INCLUDE_eTaskGetState must be defined as 1 for this function to be available.\r
  * See the configuration section for more information.\r
  *\r
- * Obtain the state of any task.  States are encoded by the eTaskState \r
+ * Obtain the state of any task.  States are encoded by the eTaskState\r
  * enumerated type.\r
  *\r
  * @param xTask Handle of the task to be queried.\r
@@ -1174,7 +1183,7 @@ constant. */
 portBASE_TYPE xTaskCallApplicationTaskHook( xTaskHandle xTask, void *pvParameter ) PRIVILEGED_FUNCTION;\r
 \r
 /**\r
- * xTaskGetIdleTaskHandle() is only available if \r
+ * xTaskGetIdleTaskHandle() is only available if\r
  * INCLUDE_xTaskGetIdleTaskHandle is set to 1 in FreeRTOSConfig.h.\r
  *\r
  * Simply returns the handle of the idle task.  It is not valid to call\r
@@ -1314,7 +1323,7 @@ signed portBASE_TYPE xTaskGenericCreate( pdTASK_CODE pxTaskCode, const signed ch
  */\r
 unsigned portBASE_TYPE uxTaskGetTaskNumber( xTaskHandle xTask );\r
 \r
-/* \r
+/*\r
  * Set the uxTCBNumber of the task referenced by the xTask parameter to\r
  * ucHandle.\r
  */\r
@@ -1329,6 +1338,21 @@ void vTaskSetTaskNumber( xTaskHandle xTask, unsigned portBASE_TYPE uxHandle );
  */\r
 void vTaskStepTick( portTickType xTicksToJump );\r
 \r
+/*\r
+ * Provided for use within portSUPPRESS_TICKS_AND_SLEEP() to allow the port\r
+ * specific sleep function to determine if it is ok to proceed with the sleep,\r
+ * and if it is ok to proceed, if it is ok to sleep indefinitely.\r
+ *\r
+ * This function is necessary because portSUPPRESS_TICKS_AND_SLEEP() is only\r
+ * called with the scheduler suspended, not from within a critical section.  It\r
+ * is therefore possible for an interrupt to request a context switch between\r
+ * portSUPPRESS_TICKS_AND_SLEEP() and the low power mode actually being\r
+ * entered.  eTaskConfirmSleepModeStatus() should be called from a short\r
+ * critical section between the timer being stopped and the sleep mode being\r
+ * entered to ensure it is ok to proceed into the sleep mode.\r
+ */\r
+eSleepModeStatus eTaskConfirmSleepModeStatus( void );\r
+\r
 #ifdef __cplusplus\r
 }\r
 #endif\r
index a97f868c1ae31eef94f4d0aa585a451daa336122..1dadf763a02460be819ee8893c502121cd41178a 100644 (file)
@@ -1251,7 +1251,11 @@ xQUEUE *pxQueue;
        configASSERT( pxQueue );\r
 \r
        traceQUEUE_DELETE( pxQueue );\r
-       prvQueueUnregisterQueue( pxQueue );\r
+       #if ( configQUEUE_REGISTRY_SIZE > 0 )\r
+       {\r
+               prvQueueUnregisterQueue( pxQueue );\r
+       }\r
+       #endif\r
        vPortFree( pxQueue->pcHead );\r
        vPortFree( pxQueue );\r
 }\r
index 854251261a0409aaa8fe98522873e67228c8d0b0..f1d1a0c0e0963b4e4ce8585a93d35e4c64657421 100644 (file)
@@ -84,6 +84,13 @@ task.h is included from an application file. */
 \r
 #undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE\r
 \r
+/* Sanity check the configuration. */\r
+#if configUSE_TICKLESS_IDLE != 0\r
+       #if INCLUDE_vTaskSuspend != 1\r
+               #error INCLUDE_vTaskSuspend must be set to 1 if configUSE_TICKLESS_IDLE is not set to 0\r
+       #endif /* INCLUDE_vTaskSuspend */\r
+#endif /* configUSE_TICKLESS_IDLE */\r
+\r
 /*\r
  * Defines the size, in words, of the stack allocated to the idle task.\r
  */\r
@@ -602,13 +609,14 @@ tskTCB * pxNewTCB;
                                uxTopUsedPriority = pxNewTCB->uxPriority;\r
                        }\r
 \r
+                       uxTaskNumber++;\r
+\r
                        #if ( configUSE_TRACE_FACILITY == 1 )\r
                        {\r
                                /* Add a counter into the TCB for tracing only. */\r
                                pxNewTCB->uxTCBNumber = uxTaskNumber;\r
                        }\r
                        #endif /* configUSE_TRACE_FACILITY */\r
-                       uxTaskNumber++;\r
                        traceTASK_CREATE( pxNewTCB );\r
 \r
                        prvAddTaskToReadyQueue( pxNewTCB );\r
@@ -974,11 +982,7 @@ tskTCB * pxNewTCB;
                                /* Remember the ready list the task might be referenced from\r
                                before its uxPriority member is changed so the\r
                                taskRESET_READY_PRIORITY() macro can function correctly. */\r
-                               #if ( configUSE_PORT_OPTIMISED_TASK_SELECTION != 0 )\r
-                               {\r
-                                       uxPriorityUsedOnEntry = pxTCB->uxPriority;\r
-                               }\r
-                               #endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */\r
+                               uxPriorityUsedOnEntry = pxTCB->uxPriority;\r
 \r
                                #if ( configUSE_MUTEXES == 1 )\r
                                {\r
@@ -1280,7 +1284,7 @@ portBASE_TYPE xReturn;
        }\r
        else\r
        {\r
-               /* This line will only be reached if the kernel could not be started, \r
+               /* This line will only be reached if the kernel could not be started,\r
                because there was not enough FreeRTOS heap to create the idle task\r
                or the timer task. */\r
                configASSERT( xReturn );\r
@@ -2171,6 +2175,46 @@ static portTASK_FUNCTION( prvIdleTask, pvParameters )
 } /*lint !e715 pvParameters is not accessed but all task functions require the same prototype. */\r
 /*-----------------------------------------------------------*/\r
 \r
+#if configUSE_TICKLESS_IDLE != 0\r
+\r
+       eSleepModeStatus eTaskConfirmSleepModeStatus( void )\r
+       {\r
+       eSleepModeStatus eReturn = eStandardSleep;\r
+\r
+               if( listCURRENT_LIST_LENGTH( &xPendingReadyList ) != 0 )\r
+               {\r
+                       /* A task was made ready while the scheduler was suspended. */\r
+                       eReturn = eAbortSleep;\r
+               }\r
+               else if( xMissedYield != pdFALSE )\r
+               {\r
+                       /* A yield was pended while the scheduler was suspended. */\r
+                       eReturn = eAbortSleep;\r
+               }\r
+               else\r
+               {\r
+                       #if configUSE_TIMERS == 0\r
+                       {\r
+                               /* The idle task exists in addition to the application tasks. */\r
+                               const unsigned portBASE_TYPE uxNonApplicationTasks = 1;\r
+\r
+                               /* If timers are not being used and all the tasks are in the\r
+                               suspended list (which might mean they have an infinite block\r
+                               time rather than actually being suspended) then it is safe to\r
+                               turn all clocks off and just wait for external initerrupts. */\r
+                               if( listCURRENT_LIST_LENGTH( &xSuspendedTasksList ) == ( uxCurrentNumberOfTasks - uxNonApplicationTasks ) )\r
+                               {\r
+                                       eReturn = eNoTasksWaitingTimeout;\r
+                               }\r
+                       }\r
+                       #endif /* configUSE_TIMERS */\r
+               }\r
+\r
+               return eReturn;\r
+       }\r
+#endif /* configUSE_TICKLESS_IDLE */\r
+/*-----------------------------------------------------------*/\r
+\r
 static void prvInitialiseTCBVariables( tskTCB *pxTCB, const signed char * const pcName, unsigned portBASE_TYPE uxPriority, const xMemoryRegion * const xRegions, unsigned short usStackDepth )\r
 {\r
        /* Store the function name in the TCB. */\r
@@ -2254,7 +2298,7 @@ static void prvInitialiseTCBVariables( tskTCB *pxTCB, const signed char * const
 \r
         vPortStoreTaskMPUSettings( &( pxTCB->xMPUSettings ), xRegions, NULL, 0 );\r
        }\r
-       \r
+\r
 #endif /* portUSING_MPU_WRAPPERS */\r
 /*-----------------------------------------------------------*/\r
 \r
@@ -2700,7 +2744,7 @@ tskTCB *pxNewTCB;
                                }\r
                        }\r
                }\r
-       } \r
+       }\r
 \r
 #endif /* portCRITICAL_NESTING_IN_TCB */\r
 /*-----------------------------------------------------------*/\r