]> git.sur5r.net Git - freertos/blobdiff - FreeRTOS/Source/portable/GCC/ARM_CM4F/port.c
Update version number to 9.0.0rc2.
[freertos] / FreeRTOS / Source / portable / GCC / ARM_CM4F / port.c
index 65788f4fcc5d7ad5b36a68ff1e85e150d00dc7fb..2da512f9418270bb41ece8e83900a23b5794170d 100644 (file)
@@ -1,5 +1,5 @@
 /*\r
-    FreeRTOS V8.2.0rc1 - Copyright (C) 2014 Real Time Engineers Ltd.\r
+    FreeRTOS V9.0.0rc2 - Copyright (C) 2016 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,29 +8,20 @@
 \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
     >>!   distribute a combined work that includes FreeRTOS without being   !<<\r
     >>!   obliged to provide the source code for proprietary components     !<<\r
     >>!   outside of the FreeRTOS kernel.                                   !<<\r
+    ***************************************************************************\r
 \r
     FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY\r
     WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS\r
     FOR A PARTICULAR PURPOSE.  Full license text is available on the following\r
     link: http://www.freertos.org/a00114.html\r
 \r
-    1 tab == 4 spaces!\r
-\r
-    ***************************************************************************\r
-     *                                                                       *\r
-     *    Having a problem?  Start by reading the FAQ "My application does   *\r
-     *    not run, what could be wrong?".  Have you defined configASSERT()?  *\r
-     *                                                                       *\r
-     *    http://www.FreeRTOS.org/FAQHelp.html                               *\r
-     *                                                                       *\r
-    ***************************************************************************\r
-\r
     ***************************************************************************\r
      *                                                                       *\r
      *    FreeRTOS provides completely free yet professionally developed,    *\r
      *                                                                       *\r
     ***************************************************************************\r
 \r
-    ***************************************************************************\r
-     *                                                                       *\r
-     *   Investing in training allows your team to be as productive as       *\r
-     *   possible as early as possible, lowering your overall development    *\r
-     *   cost, and enabling you to bring a more robust product to market     *\r
-     *   earlier than would otherwise be possible.  Richard Barry is both    *\r
-     *   the architect and key author of FreeRTOS, and so also the world's   *\r
-     *   leading authority on what is the world's most popular real time     *\r
-     *   kernel for deeply embedded MCU designs.  Obtaining your training    *\r
-     *   from Richard ensures your team will gain directly from his in-depth *\r
-     *   product knowledge and years of usage experience.  Contact Real Time *\r
-     *   Engineers Ltd to enquire about the FreeRTOS Masterclass, presented  *\r
-     *   by Richard Barry:  http://www.FreeRTOS.org/contact\r
-     *                                                                       *\r
-    ***************************************************************************\r
+    http://www.FreeRTOS.org/FAQHelp.html - Having a problem?  Start by reading\r
+    the FAQ page "My application does not run, what could be wrong?".  Have you\r
+    defined configASSERT()?\r
 \r
-    ***************************************************************************\r
-     *                                                                       *\r
-     *    You are receiving this top quality software for free.  Please play *\r
-     *    fair and reciprocate by reporting any suspected issues and         *\r
-     *    participating in the community forum:                              *\r
-     *    http://www.FreeRTOS.org/support                                    *\r
-     *                                                                       *\r
-     *    Thank you!                                                         *\r
-     *                                                                       *\r
-    ***************************************************************************\r
+    http://www.FreeRTOS.org/support - In return for receiving this top quality\r
+    embedded software for free we request you assist our global community by\r
+    participating in the support forum.\r
 \r
-    http://www.FreeRTOS.org - Documentation, books, training, latest versions,\r
-    license and Real Time Engineers Ltd. contact details.\r
+    http://www.FreeRTOS.org/training - Investing in training allows your team to\r
+    be as productive as possible as early as possible.  Now you can receive\r
+    FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers\r
+    Ltd, and the world's leading authority on the world's leading RTOS.\r
 \r
     http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,\r
     including FreeRTOS+Trace - an indispensable productivity tool, a DOS\r
@@ -82,7 +56,7 @@
     http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate.\r
     Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS.\r
 \r
-    http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High\r
+    http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High\r
     Integrity Systems ltd. to sell under the OpenRTOS brand.  Low cost OpenRTOS\r
     licenses offer ticketed support, indemnification and commercial middleware.\r
 \r
 #define portNVIC_PENDSVCLEAR_BIT                       ( 1UL << 27UL )\r
 #define portNVIC_PEND_SYSTICK_CLEAR_BIT                ( 1UL << 25UL )\r
 \r
+/* Constants used to detect a Cortex-M7 r0p1 core, which should use the ARM_CM7\r
+r0p1 port. */\r
+#define portCPUID                                                      ( * ( ( volatile uint32_t * ) 0xE000ed00 ) )\r
+#define portCORTEX_M7_r0p1_ID                          ( 0x410FC271UL )\r
+#define portCORTEX_M7_r0p0_ID                          ( 0x410FC270UL )\r
+\r
 #define portNVIC_PENDSV_PRI                                    ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 16UL )\r
 #define portNVIC_SYSTICK_PRI                           ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 24UL )\r
 \r
 #define portVECTACTIVE_MASK                                    ( 0xFFUL )\r
 \r
 /* Constants required to manipulate the VFP. */\r
-#define portFPCCR                                      ( ( volatile uint32_t * ) 0xe000ef34 ) /* Floating point context control register. */\r
-#define portASPEN_AND_LSPEN_BITS       ( 0x3UL << 30UL )\r
+#define portFPCCR                                                      ( ( volatile uint32_t * ) 0xe000ef34 ) /* Floating point context control register. */\r
+#define portASPEN_AND_LSPEN_BITS                       ( 0x3UL << 30UL )\r
 \r
 /* Constants required to set up the initial stack. */\r
-#define portINITIAL_XPSR                       ( 0x01000000 )\r
-#define portINITIAL_EXEC_RETURN                ( 0xfffffffd )\r
+#define portINITIAL_XPSR                                       ( 0x01000000 )\r
+#define portINITIAL_EXEC_RETURN                                ( 0xfffffffd )\r
 \r
 /* The systick is a 24-bit counter. */\r
 #define portMAX_24_BIT_NUMBER                          ( 0xffffffUL )\r
@@ -160,7 +140,7 @@ calculations. */
 #define portMISSED_COUNTS_FACTOR                       ( 45UL )\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
@@ -299,7 +279,7 @@ void vPortSVCHandler( void )
                                        "       msr     basepri, r0                                     \n"\r
                                        "       bx r14                                                  \n"\r
                                        "                                                                       \n"\r
-                                       "       .align 2                                                \n"\r
+                                       "       .align 4                                                \n"\r
                                        "pxCurrentTCBConst2: .word pxCurrentTCB                         \n"\r
                                );\r
 }\r
@@ -331,6 +311,12 @@ BaseType_t xPortStartScheduler( void )
        See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html */\r
        configASSERT( configMAX_SYSCALL_INTERRUPT_PRIORITY );\r
 \r
+       /* This port can be used on all revisions of the Cortex-M7 core other than\r
+       the r0p1 parts.  r0p1 parts should use the port from the\r
+       /source/portable/GCC/ARM_CM7/r0p1 directory. */\r
+       configASSERT( portCPUID != portCORTEX_M7_r0p1_ID );\r
+       configASSERT( portCPUID != portCORTEX_M7_r0p0_ID );\r
+\r
        #if( configASSERT_DEFINED == 1 )\r
        {\r
                volatile uint32_t ulOriginalPriority;\r
@@ -466,7 +452,7 @@ void xPortPendSVHandler( void )
        "       mov r0, %0                                                      \n"\r
        "       msr basepri, r0                                         \n"\r
        "       dsb                                                                     \n"\r
-       "   isb                                                                 \n"\r
+       "       isb                                                                     \n"\r
        "       bl vTaskSwitchContext                           \n"\r
        "       mov r0, #0                                                      \n"\r
        "       msr basepri, r0                                         \n"\r
@@ -493,7 +479,7 @@ void xPortPendSVHandler( void )
        "                                                                               \n"\r
        "       bx r14                                                          \n"\r
        "                                                                               \n"\r
-       "       .align 2                                                        \n"\r
+       "       .align 4                                                        \n"\r
        "pxCurrentTCBConst: .word pxCurrentTCB  \n"\r
        ::"i"(configMAX_SYSCALL_INTERRUPT_PRIORITY)\r
        );\r
@@ -506,7 +492,7 @@ void xPortSysTickHandler( void )
        executes all interrupts must be unmasked.  There is therefore no need to\r
        save and then restore the interrupt mask value as its value is already\r
        known. */\r
-       ( void ) portSET_INTERRUPT_MASK_FROM_ISR();\r
+       portDISABLE_INTERRUPTS();\r
        {\r
                /* Increment the RTOS tick. */\r
                if( xTaskIncrementTick() != pdFALSE )\r
@@ -516,7 +502,7 @@ void xPortSysTickHandler( void )
                        portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT;\r
                }\r
        }\r
-       portCLEAR_INTERRUPT_MASK_FROM_ISR( 0 );\r
+       portENABLE_INTERRUPTS();\r
 }\r
 /*-----------------------------------------------------------*/\r
 \r
@@ -650,7 +636,7 @@ void xPortSysTickHandler( void )
 \r
                                /* The reload value is set to whatever fraction of a single tick\r
                                period remains. */\r
-                               portNVIC_SYSTICK_LOAD_REG = ( ( ulCompleteTickPeriods + 1 ) * ulTimerCountsForOneTick ) - ulCompletedSysTickDecrements;\r
+                               portNVIC_SYSTICK_LOAD_REG = ( ( ulCompleteTickPeriods + 1UL ) * ulTimerCountsForOneTick ) - ulCompletedSysTickDecrements;\r
                        }\r
 \r
                        /* Restart SysTick so it runs from portNVIC_SYSTICK_LOAD_REG\r