]> git.sur5r.net Git - freertos/blobdiff - FreeRTOS/Source/portable/GCC/ARM_CM0/port.c
Update version number in preparation for maintenance release.
[freertos] / FreeRTOS / Source / portable / GCC / ARM_CM0 / port.c
index 6654a938c9f3019760eddc5b7691ab19937a8da6..b70a49af20a58a2eccc145cb6f4b92c5ca034284 100644 (file)
@@ -1,5 +1,5 @@
 /*\r
-    FreeRTOS V8.2.1 - Copyright (C) 2015 Real Time Engineers Ltd.\r
+    FreeRTOS V9.0.1 - Copyright (C) 2017 Real Time Engineers Ltd.\r
     All rights reserved\r
 \r
     VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.\r
@@ -8,7 +8,7 @@
 \r
     FreeRTOS is free software; you can redistribute it and/or modify it under\r
     the terms of the GNU General Public License (version 2) as published by the\r
-    Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception.\r
+    Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception.\r
 \r
     ***************************************************************************\r
     >>!   NOTE: The modification to the GPL is included to allow you to     !<<\r
@@ -76,8 +76,9 @@
 #include "task.h"\r
 \r
 /* Constants required to manipulate the NVIC. */\r
-#define portNVIC_SYSTICK_CTRL          ( ( volatile uint32_t *) 0xe000e010 )\r
-#define portNVIC_SYSTICK_LOAD          ( ( volatile uint32_t *) 0xe000e014 )\r
+#define portNVIC_SYSTICK_CTRL                  ( ( volatile uint32_t * ) 0xe000e010 )\r
+#define portNVIC_SYSTICK_LOAD                  ( ( volatile uint32_t * ) 0xe000e014 )\r
+#define portNVIC_SYSTICK_CURRENT_VALUE ( ( volatile uint32_t * ) 0xe000e018 )\r
 #define portNVIC_INT_CTRL                      ( ( volatile uint32_t *) 0xe000ed04 )\r
 #define portNVIC_SYSPRI2                       ( ( volatile uint32_t *) 0xe000ed20 )\r
 #define portNVIC_SYSTICK_CLK           0x00000004\r
@@ -92,7 +93,7 @@
 #define portINITIAL_XPSR                       ( 0x01000000 )\r
 \r
 /* Let the user override the pre-loading of the initial LR with the address of\r
-prvTaskExitError() in case is messes up unwinding of the stack in the\r
+prvTaskExitError() in case it messes up unwinding of the stack in the\r
 debugger. */\r
 #ifdef configTASK_RETURN_ADDRESS\r
        #define portTASK_RETURN_ADDRESS configTASK_RETURN_ADDRESS\r
@@ -183,12 +184,15 @@ void vPortStartFirstTask( void )
        "       msr psp, r0                                     \n" /* This is now the new top of stack to use in the task. */\r
        "       movs r0, #2                                     \n" /* Switch to the psp stack. */\r
        "       msr CONTROL, r0                         \n"\r
+       "       isb                                                     \n"\r
        "       pop {r0-r5}                                     \n" /* Pop the registers that are saved automatically. */\r
        "       mov lr, r5                                      \n" /* lr is now in r5. */\r
+       "       pop {r3}                                        \n" /* Return address is now in r3. */\r
+       "       pop {r2}                                        \n" /* Pop and discard XPSR. */\r
        "       cpsie i                                         \n" /* The first task has its context and interrupts can be enabled. */\r
-       "       pop {pc}                                        \n" /* Finally, pop the PC to jump to the user defined task code. */\r
+       "       bx r3                                           \n" /* Finally, jump to the user defined task code. */\r
        "                                                               \n"\r
-       "       .align 2                                        \n"\r
+       "       .align 4                                        \n"\r
        "pxCurrentTCBConst2: .word pxCurrentTCB   "\r
                                  );\r
 }\r
@@ -307,7 +311,7 @@ void xPortPendSVHandler( void )
        "       mov r5, r9                                                      \n"\r
        "       mov r6, r10                                                     \n"\r
        "       mov r7, r11                                                     \n"\r
-       "       stmia r0!, {r4-r7}                      \n"\r
+       "       stmia r0!, {r4-r7}                                      \n"\r
        "                                                                               \n"\r
        "       push {r3, r14}                                          \n"\r
        "       cpsid i                                                         \n"\r
@@ -327,11 +331,11 @@ void xPortPendSVHandler( void )
        "       msr psp, r0                                                     \n" /* Remember the new top of stack for the task. */\r
        "                                                                               \n"\r
        "       sub r0, r0, #32                                         \n" /* Go back for the low registers that are not automatically restored. */\r
-       "       ldmia r0!, {r4-r7}                      \n" /* Pop low registers.  */\r
+       "       ldmia r0!, {r4-r7}                                      \n" /* Pop low registers.  */\r
        "                                                                               \n"\r
        "       bx r3                                                           \n"\r
        "                                                                               \n"\r
-       "       .align 2                                                        \n"\r
+       "       .align 4                                                        \n"\r
        "pxCurrentTCBConst: .word pxCurrentTCB    "\r
        );\r
 }\r
@@ -360,6 +364,10 @@ uint32_t ulPreviousMask;
  */\r
 void prvSetupTimerInterrupt( void )\r
 {\r
+       /* Stop and reset the SysTick. */\r
+       *(portNVIC_SYSTICK_CTRL) = 0UL;\r
+       *(portNVIC_SYSTICK_CURRENT_VALUE) = 0UL;\r
+\r
        /* Configure SysTick to interrupt at the requested rate. */\r
        *(portNVIC_SYSTICK_LOAD) = ( configCPU_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL;\r
        *(portNVIC_SYSTICK_CTRL) = portNVIC_SYSTICK_CLK | portNVIC_SYSTICK_INT | portNVIC_SYSTICK_ENABLE;\r