]> git.sur5r.net Git - freertos/commitdiff
Added INCLUDE_xSemaphoreGetMutexHolder() default.
authorrichardbarry <richardbarry@1d2547de-c912-0410-9cb9-b8ca96c0e9e2>
Thu, 31 Jan 2013 14:18:03 +0000 (14:18 +0000)
committerrichardbarry <richardbarry@1d2547de-c912-0410-9cb9-b8ca96c0e9e2>
Thu, 31 Jan 2013 14:18:03 +0000 (14:18 +0000)
Changed eTaskStateGet() to eTaskGetState() and added #define to ensure backward compatibility.
Added configEXPECTED_IDLE_TIME_BEFORE_SLEEP definition - was previously hard coded to 2.
Slight change to the default CM3 tickless sleep function to allow the idle time to be set to zero in the pre-sleep processing macro.
Changed stack alignment for the FreeRTOS-MPU port to ensure it didn't trigger the assert() in the generic create function.

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

13 files changed:
FreeRTOS/Demo/WIN32-MSVC/FreeRTOSConfig.h
FreeRTOS/Demo/WIN32-MSVC/WIN32.suo
FreeRTOS/Source/include/FreeRTOS.h
FreeRTOS/Source/include/mpu_wrappers.h
FreeRTOS/Source/include/task.h
FreeRTOS/Source/portable/GCC/ARM_CM3/port.c
FreeRTOS/Source/portable/GCC/ARM_CM3_MPU/port.c
FreeRTOS/Source/portable/GCC/ARM_CM4F/port.c
FreeRTOS/Source/portable/IAR/ARM_CM3/port.c
FreeRTOS/Source/portable/IAR/ARM_CM4F/port.c
FreeRTOS/Source/portable/RVDS/ARM_CM3/port.c
FreeRTOS/Source/portable/RVDS/ARM_CM4F/port.c
FreeRTOS/Source/tasks.c

index 3e3795eae932c5f144568d795edef0008aa602e1..deb4a3c369651c1f6359df4d718027fa5665ece7 100644 (file)
@@ -139,4 +139,6 @@ version of the Win32 simulator projects.  It will be ignored in the GCC
 version. */\r
 #define configUSE_PORT_OPTIMISED_TASK_SELECTION 1\r
 \r
+#define configUSE_QUEUE_SETS 1\r
+\r
 #endif /* FREERTOS_CONFIG_H */\r
index 607824b98c06184d2e71aa3a54a93ac00118412f..1c3bbaa14f27896876461b37aa65a98c30b20959 100644 (file)
Binary files a/FreeRTOS/Demo/WIN32-MSVC/WIN32.suo and b/FreeRTOS/Demo/WIN32-MSVC/WIN32.suo differ
index 99df4acda68ebf52382cb53af23a42023231572d..93a8e1499910defc5665045346686d75d3408bf8 100644 (file)
@@ -161,6 +161,10 @@ typedef portBASE_TYPE (*pdTASK_HOOK_CODE)( void * );
        #define INCLUDE_xQueueGetMutexHolder 0\r
 #endif\r
 \r
+#ifndef INCLUDE_xSemaphoreGetMutexHolder\r
+       #define INCLUDE_xSemaphoreGetMutexHolder INCLUDE_xQueueGetMutexHolder\r
+#endif\r
+\r
 #ifndef INCLUDE_pcTaskGetTaskName\r
        #define INCLUDE_pcTaskGetTaskName 0\r
 #endif\r
@@ -173,8 +177,8 @@ typedef portBASE_TYPE (*pdTASK_HOOK_CODE)( void * );
        #define INCLUDE_uxTaskGetStackHighWaterMark 0\r
 #endif\r
 \r
-#ifndef INCLUDE_eTaskStateGet\r
-       #define INCLUDE_eTaskStateGet 0\r
+#ifndef INCLUDE_eTaskGetState\r
+       #define INCLUDE_eTaskGetState 0\r
 #endif\r
 \r
 #ifndef configUSE_RECURSIVE_MUTEXES\r
@@ -534,6 +538,14 @@ typedef portBASE_TYPE (*pdTASK_HOOK_CODE)( void * );
        #define portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime )\r
 #endif\r
 \r
+#ifndef configEXPECTED_IDLE_TIME_BEFORE_SLEEP\r
+       #define configEXPECTED_IDLE_TIME_BEFORE_SLEEP 2\r
+#endif\r
+\r
+#if configEXPECTED_IDLE_TIME_BEFORE_SLEEP < 2\r
+       #error configEXPECTED_IDLE_TIME_BEFORE_SLEEP must not be less than 2\r
+#endif\r
+\r
 #ifndef configUSE_TICKLESS_IDLE\r
        #define configUSE_TICKLESS_IDLE 0\r
 #endif\r
@@ -546,5 +558,9 @@ typedef portBASE_TYPE (*pdTASK_HOOK_CODE)( void * );
        #define configPOST_SLEEP_PROCESSING( x )\r
 #endif\r
 \r
+/* For backward compatability. */\r
+#define eTaskStateGet eTaskGetState\r
+#define INCLUDE_eTaskStateGet INCLUDE_eTaskGetState\r
+\r
 #endif /* INC_FREERTOS_H */\r
 \r
index 299e8d00ecf14455b023ad80b0aceb02c6eb600d..b2ded270cfb787f93c99338e6199ab27a7b82f74 100644 (file)
@@ -85,7 +85,7 @@ only for ports that are using the MPU. */
                #define vTaskDelay                                              MPU_vTaskDelay\r
                #define uxTaskPriorityGet                               MPU_uxTaskPriorityGet\r
                #define vTaskPrioritySet                                MPU_vTaskPrioritySet\r
-               #define eTaskStateGet                                   MPU_eTaskStateGet\r
+               #define eTaskGetState                                   MPU_eTaskGetState\r
                #define vTaskSuspend                                    MPU_vTaskSuspend\r
                #define xTaskIsTaskSuspended                    MPU_xTaskIsTaskSuspended\r
                #define vTaskResume                                             MPU_vTaskResume\r
index b6a7818a88443ec09a3bbfa9d9354e088bd9cba4..b4d359cddf713292507d8ef22612f65da8671dd9 100644 (file)
@@ -131,7 +131,7 @@ typedef struct xTASK_PARAMTERS
        xMemoryRegion xRegions[ portNUM_CONFIGURABLE_REGIONS ];\r
 } xTaskParameters;\r
 \r
-/* Task states returned by eTaskStateGet. */\r
+/* Task states returned by eTaskGetState. */\r
 typedef enum\r
 {\r
        eRunning = 0,   /* A task is querying the state of itself, so must be running. */\r
@@ -613,9 +613,9 @@ unsigned portBASE_TYPE uxTaskPriorityGet( xTaskHandle pxTask ) PRIVILEGED_FUNCTI
 \r
 /**\r
  * task. h\r
- * <pre>eTaskState eTaskStateGet( xTaskHandle pxTask );</pre>\r
+ * <pre>eTaskState eTaskGetState( xTaskHandle pxTask );</pre>\r
  *\r
- * INCLUDE_eTaskStateGet must be defined as 1 for this function to be available.\r
+ * 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
@@ -627,7 +627,7 @@ unsigned portBASE_TYPE uxTaskPriorityGet( xTaskHandle pxTask ) PRIVILEGED_FUNCTI
  * state of the task might change between the function being called, and the\r
  * functions return value being tested by the calling task.\r
  */\r
-eTaskState eTaskStateGet( xTaskHandle pxTask ) PRIVILEGED_FUNCTION;\r
+eTaskState eTaskGetState( xTaskHandle pxTask ) PRIVILEGED_FUNCTION;\r
 \r
 /**\r
  * task. h\r
index 206f484f58b3f7972d466b70e27b56842e97d8ec..286b19ac4b7102f6c5dd5e258c1fae8913680fa9 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
@@ -116,7 +116,7 @@ static unsigned portBASE_TYPE uxCriticalNesting = 0xaaaaaaaa;
 \r
 /*\r
  * Setup the timer to generate the tick interrupts.  The implementation in this\r
- * file is weak to allow application writers to change the timer used to \r
+ * file is weak to allow application writers to change the timer used to\r
  * generate the tick interrupt.\r
  */\r
 void vPortSetupTimerInterrupt( void );\r
@@ -298,7 +298,7 @@ __attribute__(( naked )) void vPortClearInterruptMask( unsigned long ulNewMaskVa
                "       bx lr                                                                                           \n" \\r
                :::"r0"                                                                                                         \\r
        );\r
-       \r
+\r
        /* Just to avoid compiler warnings. */\r
        ( void ) ulNewMaskValue;\r
 }\r
@@ -347,7 +347,7 @@ void xPortSysTickHandler( void )
        #endif\r
 \r
        /* Only reset the systick load register if configUSE_TICKLESS_IDLE is set to\r
-       1.  If it is set to 0 tickless idle is not being used.  If it is set to a \r
+       1.  If it is set to 0 tickless idle is not being used.  If it is set to a\r
        value other than 0 or 1 then a timer other than the SysTick is being used\r
        to generate the tick interrupt. */\r
        #if configUSE_TICKLESS_IDLE == 1\r
@@ -367,6 +367,7 @@ void xPortSysTickHandler( void )
        __attribute__((weak)) void vPortSuppressTicksAndSleep( portTickType xExpectedIdleTime )\r
        {\r
        unsigned long ulReloadValue, ulCompleteTickPeriods, ulCompletedSysTickIncrements;\r
+       portTickType xModifiableIdleTime;\r
 \r
                /* Make sure the SysTick reload value does not overflow the counter. */\r
                if( xExpectedIdleTime > xMaximumPossibleSuppressedTicks )\r
@@ -412,9 +413,14 @@ void xPortSysTickHandler( void )
                        /* Restart SysTick. */\r
                        portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT;\r
 \r
-                       /* Sleep until something happens. */\r
-                       configPRE_SLEEP_PROCESSING( xExpectedIdleTime );\r
-                       if( xExpectedIdleTime > 0 )\r
+                       /* Sleep until something happens.  configPRE_SLEEP_PROCESSING() can\r
+                       set its parameter to 0 to indicate that its implementation contains\r
+                       its own wait for interrupt or wait for event instruction, and so wfi\r
+                       should not be executed again.  However, the original expected idle\r
+                       time variable must remain unmodified, so a copy is taken. */\r
+                       xModifiableIdleTime = xExpectedIdleTime;\r
+                       configPRE_SLEEP_PROCESSING( xModifiableIdleTime );\r
+                       if( xModifiableIdleTime > 0 )\r
                        {\r
                                __asm volatile( "wfi" );\r
                        }\r
@@ -475,7 +481,7 @@ void xPortSysTickHandler( void )
  */\r
 __attribute__(( weak )) void vPortSetupTimerInterrupt( void )\r
 {\r
-       /* Calculate the constants required to configure the tick interrupt. */         \r
+       /* Calculate the constants required to configure the tick interrupt. */\r
        #if configUSE_TICKLESS_IDLE == 1\r
        {\r
                ulTimerReloadValueForOneTick = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL;\r
index 514b88e80dbc4b9f50259856325501ee9372e3fa..2c79740d2a558588fe414bc202535b51535bda5f 100644 (file)
@@ -180,7 +180,7 @@ void MPU_vTaskDelayUntil( portTickType * const pxPreviousWakeTime, portTickType
 void MPU_vTaskDelay( portTickType xTicksToDelay );\r
 unsigned portBASE_TYPE MPU_uxTaskPriorityGet( xTaskHandle pxTask );\r
 void MPU_vTaskPrioritySet( xTaskHandle pxTask, unsigned portBASE_TYPE uxNewPriority );\r
-eTaskState MPU_eTaskStateGet( xTaskHandle pxTask );\r
+eTaskState MPU_eTaskGetState( xTaskHandle pxTask );\r
 void MPU_vTaskSuspend( xTaskHandle pxTaskToSuspend );\r
 signed portBASE_TYPE MPU_xTaskIsTaskSuspended( xTaskHandle xTask );\r
 void MPU_vTaskResume( xTaskHandle pxTaskToResume );\r
@@ -223,6 +223,7 @@ portSTACK_TYPE *pxPortInitialiseStack( portSTACK_TYPE *pxTopOfStack, pdTASK_CODE
        /* Simulate the stack frame as it would be created by a context switch\r
        interrupt. */\r
        pxTopOfStack--; /* Offset added to account for the way the MCU uses the stack on entry/exit of interrupts. */\r
+       pxTopOfStack--; /* Offset added to ensure 8-byte alignment is maintained. */\r
        *pxTopOfStack = portINITIAL_XPSR;       /* xPSR */\r
        pxTopOfStack--;\r
        *pxTopOfStack = ( portSTACK_TYPE ) pxCode;      /* PC */\r
@@ -736,13 +737,13 @@ portBASE_TYPE xRunningPrivileged = prvRaisePrivilege();
 #endif\r
 /*-----------------------------------------------------------*/\r
 \r
-#if ( INCLUDE_eTaskStateGet == 1 )\r
-       eTaskState MPU_eTaskStateGet( xTaskHandle pxTask )\r
+#if ( INCLUDE_eTaskGetState == 1 )\r
+       eTaskState MPU_eTaskGetState( xTaskHandle pxTask )\r
        {\r
     portBASE_TYPE xRunningPrivileged = prvRaisePrivilege();\r
        eTaskState eReturn;\r
 \r
-               eReturn = eTaskStateGet( pxTask );\r
+               eReturn = eTaskGetState( pxTask );\r
         portRESET_PRIVILEGE( xRunningPrivileged );\r
                return eReturn;\r
        }\r
index b9394cc550702e5a40d329cdd69253ccf33c2449..c3d095a387eebcf77bd130c0858424b4cd935aa6 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
@@ -118,7 +118,7 @@ static unsigned portBASE_TYPE uxCriticalNesting = 0xaaaaaaaa;
 \r
 /*\r
  * Setup the timer to generate the tick interrupts.  The implementation in this\r
- * file is weak to allow application writers to change the timer used to \r
+ * file is weak to allow application writers to change the timer used to\r
  * generate the tick interrupt.\r
  */\r
 void vPortSetupTimerInterrupt( void );\r
@@ -379,7 +379,7 @@ void xPortSysTickHandler( void )
        #endif\r
 \r
        /* Only reset the systick load register if configUSE_TICKLESS_IDLE is set to\r
-       1.  If it is set to 0 tickless idle is not being used.  If it is set to a \r
+       1.  If it is set to 0 tickless idle is not being used.  If it is set to a\r
        value other than 0 or 1 then a timer other than the SysTick is being used\r
        to generate the tick interrupt. */\r
        #if configUSE_TICKLESS_IDLE == 1\r
@@ -399,6 +399,7 @@ void xPortSysTickHandler( void )
        __attribute__((weak)) void vPortSuppressTicksAndSleep( portTickType xExpectedIdleTime )\r
        {\r
        unsigned long ulReloadValue, ulCompleteTickPeriods, ulCompletedSysTickIncrements;\r
+       portTickType xModifiableIdleTime;\r
 \r
                /* Make sure the SysTick reload value does not overflow the counter. */\r
                if( xExpectedIdleTime > xMaximumPossibleSuppressedTicks )\r
@@ -444,9 +445,14 @@ void xPortSysTickHandler( void )
                        /* Restart SysTick. */\r
                        portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT;\r
 \r
-                       /* Sleep until something happens. */\r
-                       configPRE_SLEEP_PROCESSING( xExpectedIdleTime );\r
-                       if( xExpectedIdleTime > 0 )\r
+                       /* Sleep until something happens.  configPRE_SLEEP_PROCESSING() can\r
+                       set its parameter to 0 to indicate that its implementation contains\r
+                       its own wait for interrupt or wait for event instruction, and so wfi\r
+                       should not be executed again.  However, the original expected idle\r
+                       time variable must remain unmodified, so a copy is taken. */\r
+                       xModifiableIdleTime = xExpectedIdleTime;\r
+                       configPRE_SLEEP_PROCESSING( xModifiableIdleTime );\r
+                       if( xModifiableIdleTime > 0 )\r
                        {\r
                                __asm volatile( "wfi" );\r
                        }\r
@@ -507,7 +513,7 @@ void xPortSysTickHandler( void )
  */\r
 __attribute__(( weak )) void vPortSetupTimerInterrupt( void )\r
 {\r
-       /* Calculate the constants required to configure the tick interrupt. */         \r
+       /* Calculate the constants required to configure the tick interrupt. */\r
        #if configUSE_TICKLESS_IDLE == 1\r
        {\r
                ulTimerReloadValueForOneTick = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL;\r
index c501e72594bbe98c44b8a28ad99bbf4838164d46..c538e6dc7c2b0397a0b5d3970b77bd69f92abdb1 100644 (file)
@@ -265,6 +265,7 @@ void xPortSysTickHandler( void )
        __weak void vPortSuppressTicksAndSleep( portTickType xExpectedIdleTime )\r
        {\r
        unsigned long ulReloadValue, ulCompleteTickPeriods, ulCompletedSysTickIncrements;\r
+       portTickType xModifiableIdleTime;\r
 \r
                /* Make sure the SysTick reload value does not overflow the counter. */\r
                if( xExpectedIdleTime > xMaximumPossibleSuppressedTicks )\r
@@ -310,9 +311,14 @@ void xPortSysTickHandler( void )
                        /* Restart SysTick. */\r
                        portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT;\r
 \r
-                       /* Sleep until something happens. */\r
-                       configPRE_SLEEP_PROCESSING( xExpectedIdleTime );\r
-                       if( xExpectedIdleTime > 0 )\r
+                       /* Sleep until something happens.  configPRE_SLEEP_PROCESSING() can\r
+                       set its parameter to 0 to indicate that its implementation contains\r
+                       its own wait for interrupt or wait for event instruction, and so wfi\r
+                       should not be executed again.  However, the original expected idle\r
+                       time variable must remain unmodified, so a copy is taken. */\r
+                       xModifiableIdleTime = xExpectedIdleTime;\r
+                       configPRE_SLEEP_PROCESSING( xModifiableIdleTime );\r
+                       if( xModifiableIdleTime > 0 )\r
                        {\r
                                __WFI();\r
                        }\r
@@ -373,7 +379,7 @@ void xPortSysTickHandler( void )
  */\r
 __weak void vPortSetupTimerInterrupt( void )\r
 {\r
-       /* Calculate the constants required to configure the tick interrupt. */         \r
+       /* Calculate the constants required to configure the tick interrupt. */\r
        #if configUSE_TICKLESS_IDLE == 1\r
        {\r
                ulTimerReloadValueForOneTick = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL;\r
index f6434caeff72cb4fba0694b65129d935c3368b72..5f1a8fe6c61ef2719004438098df121db45af218 100644 (file)
@@ -290,6 +290,7 @@ void xPortSysTickHandler( void )
        __weak void vPortSuppressTicksAndSleep( portTickType xExpectedIdleTime )\r
        {\r
        unsigned long ulReloadValue, ulCompleteTickPeriods, ulCompletedSysTickIncrements;\r
+       portTickType xModifiableIdleTime;\r
 \r
                /* Make sure the SysTick reload value does not overflow the counter. */\r
                if( xExpectedIdleTime > xMaximumPossibleSuppressedTicks )\r
@@ -335,9 +336,14 @@ void xPortSysTickHandler( void )
                        /* Restart SysTick. */\r
                        portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT;\r
 \r
-                       /* Sleep until something happens. */\r
-                       configPRE_SLEEP_PROCESSING( xExpectedIdleTime );\r
-                       if( xExpectedIdleTime > 0 )\r
+                       /* Sleep until something happens.  configPRE_SLEEP_PROCESSING() can\r
+                       set its parameter to 0 to indicate that its implementation contains\r
+                       its own wait for interrupt or wait for event instruction, and so wfi\r
+                       should not be executed again.  However, the original expected idle\r
+                       time variable must remain unmodified, so a copy is taken. */\r
+                       xModifiableIdleTime = xExpectedIdleTime;\r
+                       configPRE_SLEEP_PROCESSING( xModifiableIdleTime );\r
+                       if( xModifiableIdleTime > 0 )\r
                        {\r
                                __WFI();\r
                        }\r
index be3d8e64331d99a665e20a4b0bffbafc8e512372..0c8f29c3b6814ed9324aee18fedabe1098843910 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
@@ -88,7 +88,7 @@
 \r
 /* The __weak attribute does not work as you might expect with the Keil tools\r
 so the configOVERRIDE_DEFAULT_TICK_CONFIGURATION constant must be set to 1 if\r
-the application writer wants to provide their own implementation of \r
+the application writer wants to provide their own implementation of\r
 vPortSetupTimerInterrupt().  Ensure configOVERRIDE_DEFAULT_TICK_CONFIGURATION\r
 is defined. */\r
 #ifndef configOVERRIDE_DEFAULT_TICK_CONFIGURATION\r
@@ -122,7 +122,7 @@ static unsigned portBASE_TYPE uxCriticalNesting = 0xaaaaaaaa;
 \r
 /*\r
  * Setup the timer to generate the tick interrupts.  The implementation in this\r
- * file is weak to allow application writers to change the timer used to \r
+ * file is weak to allow application writers to change the timer used to\r
  * generate the tick interrupt.\r
  */\r
 void vPortSetupTimerInterrupt( void );\r
@@ -319,7 +319,7 @@ void xPortSysTickHandler( void )
        #endif\r
 \r
        /* Only reset the systick load register if configUSE_TICKLESS_IDLE is set to\r
-       1.  If it is set to 0 tickless idle is not being used.  If it is set to a \r
+       1.  If it is set to 0 tickless idle is not being used.  If it is set to a\r
        value other than 0 or 1 then a timer other than the SysTick is being used\r
        to generate the tick interrupt. */\r
        #if configUSE_TICKLESS_IDLE == 1\r
@@ -339,6 +339,7 @@ void xPortSysTickHandler( void )
        __weak void vPortSuppressTicksAndSleep( portTickType xExpectedIdleTime )\r
        {\r
        unsigned long ulReloadValue, ulCompleteTickPeriods, ulCompletedSysTickIncrements;\r
+       portTickType xModifiableIdleTime;\r
 \r
                /* Make sure the SysTick reload value does not overflow the counter. */\r
                if( xExpectedIdleTime > xMaximumPossibleSuppressedTicks )\r
@@ -384,9 +385,14 @@ void xPortSysTickHandler( void )
                        /* Restart SysTick. */\r
                        portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT;\r
 \r
-                       /* Sleep until something happens. */\r
-                       configPRE_SLEEP_PROCESSING( xExpectedIdleTime );\r
-                       if( xExpectedIdleTime > 0 )\r
+                       /* Sleep until something happens.  configPRE_SLEEP_PROCESSING() can\r
+                       set its parameter to 0 to indicate that its implementation contains\r
+                       its own wait for interrupt or wait for event instruction, and so wfi\r
+                       should not be executed again.  However, the original expected idle\r
+                       time variable must remain unmodified, so a copy is taken. */\r
+                       xModifiableIdleTime = xExpectedIdleTime;\r
+                       configPRE_SLEEP_PROCESSING( xModifiableIdleTime );\r
+                       if( xModifiableIdleTime > 0 )\r
                        {\r
                                __wfi();\r
                        }\r
@@ -450,7 +456,7 @@ void xPortSysTickHandler( void )
 \r
        void vPortSetupTimerInterrupt( void )\r
        {\r
-               /* Calculate the constants required to configure the tick interrupt. */         \r
+               /* Calculate the constants required to configure the tick interrupt. */\r
                #if configUSE_TICKLESS_IDLE == 1\r
                {\r
                        ulTimerReloadValueForOneTick = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL;\r
@@ -458,12 +464,12 @@ void xPortSysTickHandler( void )
                        ulStoppedTimerCompensation = 45UL / ( configCPU_CLOCK_HZ / configSYSTICK_CLOCK_HZ );\r
                }\r
                #endif /* configUSE_TICKLESS_IDLE */\r
-       \r
+\r
                /* Configure SysTick to interrupt at the requested rate. */\r
                portNVIC_SYSTICK_LOAD_REG = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL;;\r
                portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT;\r
        }\r
-       \r
+\r
 #endif /* configOVERRIDE_DEFAULT_TICK_CONFIGURATION */\r
 /*-----------------------------------------------------------*/\r
 \r
index 2c2c4c79aa7da8f270017585871e7b2caeaee812..147ebcbdff3d3d69c9a180b5a455085d2830e85c 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
@@ -88,7 +88,7 @@
 \r
 /* The __weak attribute does not work as you might expect with the Keil tools\r
 so the configOVERRIDE_DEFAULT_TICK_CONFIGURATION constant must be set to 1 if\r
-the application writer wants to provide their own implementation of \r
+the application writer wants to provide their own implementation of\r
 vPortSetupTimerInterrupt().  Ensure configOVERRIDE_DEFAULT_TICK_CONFIGURATION\r
 is defined. */\r
 #ifndef configOVERRIDE_DEFAULT_TICK_CONFIGURATION\r
@@ -127,7 +127,7 @@ static unsigned portBASE_TYPE uxCriticalNesting = 0xaaaaaaaa;
 \r
 /*\r
  * Setup the timer to generate the tick interrupts.  The implementation in this\r
- * file is weak to allow application writers to change the timer used to \r
+ * file is weak to allow application writers to change the timer used to\r
  * generate the tick interrupt.\r
  */\r
 void vPortSetupTimerInterrupt( void );\r
@@ -382,7 +382,7 @@ void xPortSysTickHandler( void )
        #endif\r
 \r
        /* Only reset the systick load register if configUSE_TICKLESS_IDLE is set to\r
-       1.  If it is set to 0 tickless idle is not being used.  If it is set to a \r
+       1.  If it is set to 0 tickless idle is not being used.  If it is set to a\r
        value other than 0 or 1 then a timer other than the SysTick is being used\r
        to generate the tick interrupt. */\r
        #if configUSE_TICKLESS_IDLE == 1\r
@@ -402,6 +402,7 @@ void xPortSysTickHandler( void )
        __weak void vPortSuppressTicksAndSleep( portTickType xExpectedIdleTime )\r
        {\r
        unsigned long ulReloadValue, ulCompleteTickPeriods, ulCompletedSysTickIncrements;\r
+       portTickType xModifiableIdleTime;\r
 \r
                /* Make sure the SysTick reload value does not overflow the counter. */\r
                if( xExpectedIdleTime > xMaximumPossibleSuppressedTicks )\r
@@ -447,9 +448,14 @@ void xPortSysTickHandler( void )
                        /* Restart SysTick. */\r
                        portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT;\r
 \r
-                       /* Sleep until something happens. */\r
-                       configPRE_SLEEP_PROCESSING( xExpectedIdleTime );\r
-                       if( xExpectedIdleTime > 0 )\r
+                       /* Sleep until something happens.  configPRE_SLEEP_PROCESSING() can\r
+                       set its parameter to 0 to indicate that its implementation contains\r
+                       its own wait for interrupt or wait for event instruction, and so wfi\r
+                       should not be executed again.  However, the original expected idle\r
+                       time variable must remain unmodified, so a copy is taken. */\r
+                       xModifiableIdleTime = xExpectedIdleTime;\r
+                       configPRE_SLEEP_PROCESSING( xModifiableIdleTime );\r
+                       if( xModifiableIdleTime > 0 )\r
                        {\r
                                __wfi();\r
                        }\r
@@ -513,7 +519,7 @@ void xPortSysTickHandler( void )
 \r
        void vPortSetupTimerInterrupt( void )\r
        {\r
-               /* Calculate the constants required to configure the tick interrupt. */         \r
+               /* Calculate the constants required to configure the tick interrupt. */\r
                #if configUSE_TICKLESS_IDLE == 1\r
                {\r
                        ulTimerReloadValueForOneTick = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL;\r
@@ -521,12 +527,12 @@ void xPortSysTickHandler( void )
                        ulStoppedTimerCompensation = 45UL / ( configCPU_CLOCK_HZ / configSYSTICK_CLOCK_HZ );\r
                }\r
                #endif /* configUSE_TICKLESS_IDLE */\r
-       \r
+\r
                /* Configure SysTick to interrupt at the requested rate. */\r
                portNVIC_SYSTICK_LOAD_REG = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL;;\r
                portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT;\r
        }\r
-       \r
+\r
 #endif /* configOVERRIDE_DEFAULT_TICK_CONFIGURATION */\r
 /*-----------------------------------------------------------*/\r
 \r
index 56fc50507584e586d63f1e6b32414bc659a37b18..ab95fbd68737711e97a8c4c3ae9d3e78918be061 100644 (file)
@@ -620,7 +620,7 @@ tskTCB * pxNewTCB;
                        prvAddTaskToReadyQueue( pxNewTCB );\r
 \r
                        xReturn = pdPASS;\r
-                       portSETUP_TCB( pxNewTCB );                      \r
+                       portSETUP_TCB( pxNewTCB );\r
                }\r
                taskEXIT_CRITICAL();\r
        }\r
@@ -840,9 +840,9 @@ tskTCB * pxNewTCB;
 #endif\r
 /*-----------------------------------------------------------*/\r
 \r
-#if ( INCLUDE_eTaskStateGet == 1 )\r
+#if ( INCLUDE_eTaskGetState == 1 )\r
 \r
-       eTaskState eTaskStateGet( xTaskHandle pxTask )\r
+       eTaskState eTaskGetState( xTaskHandle pxTask )\r
        {\r
        eTaskState eReturn;\r
        xList *pxStateList;\r
@@ -1322,10 +1322,10 @@ void vTaskSuspendAll( void )
 \r
 #if ( configUSE_TICKLESS_IDLE != 0 )\r
 \r
-       portTickType prvGetExpectedIdleTime( void )\r
+       static portTickType prvGetExpectedIdleTime( void )\r
        {\r
        portTickType xReturn;\r
-       \r
+\r
                if( pxCurrentTCB->uxPriority > tskIDLE_PRIORITY )\r
                {\r
                        xReturn = 0;\r
@@ -1341,7 +1341,7 @@ void vTaskSuspendAll( void )
                {\r
                        xReturn = xNextTaskUnblockTime - xTickCount;\r
                }\r
-       \r
+\r
                return xReturn;\r
        }\r
 \r
@@ -1638,14 +1638,14 @@ unsigned portBASE_TYPE uxTaskGetNumberOfTasks( void )
 /*----------------------------------------------------------*/\r
 \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
+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
-               configASSERT( xTicksToJump <= xNextTaskUnblockTime );\r
+               configASSERT( ( xTickCount + xTicksToJump ) <= xNextTaskUnblockTime );\r
                xTickCount += xTicksToJump;\r
        }\r
 \r
@@ -1942,7 +1942,7 @@ portTickType xTimeToWake;
                /* Calculate the time at which the task should be woken if the event does\r
                not occur.  This may overflow but this doesn't matter. */\r
                xTimeToWake = xTickCount + xTicksToWait;\r
-               \r
+\r
                traceTASK_DELAY_UNTIL();\r
                prvAddCurrentTaskToDelayedList( xTimeToWake );\r
        }\r
@@ -2165,13 +2165,6 @@ static portTASK_FUNCTION( prvIdleTask, pvParameters )
                #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
-               the end of the current time slice.  The idle time must be at least\r
-               2 to ensure any pended ticks between this point and the tick being\r
-               stopped can be legitimately stepped over when the tick suppression\r
-               routines returns. */\r
-               const portTickType xMinimumExpectedIdleTime = ( portTickType ) 2;\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
@@ -2179,7 +2172,7 @@ static portTASK_FUNCTION( prvIdleTask, pvParameters )
                        valid. */\r
                        xExpectedIdleTime = prvGetExpectedIdleTime();\r
 \r
-                       if( xExpectedIdleTime >= xMinimumExpectedIdleTime )\r
+                       if( xExpectedIdleTime >= configEXPECTED_IDLE_TIME_BEFORE_SLEEP )\r
                        {\r
                                vTaskSuspendAll();\r
                                {\r
@@ -2189,7 +2182,7 @@ static portTASK_FUNCTION( prvIdleTask, pvParameters )
                                        configASSERT( xNextTaskUnblockTime >= xTickCount );\r
                                        xExpectedIdleTime = prvGetExpectedIdleTime();\r
 \r
-                                       if( xExpectedIdleTime >= xMinimumExpectedIdleTime )\r
+                                       if( xExpectedIdleTime >= configEXPECTED_IDLE_TIME_BEFORE_SLEEP )\r
                                        {\r
                                                portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime );\r
                                        }\r