]> git.sur5r.net Git - freertos/blobdiff - FreeRTOS/Source/portable/MPLAB/PIC32MZ/ISR_Support.h
Update version number to 9.0.0rc2.
[freertos] / FreeRTOS / Source / portable / MPLAB / PIC32MZ / ISR_Support.h
index 800b28cae93746c2d03d1b0711fb9d6f8bbdeafc..2182d34da0ddaa81450aa637565dca70c62072c4 100644 (file)
@@ -1,60 +1,64 @@
 /*\r
-    FreeRTOS V8.1.2 - 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
 \r
-    ***************************************************************************\r
-     *                                                                       *\r
-     *    FreeRTOS provides completely free yet professionally developed,    *\r
-     *    robust, strictly quality controlled, supported, and cross          *\r
-     *    platform software that has become a de facto standard.             *\r
-     *                                                                       *\r
-     *    Help yourself get started quickly and support the FreeRTOS         *\r
-     *    project by purchasing a FreeRTOS tutorial book, reference          *\r
-     *    manual, or both from: http://www.FreeRTOS.org/Documentation        *\r
-     *                                                                       *\r
-     *    Thank you!                                                         *\r
-     *                                                                       *\r
-    ***************************************************************************\r
-\r
     This file is part of the FreeRTOS distribution.\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
     >>!   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 from the following\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?"                                     *\r
+     *    FreeRTOS provides completely free yet professionally developed,    *\r
+     *    robust, strictly quality controlled, supported, and cross          *\r
+     *    platform software that is more than just the market leader, it     *\r
+     *    is the industry's de facto standard.                               *\r
      *                                                                       *\r
-     *    http://www.FreeRTOS.org/FAQHelp.html                               *\r
+     *    Help yourself get started quickly while simultaneously helping     *\r
+     *    to support the FreeRTOS project by purchasing a FreeRTOS           *\r
+     *    tutorial book, reference manual, or both:                          *\r
+     *    http://www.FreeRTOS.org/Documentation                              *\r
      *                                                                       *\r
     ***************************************************************************\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/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
+    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/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
     compatible FAT file system, and our tiny thread aware UDP/IP stack.\r
 \r
-    http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High\r
-    Integrity Systems to sell under the OpenRTOS brand.  Low cost OpenRTOS\r
-    licenses offer ticketed support, indemnification and middleware.\r
+    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
+    Integrity Systems ltd. to sell under the OpenRTOS brand.  Low cost OpenRTOS\r
+    licenses offer ticketed support, indemnification and commercial middleware.\r
 \r
     http://www.SafeRTOS.com - High Integrity Systems also provide a safety\r
     engineered and independently SIL3 certified version for use in safety and\r
 \r
 #include "FreeRTOSConfig.h"\r
 \r
-#define portCONTEXT_SIZE 160\r
-#define portEPC_STACK_LOCATION 152\r
-#define portSTATUS_STACK_LOCATION 156\r
+#define portCONTEXT_SIZE                160\r
+#define portEPC_STACK_LOCATION          152\r
+#define portSTATUS_STACK_LOCATION       156\r
+#define portFPCSR_STACK_LOCATION        0\r
+#define portTASK_HAS_FPU_STACK_LOCATION     0\r
+#define portFPU_CONTEXT_SIZE            264\r
+\r
+/******************************************************************/\r
+.macro  portSAVE_FPU_REGS    offset, base\r
+    /* Macro to assist with saving just the FPU registers to the\r
+     * specified address and base offset,\r
+     * offset is a constant, base is the base pointer register  */\r
+\r
+       sdc1            $f31, \offset + 248(\base)\r
+       sdc1            $f30, \offset + 240(\base)\r
+       sdc1            $f29, \offset + 232(\base)\r
+       sdc1            $f28, \offset + 224(\base)\r
+       sdc1            $f27, \offset + 216(\base)\r
+       sdc1            $f26, \offset + 208(\base)\r
+       sdc1            $f25, \offset + 200(\base)\r
+       sdc1            $f24, \offset + 192(\base)\r
+       sdc1            $f23, \offset + 184(\base)\r
+       sdc1            $f22, \offset + 176(\base)\r
+       sdc1            $f21, \offset + 168(\base)\r
+       sdc1            $f20, \offset + 160(\base)\r
+       sdc1            $f19, \offset + 152(\base)\r
+       sdc1            $f18, \offset + 144(\base)\r
+       sdc1            $f17, \offset + 136(\base)\r
+       sdc1            $f16, \offset + 128(\base)\r
+       sdc1            $f15, \offset + 120(\base)\r
+       sdc1            $f14, \offset + 112(\base)\r
+       sdc1            $f13, \offset + 104(\base)\r
+       sdc1            $f12, \offset + 96(\base)\r
+       sdc1            $f11, \offset + 88(\base)\r
+       sdc1            $f10, \offset + 80(\base)\r
+       sdc1            $f9, \offset + 72(\base)\r
+       sdc1            $f8, \offset + 64(\base)\r
+       sdc1            $f7, \offset + 56(\base)\r
+       sdc1            $f6, \offset + 48(\base)\r
+       sdc1            $f5, \offset + 40(\base)\r
+       sdc1            $f4, \offset + 32(\base)\r
+       sdc1            $f3, \offset + 24(\base)\r
+       sdc1            $f2, \offset + 16(\base)\r
+       sdc1            $f1, \offset + 8(\base)\r
+       sdc1            $f0, \offset + 0(\base)\r
+\r
+    .endm\r
+\r
+/******************************************************************/\r
+.macro  portLOAD_FPU_REGS    offset, base\r
+    /* Macro to assist with loading just the FPU registers from the\r
+     * specified address and base offset, offset is a constant,\r
+     * base is the base pointer register  */\r
+\r
+       ldc1            $f0, \offset + 0(\base)\r
+       ldc1            $f1, \offset + 8(\base)\r
+       ldc1            $f2, \offset + 16(\base)\r
+       ldc1            $f3, \offset + 24(\base)\r
+       ldc1            $f4, \offset + 32(\base)\r
+       ldc1            $f5, \offset + 40(\base)\r
+       ldc1            $f6, \offset + 48(\base)\r
+       ldc1            $f7, \offset + 56(\base)\r
+       ldc1            $f8, \offset + 64(\base)\r
+       ldc1            $f9, \offset + 72(\base)\r
+       ldc1            $f10, \offset + 80(\base)\r
+       ldc1            $f11, \offset + 88(\base)\r
+       ldc1            $f12, \offset + 96(\base)\r
+       ldc1            $f13, \offset + 104(\base)\r
+       ldc1            $f14, \offset + 112(\base)\r
+       ldc1            $f15, \offset + 120(\base)\r
+       ldc1            $f16, \offset + 128(\base)\r
+       ldc1            $f17, \offset + 136(\base)\r
+       ldc1            $f18, \offset + 144(\base)\r
+       ldc1            $f19, \offset + 152(\base)\r
+       ldc1            $f20, \offset + 160(\base)\r
+       ldc1            $f21, \offset + 168(\base)\r
+       ldc1            $f22, \offset + 176(\base)\r
+       ldc1            $f23, \offset + 184(\base)\r
+       ldc1            $f24, \offset + 192(\base)\r
+       ldc1            $f25, \offset + 200(\base)\r
+       ldc1            $f26, \offset + 208(\base)\r
+       ldc1            $f27, \offset + 216(\base)\r
+       ldc1            $f28, \offset + 224(\base)\r
+       ldc1            $f29, \offset + 232(\base)\r
+       ldc1            $f30, \offset + 240(\base)\r
+       ldc1            $f31, \offset + 248(\base)\r
+\r
+    .endm\r
 \r
 /******************************************************************/\r
 .macro portSAVE_CONTEXT\r
        captured. */\r
        mfc0            k0, _CP0_CAUSE\r
        addiu           sp, sp, -portCONTEXT_SIZE\r
+\r
+       #if ( __mips_hard_float == 1 ) && ( configUSE_TASK_FPU_SUPPORT == 1 )\r
+               /* Test if we are already using the system stack. Only tasks may use the\r
+               FPU so if we are already in a nested interrupt then the FPU context does\r
+               not require saving. */\r
+               la                      k1, uxInterruptNesting\r
+               lw                      k1, 0(k1)\r
+               bne                     k1, zero, 2f\r
+               nop\r
+\r
+               /* Test if the current task needs the FPU context saving. */\r
+               la                      k1, ulTaskHasFPUContext\r
+               lw                      k1, 0(k1)\r
+               beq                     k1, zero, 1f\r
+               nop\r
+\r
+               /* Adjust the stack to account for the additional FPU context.*/\r
+               addiu           sp, sp, -portFPU_CONTEXT_SIZE\r
+\r
+       1:\r
+               /* Save the ulTaskHasFPUContext flag. */\r
+               sw                      k1, portTASK_HAS_FPU_STACK_LOCATION(sp)\r
+\r
+       2:\r
+       #endif\r
+\r
        mfc0            k1, _CP0_STATUS\r
 \r
-       /* Also save s6 and s5 so they can be used.  Any nesting interrupts should\r
-       maintain the values of these registers across the ISR. */\r
+       /* Also save s7, s6 and s5 so they can be used.  Any nesting interrupts\r
+       should maintain the values of these registers across the ISR. */\r
+       sw                      s7, 48(sp)\r
        sw                      s6, 44(sp)\r
        sw                      s5, 40(sp)\r
        sw                      k1, portSTATUS_STACK_LOCATION(sp)\r
        mflo            s6, $ac0\r
        sw                      s6, 8(s5)\r
 \r
+       /* Save the FPU context if the nesting count was zero. */\r
+       #if ( __mips_hard_float == 1 ) && ( configUSE_TASK_FPU_SUPPORT == 1 )\r
+               la                      s6, uxInterruptNesting\r
+               lw                      s6, 0(s6)\r
+               addiu           s6, s6, -1\r
+               bne                     s6, zero, 1f\r
+               nop\r
+\r
+               /* Test if the current task needs the FPU context saving. */\r
+               lw                      s6, portTASK_HAS_FPU_STACK_LOCATION(s5)\r
+               beq                     s6, zero, 1f\r
+               nop\r
+\r
+               /* Save the FPU registers. */\r
+               portSAVE_FPU_REGS ( portCONTEXT_SIZE + 8 ), s5\r
+\r
+               /* Save the FPU status register */\r
+               cfc1            s6, $f31\r
+               sw                      s6, (portCONTEXT_SIZE + portFPCSR_STACK_LOCATION)(s5)\r
+\r
+               1:\r
+       #endif\r
+\r
        /* Update the task stack pointer value if nesting is zero. */\r
        la                      s6, uxInterruptNesting\r
        lw                      s6, (s6)\r
        la                      s6, uxSavedTaskStackPointer\r
        lw                      s5, (s6)\r
 \r
+    #if ( __mips_hard_float == 1 ) && ( configUSE_TASK_FPU_SUPPORT == 1 )\r
+               /* Restore the FPU context if required. */\r
+               lw                      s6, portTASK_HAS_FPU_STACK_LOCATION(s5)\r
+               beq                     s6, zero, 1f\r
+               nop\r
+\r
+               /* Restore the FPU registers. */\r
+               portLOAD_FPU_REGS   ( portCONTEXT_SIZE + 8 ), s5\r
+\r
+               /* Restore the FPU status register. */\r
+               lw                      s6, ( portCONTEXT_SIZE + portFPCSR_STACK_LOCATION )(s5)\r
+               ctc1            s6, $f31\r
+       #endif\r
+\r
+1:\r
+\r
        /* Restore the context. */\r
-1:     lw                      s6, 128(s5)\r
+       lw                      s6, 128(s5)\r
        mthi            s6, $ac1\r
        lw                      s6, 124(s5)\r
        mtlo            s6, $ac1\r
        lw                      s6, 144(s5)\r
        mthi            s6, $ac3\r
        lw                      s6, 140(s5)\r
-       mtlo                    s6, $ac3\r
+       mtlo            s6, $ac3\r
 \r
        /* Restore DSPControl. */\r
        lw                      s6, 148(s5)\r
 \r
        /* s6 is loaded as it was used as a scratch register and therefore saved\r
        as part of the interrupt context. */\r
+       lw                      s7, 48(s5)\r
        lw                      s6, 44(s5)\r
        lw                      v0, 52(s5)\r
        lw                      v1, 56(s5)\r
        addiu           k1, k1, -1\r
        sw                      k1, 0(k0)\r
 \r
-       lw                      k0, portSTATUS_STACK_LOCATION(s5)\r
-       lw                      k1, portEPC_STACK_LOCATION(s5)\r
+       #if ( __mips_hard_float == 1 ) && ( configUSE_TASK_FPU_SUPPORT == 1 )\r
+               /* If the nesting count is now zero then the FPU context may be restored. */\r
+               bne                     k1, zero, 1f\r
+               nop\r
+\r
+               /* Restore the value of ulTaskHasFPUContext */\r
+               la                      k0, ulTaskHasFPUContext\r
+               lw                      k1, 0(s5)\r
+               sw                      k1, 0(k0)\r
+\r
+               /* If the task does not have an FPU context then adjust the stack normally. */\r
+               beq                     k1, zero, 1f\r
+               nop\r
+\r
+               /* Restore the STATUS and EPC registers */\r
+               lw                      k0, portSTATUS_STACK_LOCATION(s5)\r
+               lw                      k1, portEPC_STACK_LOCATION(s5)\r
+\r
+               /* Leave the stack in its original state.  First load sp from s5, then\r
+               restore s5 from the stack. */\r
+               add                     sp, zero, s5\r
+               lw                      s5, 40(sp)\r
+\r
+               /* Adjust the stack pointer to remove the FPU context */\r
+               addiu           sp, sp, portFPU_CONTEXT_SIZE\r
+               beq                     zero, zero, 2f\r
+               nop\r
+\r
+               1:  /* Restore the STATUS and EPC registers */\r
+               lw                      k0, portSTATUS_STACK_LOCATION(s5)\r
+               lw                      k1, portEPC_STACK_LOCATION(s5)\r
+\r
+               /* Leave the stack in its original state.  First load sp from s5, then\r
+               restore s5 from the stack. */\r
+               add                     sp, zero, s5\r
+               lw                      s5, 40(sp)\r
+\r
+               2:  /* Adjust the stack pointer */\r
+               addiu           sp, sp, portCONTEXT_SIZE\r
+\r
+       #else\r
+\r
+               /* Restore the frame when there is no hardware FP support. */\r
+               lw                      k0, portSTATUS_STACK_LOCATION(s5)\r
+               lw                      k1, portEPC_STACK_LOCATION(s5)\r
+\r
+               /* Leave the stack in its original state.  First load sp from s5, then\r
+               restore s5 from the stack. */\r
+               add                     sp, zero, s5\r
+               lw                      s5, 40(sp)\r
+\r
+               addiu           sp, sp, portCONTEXT_SIZE\r
 \r
-       /* Leave the stack in its original state.  First load sp from s5, then\r
-       restore s5 from the stack. */\r
-       add                     sp, zero, s5\r
-       lw                      s5, 40(sp)\r
-       addiu           sp, sp, portCONTEXT_SIZE\r
+       #endif // ( __mips_hard_float == 1 ) && ( configUSE_TASK_FPU_SUPPORT == 1 )\r
 \r
        mtc0            k0, _CP0_STATUS\r
        mtc0            k1, _CP0_EPC\r