/*\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
\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
#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
#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
" 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
" 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
" 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
*/\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