]> git.sur5r.net Git - freertos/commitdiff
Make CM3/4 tick configuration a weak function to allow application writers to use...
authorrichardbarry <richardbarry@1d2547de-c912-0410-9cb9-b8ca96c0e9e2>
Mon, 29 Oct 2012 15:56:26 +0000 (15:56 +0000)
committerrichardbarry <richardbarry@1d2547de-c912-0410-9cb9-b8ca96c0e9e2>
Mon, 29 Oct 2012 15:56:26 +0000 (15:56 +0000)
git-svn-id: https://svn.code.sf.net/p/freertos/code/trunk@1803 1d2547de-c912-0410-9cb9-b8ca96c0e9e2

FreeRTOS/Source/include/FreeRTOS.h
FreeRTOS/Source/portable/GCC/ARM_CM3/port.c
FreeRTOS/Source/portable/GCC/ARM_CM4F/port.c
FreeRTOS/Source/portable/GCC/ARM_CM4F/portmacro.h
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 c9eda0fd735e75be4ff3b29cfa834443309ead07..2c0c28d8cf661ecee04faf6969f916d5766e01b4 100644 (file)
@@ -535,11 +535,11 @@ typedef portBASE_TYPE (*pdTASK_HOOK_CODE)( void * );
 #endif\r
 \r
 #ifndef configPRE_SLEEP_PROCESSING\r
-       #define configPRE_SLEEP_PROCESSING()\r
+       #define configPRE_SLEEP_PROCESSING( x )\r
 #endif\r
 \r
 #ifndef configPOST_SLEEP_PROCESSING\r
-       #define configPOST_SLEEP_PROCESSING()\r
+       #define configPOST_SLEEP_PROCESSING( x )\r
 #endif\r
 \r
 #endif /* INC_FREERTOS_H */\r
index 4401094894c2e9ad64ed916d7178f55e487c7363..206f484f58b3f7972d466b70e27b56842e97d8ec 100644 (file)
@@ -83,15 +83,7 @@ FreeRTOS.org versions prior to V4.4.0 did not include this definition. */
 \r
 #ifndef configSYSTICK_CLOCK_HZ\r
        #define configSYSTICK_CLOCK_HZ configCPU_CLOCK_HZ\r
-       #if configUSE_TICKLESS_IDLE == 1\r
-               static const unsigned long ulStoppedTimerCompensation = 45UL;\r
-       #endif\r
-#else /* configSYSTICK_CLOCK_HZ */\r
-       #if configUSE_TICKLESS_IDLE == 1\r
-               /* Assumes the SysTick clock is slower than the CPU clock. */\r
-               static const unsigned long ulStoppedTimerCompensation = 45UL / ( configCPU_CLOCK_HZ / configSYSTICK_CLOCK_HZ );\r
-       #endif\r
-#endif /* configSYSTICK_CLOCK_HZ */\r
+#endif\r
 \r
 /* Constants required to manipulate the core.  Registers first... */\r
 #define portNVIC_SYSTICK_CTRL_REG                      ( * ( ( volatile unsigned long * ) 0xe000e010 ) )\r
@@ -123,9 +115,11 @@ variable. */
 static unsigned portBASE_TYPE uxCriticalNesting = 0xaaaaaaaa;\r
 \r
 /*\r
- * Setup the timer to generate the tick interrupts.\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
+ * generate the tick interrupt.\r
  */\r
-static void prvSetupTimerInterrupt( void );\r
+void vPortSetupTimerInterrupt( void );\r
 \r
 /*\r
  * Exception handlers.\r
@@ -144,7 +138,9 @@ static void prvPortStartFirstTask( void ) __attribute__ (( naked ));
 /*\r
  * The number of SysTick increments that make up one tick period.\r
  */\r
-static unsigned long ulTimerReloadValueForOneTick = 0;\r
+#if configUSE_TICKLESS_IDLE == 1\r
+       static unsigned long ulTimerReloadValueForOneTick = 0;\r
+#endif\r
 \r
 /*\r
  * The maximum number of tick periods that can be suppressed is limited by the\r
@@ -154,6 +150,13 @@ static unsigned long ulTimerReloadValueForOneTick = 0;
        static unsigned long xMaximumPossibleSuppressedTicks = 0;\r
 #endif /* configUSE_TICKLESS_IDLE */\r
 \r
+/*\r
+ * Compensate for the CPU cycles that pass while the SysTick is stopped (low\r
+ * power functionality only.\r
+ */\r
+#if configUSE_TICKLESS_IDLE == 1\r
+       static unsigned long ulStoppedTimerCompensation = 0;\r
+#endif /* configUSE_TICKLESS_IDLE */\r
 \r
 /*-----------------------------------------------------------*/\r
 \r
@@ -226,7 +229,7 @@ portBASE_TYPE xPortStartScheduler( void )
 \r
        /* Start the timer that generates the tick ISR.  Interrupts are disabled\r
        here already. */\r
-       prvSetupTimerInterrupt();\r
+       vPortSetupTimerInterrupt();\r
 \r
        /* Initialise the critical nesting count ready for the first task. */\r
        uxCriticalNesting = 0;\r
@@ -295,6 +298,9 @@ __attribute__(( naked )) void vPortClearInterruptMask( unsigned long ulNewMaskVa
                "       bx lr                                                                                           \n" \\r
                :::"r0"                                                                                                         \\r
        );\r
+       \r
+       /* Just to avoid compiler warnings. */\r
+       ( void ) ulNewMaskValue;\r
 }\r
 /*-----------------------------------------------------------*/\r
 \r
@@ -340,6 +346,10 @@ void xPortSysTickHandler( void )
                portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT;\r
        #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
+       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
                portNVIC_SYSTICK_LOAD_REG = ulTimerReloadValueForOneTick;\r
        #endif\r
@@ -403,9 +413,12 @@ void xPortSysTickHandler( void )
                        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();\r
-                       __asm volatile( "wfi" );\r
-                       configPOST_SLEEP_PROCESSING();\r
+                       configPRE_SLEEP_PROCESSING( xExpectedIdleTime );\r
+                       if( xExpectedIdleTime > 0 )\r
+                       {\r
+                               __asm volatile( "wfi" );\r
+                       }\r
+                       configPOST_SLEEP_PROCESSING( xExpectedIdleTime );\r
 \r
                        /* Stop SysTick.  Again, the time the SysTick is stopped for is\r
                        accounted for as best it can be, but using the tickless mode will\r
@@ -460,16 +473,19 @@ void xPortSysTickHandler( void )
  * Setup the systick timer to generate the tick interrupts at the required\r
  * frequency.\r
  */\r
-void prvSetupTimerInterrupt( void )\r
+__attribute__(( weak )) void vPortSetupTimerInterrupt( void )\r
 {\r
-       /* Calculate the constants required to configure the tick interrupt. */\r
-       ulTimerReloadValueForOneTick = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL;\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
                xMaximumPossibleSuppressedTicks = 0xffffffUL / ( ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL );\r
+               ulStoppedTimerCompensation = 45UL / ( configCPU_CLOCK_HZ / configSYSTICK_CLOCK_HZ );\r
+       }\r
        #endif /* configUSE_TICKLESS_IDLE */\r
 \r
        /* Configure SysTick to interrupt at the requested rate. */\r
-       portNVIC_SYSTICK_LOAD_REG = ulTimerReloadValueForOneTick;\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
index 41da9a79e83b733a4993973a7539323110723fea..b9394cc550702e5a40d329cdd69253ccf33c2449 100644 (file)
 \r
 #ifndef configSYSTICK_CLOCK_HZ\r
        #define configSYSTICK_CLOCK_HZ configCPU_CLOCK_HZ\r
-       #if configUSE_TICKLESS_IDLE == 1\r
-               static const unsigned long ulStoppedTimerCompensation = 45UL;\r
-       #endif\r
-#else /* configSYSTICK_CLOCK_HZ */\r
-       #if configUSE_TICKLESS_IDLE == 1\r
-               /* Assumes the SysTick clock is slower than the CPU clock. */\r
-               static const unsigned long ulStoppedTimerCompensation = 45UL / ( configCPU_CLOCK_HZ / configSYSTICK_CLOCK_HZ );\r
-       #endif\r
-#endif /* configSYSTICK_CLOCK_HZ */\r
+#endif\r
 \r
 /* Constants required to manipulate the core.  Registers first... */\r
 #define portNVIC_SYSTICK_CTRL_REG                      ( * ( ( volatile unsigned long * ) 0xe000e010 ) )\r
@@ -125,9 +117,11 @@ variable. */
 static unsigned portBASE_TYPE uxCriticalNesting = 0xaaaaaaaa;\r
 \r
 /*\r
- * Setup the timer to generate the tick interrupts.\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
+ * generate the tick interrupt.\r
  */\r
-static void prvSetupTimerInterrupt( void );\r
+void vPortSetupTimerInterrupt( void );\r
 \r
 /*\r
  * Exception handlers.\r
@@ -151,7 +145,9 @@ static void prvPortStartFirstTask( void ) __attribute__ (( naked ));
 /*\r
  * The number of SysTick increments that make up one tick period.\r
  */\r
-static unsigned long ulTimerReloadValueForOneTick = 0;\r
+#if configUSE_TICKLESS_IDLE == 1\r
+       static unsigned long ulTimerReloadValueForOneTick = 0;\r
+#endif\r
 \r
 /*\r
  * The maximum number of tick periods that can be suppressed is limited by the\r
@@ -161,6 +157,13 @@ static unsigned long ulTimerReloadValueForOneTick = 0;
        static unsigned long xMaximumPossibleSuppressedTicks = 0;\r
 #endif /* configUSE_TICKLESS_IDLE */\r
 \r
+/*\r
+ * Compensate for the CPU cycles that pass while the SysTick is stopped (low\r
+ * power functionality only.\r
+ */\r
+#if configUSE_TICKLESS_IDLE == 1\r
+       static unsigned long ulStoppedTimerCompensation = 0;\r
+#endif /* configUSE_TICKLESS_IDLE */\r
 \r
 /*-----------------------------------------------------------*/\r
 \r
@@ -244,7 +247,7 @@ portBASE_TYPE xPortStartScheduler( void )
 \r
        /* Start the timer that generates the tick ISR.  Interrupts are disabled\r
        here already. */\r
-       prvSetupTimerInterrupt();\r
+       vPortSetupTimerInterrupt();\r
 \r
        /* Initialise the critical nesting count ready for the first task. */\r
        uxCriticalNesting = 0;\r
@@ -375,6 +378,10 @@ void xPortSysTickHandler( void )
                portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT;\r
        #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
+       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
                portNVIC_SYSTICK_LOAD_REG = ulTimerReloadValueForOneTick;\r
        #endif\r
@@ -438,9 +445,12 @@ void xPortSysTickHandler( void )
                        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();\r
-                       __asm volatile( "wfi" );\r
-                       configPOST_SLEEP_PROCESSING();\r
+                       configPRE_SLEEP_PROCESSING( xExpectedIdleTime );\r
+                       if( xExpectedIdleTime > 0 )\r
+                       {\r
+                               __asm volatile( "wfi" );\r
+                       }\r
+                       configPOST_SLEEP_PROCESSING( xExpectedIdleTime );\r
 \r
                        /* Stop SysTick.  Again, the time the SysTick is stopped for is\r
                        accounted for as best it can be, but using the tickless mode will\r
@@ -495,17 +505,19 @@ void xPortSysTickHandler( void )
  * Setup the systick timer to generate the tick interrupts at the required\r
  * frequency.\r
  */\r
-void prvSetupTimerInterrupt( void )\r
+__attribute__(( weak )) void vPortSetupTimerInterrupt( void )\r
 {\r
-       /* Calculate the constants required to configure the tick interrupt. */\r
-       ulTimerReloadValueForOneTick = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL;\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
                xMaximumPossibleSuppressedTicks = 0xffffffUL / ( ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL );\r
+               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 = ulTimerReloadValueForOneTick;\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
index d74c9bb2c5a0a64e7d492739f41773ff83677735..5bdcc58f007b3541e367524995a329d9b4425539 100644 (file)
@@ -111,9 +111,7 @@ extern "C" {
 \r
 /* Scheduler utilities. */\r
 extern void vPortYieldFromISR( void );\r
-\r
 #define portYIELD()                                    vPortYieldFromISR()\r
-\r
 #define portEND_SWITCHING_ISR( xSwitchRequired ) if( xSwitchRequired ) vPortYieldFromISR()\r
 /*-----------------------------------------------------------*/\r
 \r
index 2601d50350453ccef6efb6e4c3852c5f034621e0..c501e72594bbe98c44b8a28ad99bbf4838164d46 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
@@ -70,6 +70,9 @@
  * Implementation of functions defined in portable.h for the ARM CM3 port.\r
  *----------------------------------------------------------*/\r
 \r
+/* IAR includes. */\r
+#include <intrinsics.h>\r
+\r
 /* Scheduler includes. */\r
 #include "FreeRTOS.h"\r
 #include "task.h"\r
 \r
 #ifndef configSYSTICK_CLOCK_HZ\r
        #define configSYSTICK_CLOCK_HZ configCPU_CLOCK_HZ\r
-       #if configUSE_TICKLESS_IDLE == 1\r
-               static const unsigned long ulStoppedTimerCompensation = 45UL;\r
-       #endif\r
-#else /* configSYSTICK_CLOCK_HZ */\r
-       #if configUSE_TICKLESS_IDLE == 1\r
-               /* Assumes the SysTick clock is slower than the CPU clock. */\r
-               static const unsigned long ulStoppedTimerCompensation = 45UL / ( configCPU_CLOCK_HZ / configSYSTICK_CLOCK_HZ );\r
-       #endif\r
-#endif /* configSYSTICK_CLOCK_HZ */\r
+#endif\r
 \r
 /* Constants required to manipulate the core.  Registers first... */\r
 #define portNVIC_SYSTICK_CTRL_REG                      ( * ( ( volatile unsigned long * ) 0xe000e010 ) )\r
@@ -123,9 +118,11 @@ variable. */
 static unsigned portBASE_TYPE uxCriticalNesting = 0xaaaaaaaa;\r
 \r
 /*\r
- * Setup the timer to generate the tick interrupts.\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
+ * generate the tick interrupt.\r
  */\r
-static void prvSetupTimerInterrupt( void );\r
+void vPortSetupTimerInterrupt( void );\r
 \r
 /*\r
  * Exception handlers.\r
@@ -142,7 +139,9 @@ extern void vPortStartFirstTask( void );
 /*\r
  * The number of SysTick increments that make up one tick period.\r
  */\r
-static unsigned long ulTimerReloadValueForOneTick = 0;\r
+#if configUSE_TICKLESS_IDLE == 1\r
+       static unsigned long ulTimerReloadValueForOneTick = 0;\r
+#endif\r
 \r
 /*\r
  * The maximum number of tick periods that can be suppressed is limited by the\r
@@ -152,6 +151,14 @@ static unsigned long ulTimerReloadValueForOneTick = 0;
        static unsigned long xMaximumPossibleSuppressedTicks = 0;\r
 #endif /* configUSE_TICKLESS_IDLE */\r
 \r
+/*\r
+ * Compensate for the CPU cycles that pass while the SysTick is stopped (low\r
+ * power functionality only.\r
+ */\r
+#if configUSE_TICKLESS_IDLE == 1\r
+       static unsigned long ulStoppedTimerCompensation = 0;\r
+#endif /* configUSE_TICKLESS_IDLE */\r
+\r
 /*-----------------------------------------------------------*/\r
 \r
 /*\r
@@ -186,7 +193,7 @@ portBASE_TYPE xPortStartScheduler( void )
 \r
        /* Start the timer that generates the tick ISR.  Interrupts are disabled\r
        here already. */\r
-       prvSetupTimerInterrupt();\r
+       vPortSetupTimerInterrupt();\r
 \r
        /* Initialise the critical nesting count ready for the first task. */\r
        uxCriticalNesting = 0;\r
@@ -237,6 +244,10 @@ void xPortSysTickHandler( void )
                portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT;\r
        #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
+       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
                portNVIC_SYSTICK_LOAD_REG = ulTimerReloadValueForOneTick;\r
        #endif\r
@@ -300,9 +311,12 @@ void xPortSysTickHandler( void )
                        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();\r
-                       __WFI();\r
-                       configPOST_SLEEP_PROCESSING();\r
+                       configPRE_SLEEP_PROCESSING( xExpectedIdleTime );\r
+                       if( xExpectedIdleTime > 0 )\r
+                       {\r
+                               __WFI();\r
+                       }\r
+                       configPOST_SLEEP_PROCESSING( xExpectedIdleTime );\r
 \r
                        /* Stop SysTick.  Again, the time the SysTick is stopped for is\r
                        accounted for as best it can be, but using the tickless mode will\r
@@ -357,16 +371,19 @@ void xPortSysTickHandler( void )
  * Setup the systick timer to generate the tick interrupts at the required\r
  * frequency.\r
  */\r
-void prvSetupTimerInterrupt( void )\r
+__weak void vPortSetupTimerInterrupt( void )\r
 {\r
-       /* Configure the constants required to setup the tick interrupt. */\r
-       ulTimerReloadValueForOneTick = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL;\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
                xMaximumPossibleSuppressedTicks = 0xffffffUL / ( ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL );\r
+               ulStoppedTimerCompensation = 45UL / ( configCPU_CLOCK_HZ / configSYSTICK_CLOCK_HZ );\r
+       }\r
        #endif /* configUSE_TICKLESS_IDLE */\r
 \r
        /* Configure SysTick to interrupt at the requested rate. */\r
-       portNVIC_SYSTICK_LOAD_REG = ulTimerReloadValueForOneTick;\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
index 3ee8eb34986a07f2859fdc53fd5fb6137dec8db0..f6434caeff72cb4fba0694b65129d935c3368b72 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
@@ -70,6 +70,9 @@
  * Implementation of functions defined in portable.h for the ARM CM4F port.\r
  *----------------------------------------------------------*/\r
 \r
+/* Compiler includes. */\r
+#include <intrinsics.h>\r
+\r
 /* Scheduler includes. */\r
 #include "FreeRTOS.h"\r
 #include "task.h"\r
 \r
 #ifndef configSYSTICK_CLOCK_HZ\r
        #define configSYSTICK_CLOCK_HZ configCPU_CLOCK_HZ\r
-       #if configUSE_TICKLESS_IDLE == 1\r
-               static const unsigned long ulStoppedTimerCompensation = 45UL;\r
-       #endif\r
-#else /* configSYSTICK_CLOCK_HZ */\r
-       #if configUSE_TICKLESS_IDLE == 1\r
-               /* Assumes the SysTick clock is slower than the CPU clock. */\r
-               static const unsigned long ulStoppedTimerCompensation = 45UL / ( configCPU_CLOCK_HZ / configSYSTICK_CLOCK_HZ );\r
-       #endif\r
-#endif /* configSYSTICK_CLOCK_HZ */\r
+#endif\r
 \r
 /* Constants required to manipulate the core.  Registers first... */\r
 #define portNVIC_SYSTICK_CTRL_REG                      ( * ( ( volatile unsigned long * ) 0xe000e010 ) )\r
@@ -125,9 +120,11 @@ variable. */
 static unsigned portBASE_TYPE uxCriticalNesting = 0xaaaaaaaa;\r
 \r
 /*\r
- * Setup the timer to generate the tick interrupts.\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
+ * generate the tick interrupt.\r
  */\r
-static void prvSetupTimerInterrupt( void );\r
+void vPortSetupTimerInterrupt( void );\r
 \r
 /*\r
  * Exception handlers.\r
@@ -149,7 +146,9 @@ extern void vPortEnableVFP( void );
 /*\r
  * The number of SysTick increments that make up one tick period.\r
  */\r
-static unsigned long ulTimerReloadValueForOneTick = 0;\r
+#if configUSE_TICKLESS_IDLE == 1\r
+       static unsigned long ulTimerReloadValueForOneTick = 0;\r
+#endif\r
 \r
 /*\r
  * The maximum number of tick periods that can be suppressed is limited by the\r
@@ -159,6 +158,14 @@ static unsigned long ulTimerReloadValueForOneTick = 0;
        static unsigned long xMaximumPossibleSuppressedTicks = 0;\r
 #endif /* configUSE_TICKLESS_IDLE */\r
 \r
+/*\r
+ * Compensate for the CPU cycles that pass while the SysTick is stopped (low\r
+ * power functionality only.\r
+ */\r
+#if configUSE_TICKLESS_IDLE == 1\r
+       static unsigned long ulStoppedTimerCompensation = 0;\r
+#endif /* configUSE_TICKLESS_IDLE */\r
+\r
 /*-----------------------------------------------------------*/\r
 \r
 /*\r
@@ -205,7 +212,7 @@ portBASE_TYPE xPortStartScheduler( void )
 \r
        /* Start the timer that generates the tick ISR.  Interrupts are disabled\r
        here already. */\r
-       prvSetupTimerInterrupt();\r
+       vPortSetupTimerInterrupt();\r
 \r
        /* Initialise the critical nesting count ready for the first task. */\r
        uxCriticalNesting = 0;\r
@@ -262,6 +269,10 @@ void xPortSysTickHandler( void )
                portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT;\r
        #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
+       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
                portNVIC_SYSTICK_LOAD_REG = ulTimerReloadValueForOneTick;\r
        #endif\r
@@ -325,9 +336,12 @@ void xPortSysTickHandler( void )
                        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();\r
-                       __WFI();\r
-                       configPOST_SLEEP_PROCESSING();\r
+                       configPRE_SLEEP_PROCESSING( xExpectedIdleTime );\r
+                       if( xExpectedIdleTime > 0 )\r
+                       {\r
+                               __WFI();\r
+                       }\r
+                       configPOST_SLEEP_PROCESSING( xExpectedIdleTime );\r
 \r
                        /* Stop SysTick.  Again, the time the SysTick is stopped for is\r
                        accounted for as best it can be, but using the tickless mode will\r
@@ -382,16 +396,19 @@ void xPortSysTickHandler( void )
  * Setup the systick timer to generate the tick interrupts at the required\r
  * frequency.\r
  */\r
-void prvSetupTimerInterrupt( void )\r
+__weak void vPortSetupTimerInterrupt( void )\r
 {\r
-       /* Configure the constants required to setup the tick interrupt. */\r
-       ulTimerReloadValueForOneTick = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL;\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
                xMaximumPossibleSuppressedTicks = 0xffffffUL / ( ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL );\r
+               ulStoppedTimerCompensation = 45UL / ( configCPU_CLOCK_HZ / configSYSTICK_CLOCK_HZ );\r
+       }\r
        #endif /* configUSE_TICKLESS_IDLE */\r
 \r
        /* Configure SysTick to interrupt at the requested rate. */\r
-       portNVIC_SYSTICK_LOAD_REG = ulTimerReloadValueForOneTick;\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
index 5c3a5534ecfa10a96d53d963c66cd3369246a863..be3d8e64331d99a665e20a4b0bffbafc8e512372 100644 (file)
 \r
 #ifndef configSYSTICK_CLOCK_HZ\r
        #define configSYSTICK_CLOCK_HZ configCPU_CLOCK_HZ\r
-       #if configUSE_TICKLESS_IDLE == 1\r
-               static const unsigned long ulStoppedTimerCompensation = 45UL;\r
-       #endif\r
-#else /* configSYSTICK_CLOCK_HZ */\r
-       #if configUSE_TICKLESS_IDLE == 1\r
-               /* Assumes the SysTick clock is slower than the CPU clock. */\r
-               static const unsigned long ulStoppedTimerCompensation = 45UL / ( configCPU_CLOCK_HZ / configSYSTICK_CLOCK_HZ );\r
-       #endif\r
-#endif /* configSYSTICK_CLOCK_HZ */\r
+#endif\r
+\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
+vPortSetupTimerInterrupt().  Ensure configOVERRIDE_DEFAULT_TICK_CONFIGURATION\r
+is defined. */\r
+#ifndef configOVERRIDE_DEFAULT_TICK_CONFIGURATION\r
+       #define configOVERRIDE_DEFAULT_TICK_CONFIGURATION 0\r
+#endif\r
 \r
 /* Constants required to manipulate the core.  Registers first... */\r
 #define portNVIC_SYSTICK_CTRL_REG                      ( * ( ( volatile unsigned long * ) 0xe000e010 ) )\r
@@ -120,9 +121,11 @@ variable. */
 static unsigned portBASE_TYPE uxCriticalNesting = 0xaaaaaaaa;\r
 \r
 /*\r
- * Setup the timer to generate the tick interrupts.\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
+ * generate the tick interrupt.\r
  */\r
-static void prvSetupTimerInterrupt( void );\r
+void vPortSetupTimerInterrupt( void );\r
 \r
 /*\r
  * Exception handlers.\r
@@ -141,7 +144,9 @@ static void prvStartFirstTask( void );
 /*\r
  * The number of SysTick increments that make up one tick period.\r
  */\r
-static unsigned long ulTimerReloadValueForOneTick = 0;\r
+#if configUSE_TICKLESS_IDLE == 1\r
+       static unsigned long ulTimerReloadValueForOneTick = 0;\r
+#endif\r
 \r
 /*\r
  * The maximum number of tick periods that can be suppressed is limited by the\r
@@ -151,6 +156,14 @@ static unsigned long ulTimerReloadValueForOneTick = 0;
        static unsigned long xMaximumPossibleSuppressedTicks = 0;\r
 #endif /* configUSE_TICKLESS_IDLE */\r
 \r
+/*\r
+ * Compensate for the CPU cycles that pass while the SysTick is stopped (low\r
+ * power functionality only.\r
+ */\r
+#if configUSE_TICKLESS_IDLE == 1\r
+       static unsigned long ulStoppedTimerCompensation = 0;\r
+#endif /* configUSE_TICKLESS_IDLE */\r
+\r
 /*-----------------------------------------------------------*/\r
 \r
 /*\r
@@ -219,7 +232,7 @@ portBASE_TYPE xPortStartScheduler( void )
 \r
        /* Start the timer that generates the tick ISR.  Interrupts are disabled\r
        here already. */\r
-       prvSetupTimerInterrupt();\r
+       vPortSetupTimerInterrupt();\r
 \r
        /* Initialise the critical nesting count ready for the first task. */\r
        uxCriticalNesting = 0;\r
@@ -305,6 +318,10 @@ void xPortSysTickHandler( void )
        }\r
        #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
+       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
                portNVIC_SYSTICK_LOAD_REG = ulTimerReloadValueForOneTick;\r
        #endif\r
@@ -368,9 +385,12 @@ void xPortSysTickHandler( void )
                        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();\r
-                       __wfi();\r
-                       configPOST_SLEEP_PROCESSING();\r
+                       configPRE_SLEEP_PROCESSING( xExpectedIdleTime );\r
+                       if( xExpectedIdleTime > 0 )\r
+                       {\r
+                               __wfi();\r
+                       }\r
+                       configPOST_SLEEP_PROCESSING( xExpectedIdleTime );\r
 \r
                        /* Stop SysTick.  Again, the time the SysTick is stopped for is\r
                        accounted for as best it can be, but using the tickless mode will\r
@@ -426,18 +446,25 @@ void xPortSysTickHandler( void )
  * Setup the SysTick timer to generate the tick interrupts at the required\r
  * frequency.\r
  */\r
-void prvSetupTimerInterrupt( void )\r
-{\r
-       /* Calculate the constants required to configure the tick interrupt. */\r
-       ulTimerReloadValueForOneTick = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL;\r
-       #if configUSE_TICKLESS_IDLE == 1\r
-               xMaximumPossibleSuppressedTicks = 0xffffffUL / ( ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL );\r
-       #endif /* configUSE_TICKLESS_IDLE */\r
+#if configOVERRIDE_DEFAULT_TICK_CONFIGURATION == 0\r
 \r
-       /* Configure SysTick to interrupt at the requested rate. */\r
-       portNVIC_SYSTICK_LOAD_REG = ulTimerReloadValueForOneTick;\r
-       portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT;\r
-}\r
+       void vPortSetupTimerInterrupt( void )\r
+       {\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
+                       xMaximumPossibleSuppressedTicks = 0xffffffUL / ( ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL );\r
+                       ulStoppedTimerCompensation = 45UL / ( configCPU_CLOCK_HZ / configSYSTICK_CLOCK_HZ );\r
+               }\r
+               #endif /* configUSE_TICKLESS_IDLE */\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
+#endif /* configOVERRIDE_DEFAULT_TICK_CONFIGURATION */\r
 /*-----------------------------------------------------------*/\r
 \r
 __asm unsigned long ulPortSetInterruptMask( void )\r
@@ -449,7 +476,6 @@ __asm unsigned long ulPortSetInterruptMask( void )
        msr basepri, r1\r
        bx r14\r
 }\r
-\r
 /*-----------------------------------------------------------*/\r
 \r
 __asm void vPortClearInterruptMask( unsigned long ulNewMask )\r
index 02818c5e2178a7939f0b2568cfd0376940ea7203..2c2c4c79aa7da8f270017585871e7b2caeaee812 100644 (file)
 \r
 #ifndef configSYSTICK_CLOCK_HZ\r
        #define configSYSTICK_CLOCK_HZ configCPU_CLOCK_HZ\r
-       #if configUSE_TICKLESS_IDLE == 1\r
-               static const unsigned long ulStoppedTimerCompensation = 45UL;\r
-       #endif\r
-#else /* configSYSTICK_CLOCK_HZ */\r
-       #if configUSE_TICKLESS_IDLE == 1\r
-               /* Assumes the SysTick clock is slower than the CPU clock. */\r
-               static const unsigned long ulStoppedTimerCompensation = 45UL / ( configCPU_CLOCK_HZ / configSYSTICK_CLOCK_HZ );\r
-       #endif\r
-#endif /* configSYSTICK_CLOCK_HZ */\r
+#endif\r
+\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
+vPortSetupTimerInterrupt().  Ensure configOVERRIDE_DEFAULT_TICK_CONFIGURATION\r
+is defined. */\r
+#ifndef configOVERRIDE_DEFAULT_TICK_CONFIGURATION\r
+       #define configOVERRIDE_DEFAULT_TICK_CONFIGURATION 0\r
+#endif\r
 \r
 /* Constants required to manipulate the core.  Registers first... */\r
 #define portNVIC_SYSTICK_CTRL_REG                      ( * ( ( volatile unsigned long * ) 0xe000e010 ) )\r
@@ -125,9 +126,11 @@ variable. */
 static unsigned portBASE_TYPE uxCriticalNesting = 0xaaaaaaaa;\r
 \r
 /*\r
- * Setup the timer to generate the tick interrupts.\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
+ * generate the tick interrupt.\r
  */\r
-static void prvSetupTimerInterrupt( void );\r
+void vPortSetupTimerInterrupt( void );\r
 \r
 /*\r
  * Exception handlers.\r
@@ -150,7 +153,9 @@ static void prvEnableVFP( void );
 /*\r
  * The number of SysTick increments that make up one tick period.\r
  */\r
-static unsigned long ulTimerReloadValueForOneTick = 0;\r
+#if configUSE_TICKLESS_IDLE == 1\r
+       static unsigned long ulTimerReloadValueForOneTick = 0;\r
+#endif\r
 \r
 /*\r
  * The maximum number of tick periods that can be suppressed is limited by the\r
@@ -160,6 +165,14 @@ static unsigned long ulTimerReloadValueForOneTick = 0;
        static unsigned long xMaximumPossibleSuppressedTicks = 0;\r
 #endif /* configUSE_TICKLESS_IDLE */\r
 \r
+/*\r
+ * Compensate for the CPU cycles that pass while the SysTick is stopped (low\r
+ * power functionality only.\r
+ */\r
+#if configUSE_TICKLESS_IDLE == 1\r
+       static unsigned long ulStoppedTimerCompensation = 0;\r
+#endif /* configUSE_TICKLESS_IDLE */\r
+\r
 /*-----------------------------------------------------------*/\r
 \r
 /*\r
@@ -257,7 +270,7 @@ portBASE_TYPE xPortStartScheduler( void )
 \r
        /* Start the timer that generates the tick ISR.  Interrupts are disabled\r
        here already. */\r
-       prvSetupTimerInterrupt();\r
+       vPortSetupTimerInterrupt();\r
 \r
        /* Initialise the critical nesting count ready for the first task. */\r
        uxCriticalNesting = 0;\r
@@ -368,6 +381,10 @@ void xPortSysTickHandler( void )
        }\r
        #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
+       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
                portNVIC_SYSTICK_LOAD_REG = ulTimerReloadValueForOneTick;\r
        #endif\r
@@ -431,9 +448,12 @@ void xPortSysTickHandler( void )
                        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();\r
-                       __wfi();\r
-                       configPOST_SLEEP_PROCESSING();\r
+                       configPRE_SLEEP_PROCESSING( xExpectedIdleTime );\r
+                       if( xExpectedIdleTime > 0 )\r
+                       {\r
+                               __wfi();\r
+                       }\r
+                       configPOST_SLEEP_PROCESSING( xExpectedIdleTime );\r
 \r
                        /* Stop SysTick.  Again, the time the SysTick is stopped for is\r
                        accounted for as best it can be, but using the tickless mode will\r
@@ -486,21 +506,28 @@ void xPortSysTickHandler( void )
 /*-----------------------------------------------------------*/\r
 \r
 /*\r
- * Setup the systick timer to generate the tick interrupts at the required\r
+ * Setup the SysTick timer to generate the tick interrupts at the required\r
  * frequency.\r
  */\r
-void prvSetupTimerInterrupt( void )\r
-{\r
-       /* Calculate the constants required to configure the tick interrupt. */\r
-       ulTimerReloadValueForOneTick = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL;\r
-       #if configUSE_TICKLESS_IDLE == 1\r
-               xMaximumPossibleSuppressedTicks = 0xffffffUL / ( ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL );\r
-       #endif /* configUSE_TICKLESS_IDLE */\r
+#if configOVERRIDE_DEFAULT_TICK_CONFIGURATION == 0\r
 \r
-       /* Configure SysTick to interrupt at the requested rate. */\r
-       portNVIC_SYSTICK_LOAD_REG = ulTimerReloadValueForOneTick;\r
-       portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT;\r
-}\r
+       void vPortSetupTimerInterrupt( void )\r
+       {\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
+                       xMaximumPossibleSuppressedTicks = 0xffffffUL / ( ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL );\r
+                       ulStoppedTimerCompensation = 45UL / ( configCPU_CLOCK_HZ / configSYSTICK_CLOCK_HZ );\r
+               }\r
+               #endif /* configUSE_TICKLESS_IDLE */\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
+#endif /* configOVERRIDE_DEFAULT_TICK_CONFIGURATION */\r
 /*-----------------------------------------------------------*/\r
 \r
 __asm unsigned long ulPortSetInterruptMask( void )\r
@@ -512,7 +539,6 @@ __asm unsigned long ulPortSetInterruptMask( void )
        msr basepri, r1\r
        bx r14\r
 }\r
-\r
 /*-----------------------------------------------------------*/\r
 \r
 __asm void vPortClearInterruptMask( unsigned long ulNewMask )\r
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