]> git.sur5r.net Git - freertos/blobdiff - FreeRTOS/Source/portable/GCC/ARM_CM3_MPU/port.c
Updates to support FreeRTOS MPU in FreeRTOS V9.0.0 - including a GCC project that...
[freertos] / FreeRTOS / Source / portable / GCC / ARM_CM3_MPU / port.c
index 4746230a210a4c6e7774b78cfcc546ec429c756c..ad7e7d294f3ed175873909325e5d2f1a55f8ede6 100644 (file)
@@ -71,8 +71,6 @@
  * Implementation of functions defined in portable.h for the ARM CM3 port.\r
  *----------------------------------------------------------*/\r
 \r
-#error This port is not supported in this V9.0.0 pre-release revision, but will be supported in the final release.  For now use V8.2.3 instead.\r
-\r
 /* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining\r
 all the API functions to use the MPU wrappers.  That should only be done when\r
 task.h is included from an application file. */\r
@@ -126,6 +124,10 @@ task.h is included from an application file. */
 /* Set the privilege level to user mode if xRunningPrivileged is false. */\r
 #define portRESET_PRIVILEGE( xRunningPrivileged ) if( xRunningPrivileged != pdTRUE ) __asm volatile ( " mrs r0, control \n orr r0, #1 \n msr control, r0" :::"r0" )\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
 /* Each task maintains its own interrupt status in the critical nesting\r
 variable.  Note this is not saved as part of the task context as context\r
 switches can only occur when uxCriticalNesting is zero. */\r
@@ -176,7 +178,8 @@ static void prvSVCHandler( uint32_t *pulRegisters ) __attribute__(( noinline ))
 /*\r
  * Prototypes for all the MPU wrappers.\r
  */\r
-BaseType_t MPU_xTaskGenericCreate( TaskFunction_t pvTaskCode, const char * const pcName, uint16_t usStackDepth, void *pvParameters, UBaseType_t uxPriority, TaskHandle_t *pxCreatedTask, StackType_t *puxStackBuffer, const MemoryRegion_t * const xRegions );\r
+BaseType_t MPU_xTaskCreateRestricted( const TaskParameters_t * const pxTaskDefinition, TaskHandle_t *pxCreatedTask );\r
+BaseType_t MPU_xTaskCreate( TaskFunction_t pvTaskCode, const char * const pcName, uint16_t usStackDepth, void *pvParameters, UBaseType_t uxPriority, TaskHandle_t *pxCreatedTask );\r
 void MPU_vTaskAllocateMPURegions( TaskHandle_t xTask, const MemoryRegion_t * const xRegions );\r
 void MPU_vTaskDelete( TaskHandle_t pxTaskToDelete );\r
 void MPU_vTaskDelayUntil( TickType_t * const pxPreviousWakeTime, TickType_t xTimeIncrement );\r
@@ -234,7 +237,7 @@ StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t px
        pxTopOfStack--; /* Offset added to account for the way the MCU uses the stack on entry/exit of interrupts. */\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 = 0;      /* LR */\r
        pxTopOfStack -= 5;      /* R12, R3, R2 and R1. */\r
@@ -677,12 +680,23 @@ uint32_t ul;
 }\r
 /*-----------------------------------------------------------*/\r
 \r
-BaseType_t MPU_xTaskGenericCreate( TaskFunction_t pvTaskCode, const char * const pcName, uint16_t usStackDepth, void *pvParameters, UBaseType_t uxPriority, TaskHandle_t *pxCreatedTask, StackType_t *puxStackBuffer, const MemoryRegion_t * const xRegions )\r
+BaseType_t MPU_xTaskCreateRestricted( const TaskParameters_t * const pxTaskDefinition, TaskHandle_t *pxCreatedTask )\r
+{\r
+BaseType_t xReturn;\r
+BaseType_t xRunningPrivileged = prvRaisePrivilege();\r
+\r
+       xReturn = xTaskCreateRestricted( pxTaskDefinition, pxCreatedTask );\r
+       portRESET_PRIVILEGE( xRunningPrivileged );\r
+       return xReturn;\r
+}\r
+/*-----------------------------------------------------------*/\r
+\r
+BaseType_t MPU_xTaskCreate( TaskFunction_t pvTaskCode, const char * const pcName, uint16_t usStackDepth, void *pvParameters, UBaseType_t uxPriority, TaskHandle_t *pxCreatedTask )\r
 {\r
 BaseType_t xReturn;\r
 BaseType_t xRunningPrivileged = prvRaisePrivilege();\r
 \r
-       xReturn = xTaskGenericCreate( pvTaskCode, pcName, usStackDepth, pvParameters, uxPriority, pxCreatedTask, puxStackBuffer, xRegions );\r
+       xReturn = xTaskCreate( pvTaskCode, pcName, usStackDepth, pvParameters, uxPriority, pxCreatedTask );\r
        portRESET_PRIVILEGE( xRunningPrivileged );\r
        return xReturn;\r
 }\r