]> git.sur5r.net Git - freertos/blobdiff - FreeRTOS/Source/portable/GCC/ARM_CM7/r0p1/port.c
xTaskGetTaskHandle() changed to xTaskGetHandle().
[freertos] / FreeRTOS / Source / portable / GCC / ARM_CM7 / r0p1 / port.c
index fc8fbabb1baf1fd78c7bab96baf39ba7c331f19a..d585aa7ad4489341ccefe331685b46fb1d6225da 100644 (file)
@@ -133,6 +133,10 @@ occurred while the SysTick counter is stopped during tickless idle
 calculations. */\r
 #define portMISSED_COUNTS_FACTOR                       ( 45UL )\r
 \r
+/* For strict compliance with the Cortex-M spec the task start address should\r
+have bit-0 clear, as it is loaded into the PC on exit from an ISR. */\r
+#define portSTART_ADDRESS_MASK         ( ( StackType_t ) 0xfffffffeUL )\r
+\r
 /* Let the user override the pre-loading of the initial LR with the address of\r
 prvTaskExitError() in case it messes up unwinding of the stack in the\r
 debugger. */\r
@@ -227,7 +231,7 @@ StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t px
 \r
        *pxTopOfStack = portINITIAL_XPSR;       /* xPSR */\r
        pxTopOfStack--;\r
-       *pxTopOfStack = ( StackType_t ) pxCode; /* PC */\r
+       *pxTopOfStack = ( ( StackType_t ) pxCode ) & portSTART_ADDRESS_MASK;    /* PC */\r
        pxTopOfStack--;\r
        *pxTopOfStack = ( StackType_t ) portTASK_RETURN_ADDRESS;        /* LR */\r
 \r
@@ -527,6 +531,8 @@ void xPortSysTickHandler( void )
                /* Enter a critical section but don't use the taskENTER_CRITICAL()\r
                method as that will mask interrupts that should exit sleep mode. */\r
                __asm volatile( "cpsid i" );\r
+               __asm volatile( "dsb" );\r
+               __asm volatile( "isb" );\r
 \r
                /* If a context switch is pending or a task is waiting for the scheduler\r
                to be unsuspended then abandon the low power entry. */\r