/*\r
- FreeRTOS V8.2.3 - 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
#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
" 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