]> git.sur5r.net Git - freertos/commitdiff
Correct alignment issue in GCC and RVDS Cortex-A9 port that was preventing full float...
authorrtel <rtel@1d2547de-c912-0410-9cb9-b8ca96c0e9e2>
Wed, 18 Jan 2017 18:33:48 +0000 (18:33 +0000)
committerrtel <rtel@1d2547de-c912-0410-9cb9-b8ca96c0e9e2>
Wed, 18 Jan 2017 18:33:48 +0000 (18:33 +0000)
Update the Zynq demo to test the GCC Cortex-A9 port layer modification mentioned on the line above.

git-svn-id: https://svn.code.sf.net/p/freertos/code/trunk@2479 1d2547de-c912-0410-9cb9-b8ca96c0e9e2

22 files changed:
FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo/.cproject
FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo/src/Full_Demo/IntQueueTimer.c
FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo/src/main.c
FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo/src/printf-stdarg.c [deleted file]
FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo_bsp/ps7_cortexa9_0/libsrc/canps_v3_1/src/xcanps_g.c
FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo_bsp/ps7_cortexa9_0/libsrc/devcfg_v3_4/src/xdevcfg_g.c
FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo_bsp/ps7_cortexa9_0/libsrc/dmaps_v2_1/src/xdmaps_g.c
FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo_bsp/ps7_cortexa9_0/libsrc/emacps_v3_2/src/xemacps_g.c
FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo_bsp/ps7_cortexa9_0/libsrc/gpiops_v3_1/src/xgpiops_g.c
FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo_bsp/ps7_cortexa9_0/libsrc/iicps_v3_1/src/xiicps_g.c
FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo_bsp/ps7_cortexa9_0/libsrc/qspips_v3_3/src/xqspips_g.c
FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo_bsp/ps7_cortexa9_0/libsrc/scugic_v3_2/src/xscugic_g.c
FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo_bsp/ps7_cortexa9_0/libsrc/scutimer_v2_1/src/xscutimer_g.c
FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo_bsp/ps7_cortexa9_0/libsrc/scuwdt_v2_1/src/xscuwdt_g.c
FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo_bsp/ps7_cortexa9_0/libsrc/sdps_v2_7/src/xsdps_g.c
FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo_bsp/ps7_cortexa9_0/libsrc/standalone_v5_4/src/bspconfig.h
FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo_bsp/ps7_cortexa9_0/libsrc/ttcps_v3_1/src/xttcps_g.c
FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo_bsp/ps7_cortexa9_0/libsrc/uartps_v3_1/src/xuartps_g.c
FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo_bsp/ps7_cortexa9_0/libsrc/usbps_v2_3/src/xusbps_g.c
FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo_bsp/ps7_cortexa9_0/libsrc/xadcps_v2_2/src/xadcps_g.c
FreeRTOS/Source/portable/GCC/ARM_CA9/portASM.S
FreeRTOS/Source/portable/RVDS/ARM_CA9/portASM.s

index 19e0ca50a9ecb38c8941e7a0a198c8c435652be8..bbb71d8011b765fd01cec0ca79edb44f6bc72292 100644 (file)
@@ -83,6 +83,9 @@
                                                        <tool id="xilinx.gnu.armv7.size.debug.922806469" name="ARM v7 Print Size" superClass="xilinx.gnu.armv7.size.debug"/>\r
                                                </toolChain>\r
                                        </folderInfo>\r
+                                       <fileInfo id="xilinx.gnu.armv7.exe.debug.42884744.1294115727" name="printf-stdarg.c" rcbsApplicability="disable" resourcePath="src/printf-stdarg.c" toolsToInvoke="xilinx.gnu.armv7.c.toolchain.compiler.debug.2006913865.2055003215">\r
+                                               <tool id="xilinx.gnu.armv7.c.toolchain.compiler.debug.2006913865.2055003215" name="ARM v7 gcc compiler" superClass="xilinx.gnu.armv7.c.toolchain.compiler.debug.2006913865"/>\r
+                                       </fileInfo>\r
                                        <sourceEntries>\r
                                                <entry excluding="src/lwIP_Demo/lwIP_Apps/apps/httpserver_raw_from_lwIP_download/fsdata.c|src/lwIP_Demo/lwIP_Apps/apps/httpserver_raw_from_lwIP_download/makefsdata" flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name=""/>\r
                                        </sourceEntries>\r
index c86424a729daa68385309ceac4754e6a02e2b3f7..f6d9aba0f37197fef38211aeda583f0eec0f10dc 100644 (file)
@@ -224,6 +224,12 @@ uint32_t ulInterruptStatus;
 XTtcPs *pxTimer = ( XTtcPs * ) pvCallBackRef;\r
 BaseType_t xYieldRequired;\r
 \r
+#if( configASSERT_DEFINED == 1 )\r
+       /* Test floating point access within nested interrupts. */\r
+       volatile long double d1, d2;\r
+#endif\r
+\r
+\r
        /* Read the interrupt status, then write it back to clear the interrupt. */\r
        ulInterruptStatus = XTtcPs_GetInterruptStatus( pxTimer );\r
        XTtcPs_ClearInterruptStatus( pxTimer, ulInterruptStatus );\r
@@ -234,11 +240,37 @@ BaseType_t xYieldRequired;
        /* Check the device ID to know which IntQueue demo to call. */\r
        if( pxTimer->Config.DeviceId == xDeviceIDs[ 0 ] )\r
        {\r
+               #if( configASSERT_DEFINED == 1 )\r
+               {\r
+                       /* Test floating point access within nested interrupts. */\r
+                       d1 = 1.5L;\r
+                       d2 = 5.25L;\r
+               }\r
+               #endif /* configASSERT_DEFINED */\r
+\r
                xYieldRequired = xFirstTimerHandler();\r
+\r
+               /* Will fail eventually if flop context switch is not correct in\r
+               interrupts.  Keep calculation simple so the answer is exact even when\r
+               using flop. */\r
+               configASSERT( ( d1 * d2 ) == ( 1.5L * 5.25L ) );\r
        }\r
        else if( pxTimer->Config.DeviceId == xDeviceIDs[ 1 ] )\r
        {\r
+               #if( configASSERT_DEFINED == 1 )\r
+               {\r
+                       /* Test floating point access within nested interrupts. */\r
+                       d1 = 10.5L;\r
+                       d2 = 5.5L;\r
+               }\r
+               #endif /* configASSERT_DEFINED */\r
+\r
                xYieldRequired = xSecondTimerHandler();\r
+\r
+               /* Will fail eventually if flop context switch is not correct in\r
+               interrupts.  Keep calculation simple so the answer is exact even when\r
+               using flop. */\r
+               configASSERT( ( d1 / d2 ) == ( 10.5L / 5.5L ) );\r
        }\r
        else\r
        {\r
index 12935c525dfaa2bfe64fe39e38f477ce8e12e73f..44013c6c42521adf7ac2eeab4c29f9b0c4f30c72 100644 (file)
@@ -334,6 +334,23 @@ void vApplicationTickHook( void )
 \r
                /* Use mutexes from interrupts. */\r
                vInterruptSemaphorePeriodicTest();\r
+\r
+               /* Test flop alignment in interrupts - calling printf from an interrupt\r
+               is BAD! */\r
+               #if( configASSERT_DEFINED == 1 )\r
+               {\r
+               char cBuf[ 20 ];\r
+               UBaseType_t uxSavedInterruptStatus;\r
+\r
+                       uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR();\r
+                       {\r
+                               sprintf( cBuf, "%1.3f", 1.234 );\r
+                       }\r
+                       portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus );\r
+\r
+                       configASSERT( strcmp( cBuf, "1.234" ) == 0 );\r
+               }\r
+               #endif /* configASSERT_DEFINED */\r
        }\r
        #endif\r
 }\r
diff --git a/FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo/src/printf-stdarg.c b/FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo/src/printf-stdarg.c
deleted file mode 100644 (file)
index 1175198..0000000
+++ /dev/null
@@ -1,285 +0,0 @@
-/*\r
-       Copyright 2001, 2002 Georges Menie (www.menie.org)\r
-       stdarg version contributed by Christian Ettinger\r
-\r
-    This program is free software; you can redistribute it and/or modify\r
-    it under the terms of the GNU Lesser General Public License as published by\r
-    the Free Software Foundation; either version 2 of the License, or\r
-    (at your option) any later version.\r
-\r
-    This program is distributed in the hope that it will be useful,\r
-    but WITHOUT ANY WARRANTY; without even the implied warranty of\r
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
-    GNU Lesser General Public License for more details.\r
-\r
-    You should have received a copy of the GNU Lesser General Public License\r
-    along with this program; if not, write to the Free Software\r
-    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\r
-*/\r
-\r
-/*\r
-       putchar is the only external dependency for this file,\r
-       if you have a working putchar, leave it commented out.\r
-       If not, uncomment the define below and\r
-       replace outbyte(c) by your own function call.\r
-\r
-*/\r
-\r
-#define putchar(c) c\r
-\r
-#include <stdarg.h>\r
-\r
-static void printchar(char **str, int c)\r
-{\r
-       //extern int putchar(int c);\r
-       \r
-       if (str) {\r
-               **str = (char)c;\r
-               ++(*str);\r
-       }\r
-       else\r
-       { \r
-               (void)putchar(c);\r
-       }\r
-}\r
-\r
-#define PAD_RIGHT 1\r
-#define PAD_ZERO 2\r
-\r
-static int prints(char **out, const char *string, int width, int pad)\r
-{\r
-       register int pc = 0, padchar = ' ';\r
-\r
-       if (width > 0) {\r
-               register int len = 0;\r
-               register const char *ptr;\r
-               for (ptr = string; *ptr; ++ptr) ++len;\r
-               if (len >= width) width = 0;\r
-               else width -= len;\r
-               if (pad & PAD_ZERO) padchar = '0';\r
-       }\r
-       if (!(pad & PAD_RIGHT)) {\r
-               for ( ; width > 0; --width) {\r
-                       printchar (out, padchar);\r
-                       ++pc;\r
-               }\r
-       }\r
-       for ( ; *string ; ++string) {\r
-               printchar (out, *string);\r
-               ++pc;\r
-       }\r
-       for ( ; width > 0; --width) {\r
-               printchar (out, padchar);\r
-               ++pc;\r
-       }\r
-\r
-       return pc;\r
-}\r
-\r
-/* the following should be enough for 32 bit int */\r
-#define PRINT_BUF_LEN 12\r
-\r
-static int printi(char **out, int i, int b, int sg, int width, int pad, int letbase)\r
-{\r
-       char print_buf[PRINT_BUF_LEN];\r
-       register char *s;\r
-       register int t, neg = 0, pc = 0;\r
-       register unsigned int u = (unsigned int)i;\r
-\r
-       if (i == 0) {\r
-               print_buf[0] = '0';\r
-               print_buf[1] = '\0';\r
-               return prints (out, print_buf, width, pad);\r
-       }\r
-\r
-       if (sg && b == 10 && i < 0) {\r
-               neg = 1;\r
-               u = (unsigned int)-i;\r
-       }\r
-\r
-       s = print_buf + PRINT_BUF_LEN-1;\r
-       *s = '\0';\r
-\r
-       while (u) {\r
-               t = (unsigned int)u % b;\r
-               if( t >= 10 )\r
-                       t += letbase - '0' - 10;\r
-               *--s = (char)(t + '0');\r
-               u /= b;\r
-       }\r
-\r
-       if (neg) {\r
-               if( width && (pad & PAD_ZERO) ) {\r
-                       printchar (out, '-');\r
-                       ++pc;\r
-                       --width;\r
-               }\r
-               else {\r
-                       *--s = '-';\r
-               }\r
-       }\r
-\r
-       return pc + prints (out, s, width, pad);\r
-}\r
-\r
-static int print( char **out, const char *format, va_list args )\r
-{\r
-       register int width, pad;\r
-       register int pc = 0;\r
-       char scr[2];\r
-\r
-       for (; *format != 0; ++format) {\r
-               if (*format == '%') {\r
-                       ++format;\r
-                       width = pad = 0;\r
-                       if (*format == '\0') break;\r
-                       if (*format == '%') goto out;\r
-                       if (*format == '-') {\r
-                               ++format;\r
-                               pad = PAD_RIGHT;\r
-                       }\r
-                       while (*format == '0') {\r
-                               ++format;\r
-                               pad |= PAD_ZERO;\r
-                       }\r
-                       for ( ; *format >= '0' && *format <= '9'; ++format) {\r
-                               width *= 10;\r
-                               width += *format - '0';\r
-                       }\r
-                       if( *format == 's' ) {\r
-                               register char *s = (char *)va_arg( args, int );\r
-                               pc += prints (out, s?s:"(null)", width, pad);\r
-                               continue;\r
-                       }\r
-                       if( *format == 'd' ) {\r
-                               pc += printi (out, va_arg( args, int ), 10, 1, width, pad, 'a');\r
-                               continue;\r
-                       }\r
-                       if( *format == 'x' ) {\r
-                               pc += printi (out, va_arg( args, int ), 16, 0, width, pad, 'a');\r
-                               continue;\r
-                       }\r
-                       if( *format == 'X' ) {\r
-                               pc += printi (out, va_arg( args, int ), 16, 0, width, pad, 'A');\r
-                               continue;\r
-                       }\r
-                       if( *format == 'u' ) {\r
-                               pc += printi (out, va_arg( args, int ), 10, 0, width, pad, 'a');\r
-                               continue;\r
-                       }\r
-                       if( *format == 'c' ) {\r
-                               /* char are converted to int then pushed on the stack */\r
-                               scr[0] = (char)va_arg( args, int );\r
-                               scr[1] = '\0';\r
-                               pc += prints (out, scr, width, pad);\r
-                               continue;\r
-                       }\r
-               }\r
-               else {\r
-               out:\r
-                       printchar (out, *format);\r
-                       ++pc;\r
-               }\r
-       }\r
-       if (out) **out = '\0';\r
-       va_end( args );\r
-       return pc;\r
-}\r
-\r
-int printf(const char *format, ...)\r
-{\r
-        va_list args;\r
-        \r
-        va_start( args, format );\r
-        return print( 0, format, args );\r
-}\r
-\r
-int sprintf(char *out, const char *format, ...)\r
-{\r
-        va_list args;\r
-        \r
-        va_start( args, format );\r
-        return print( &out, format, args );\r
-}\r
-\r
-\r
-int snprintf( char *buf, unsigned int count, const char *format, ... )\r
-{\r
-        va_list args;\r
-        \r
-        ( void ) count;\r
-        \r
-        va_start( args, format );\r
-        return print( &buf, format, args );\r
-}\r
-\r
-\r
-#ifdef TEST_PRINTF\r
-int main(void)\r
-{\r
-       char *ptr = "Hello world!";\r
-       char *np = 0;\r
-       int i = 5;\r
-       unsigned int bs = sizeof(int)*8;\r
-       int mi;\r
-       char buf[80];\r
-\r
-       mi = (1 << (bs-1)) + 1;\r
-       printf("%s\n", ptr);\r
-       printf("printf test\n");\r
-       printf("%s is null pointer\n", np);\r
-       printf("%d = 5\n", i);\r
-       printf("%d = - max int\n", mi);\r
-       printf("char %c = 'a'\n", 'a');\r
-       printf("hex %x = ff\n", 0xff);\r
-       printf("hex %02x = 00\n", 0);\r
-       printf("signed %d = unsigned %u = hex %x\n", -3, -3, -3);\r
-       printf("%d %s(s)%", 0, "message");\r
-       printf("\n");\r
-       printf("%d %s(s) with %%\n", 0, "message");\r
-       sprintf(buf, "justif: \"%-10s\"\n", "left"); printf("%s", buf);\r
-       sprintf(buf, "justif: \"%10s\"\n", "right"); printf("%s", buf);\r
-       sprintf(buf, " 3: %04d zero padded\n", 3); printf("%s", buf);\r
-       sprintf(buf, " 3: %-4d left justif.\n", 3); printf("%s", buf);\r
-       sprintf(buf, " 3: %4d right justif.\n", 3); printf("%s", buf);\r
-       sprintf(buf, "-3: %04d zero padded\n", -3); printf("%s", buf);\r
-       sprintf(buf, "-3: %-4d left justif.\n", -3); printf("%s", buf);\r
-       sprintf(buf, "-3: %4d right justif.\n", -3); printf("%s", buf);\r
-\r
-       return 0;\r
-}\r
-\r
-/*\r
- * if you compile this file with\r
- *   gcc -Wall $(YOUR_C_OPTIONS) -DTEST_PRINTF -c printf.c\r
- * you will get a normal warning:\r
- *   printf.c:214: warning: spurious trailing `%' in format\r
- * this line is testing an invalid % at the end of the format string.\r
- *\r
- * this should display (on 32bit int machine) :\r
- *\r
- * Hello world!\r
- * printf test\r
- * (null) is null pointer\r
- * 5 = 5\r
- * -2147483647 = - max int\r
- * char a = 'a'\r
- * hex ff = ff\r
- * hex 00 = 00\r
- * signed -3 = unsigned 4294967293 = hex fffffffd\r
- * 0 message(s)\r
- * 0 message(s) with %\r
- * justif: "left      "\r
- * justif: "     right"\r
- *  3: 0003 zero padded\r
- *  3: 3    left justif.\r
- *  3:    3 right justif.\r
- * -3: -003 zero padded\r
- * -3: -3   left justif.\r
- * -3:   -3 right justif.\r
- */\r
-\r
-#endif\r
-\r
-\r
-\r
index 3691d708146850a95390912eb2413ed5b5f05a21..ba95a60f428967a0c92aecb2d2f30f719f8be650 100644 (file)
@@ -5,7 +5,7 @@
 * Version: \r
 * DO NOT EDIT.\r
 *\r
-* Copyright (C) 2010-2016 Xilinx, Inc. All Rights Reserved.*\r
+* Copyright (C) 2010-2017 Xilinx, Inc. All Rights Reserved.*\r
 *Permission is hereby granted, free of charge, to any person obtaining a copy\r
 *of this software and associated documentation files (the Software), to deal\r
 *in the Software without restriction, including without limitation the rights\r
index 588d82a966135cee48d64bd6b13310c24492daab..5e02d6dcdb772b1205b9eade4e4b77d28586d7e8 100644 (file)
@@ -5,7 +5,7 @@
 * Version: \r
 * DO NOT EDIT.\r
 *\r
-* Copyright (C) 2010-2016 Xilinx, Inc. All Rights Reserved.*\r
+* Copyright (C) 2010-2017 Xilinx, Inc. All Rights Reserved.*\r
 *Permission is hereby granted, free of charge, to any person obtaining a copy\r
 *of this software and associated documentation files (the Software), to deal\r
 *in the Software without restriction, including without limitation the rights\r
index 750a3127905911fe124ef12251ab6e29475789b2..3529895f98551f6bc98108beda49087d652851f6 100644 (file)
@@ -5,7 +5,7 @@
 * Version: \r
 * DO NOT EDIT.\r
 *\r
-* Copyright (C) 2010-2016 Xilinx, Inc. All Rights Reserved.*\r
+* Copyright (C) 2010-2017 Xilinx, Inc. All Rights Reserved.*\r
 *Permission is hereby granted, free of charge, to any person obtaining a copy\r
 *of this software and associated documentation files (the Software), to deal\r
 *in the Software without restriction, including without limitation the rights\r
index b051fa292e7f874a33820afd33799f637dc12801..201e23d8f9074807e528b47ec794fbb418e25e20 100644 (file)
@@ -5,7 +5,7 @@
 * Version: \r
 * DO NOT EDIT.\r
 *\r
-* Copyright (C) 2010-2016 Xilinx, Inc. All Rights Reserved.*\r
+* Copyright (C) 2010-2017 Xilinx, Inc. All Rights Reserved.*\r
 *Permission is hereby granted, free of charge, to any person obtaining a copy\r
 *of this software and associated documentation files (the Software), to deal\r
 *in the Software without restriction, including without limitation the rights\r
index a4f9ecff17c4312c0e553adca4b5e71eb8f57d3c..eac708037c7b9ae2b5bf12c3867b3d855886d7e5 100644 (file)
@@ -5,7 +5,7 @@
 * Version: \r
 * DO NOT EDIT.\r
 *\r
-* Copyright (C) 2010-2016 Xilinx, Inc. All Rights Reserved.*\r
+* Copyright (C) 2010-2017 Xilinx, Inc. All Rights Reserved.*\r
 *Permission is hereby granted, free of charge, to any person obtaining a copy\r
 *of this software and associated documentation files (the Software), to deal\r
 *in the Software without restriction, including without limitation the rights\r
index a936203199b00cbc5c1f824bcb2e5c610ac75706..1f5d00c4514f41b7e8d4faf3d2ae6ca2559cd21e 100644 (file)
@@ -5,7 +5,7 @@
 * Version: \r
 * DO NOT EDIT.\r
 *\r
-* Copyright (C) 2010-2016 Xilinx, Inc. All Rights Reserved.*\r
+* Copyright (C) 2010-2017 Xilinx, Inc. All Rights Reserved.*\r
 *Permission is hereby granted, free of charge, to any person obtaining a copy\r
 *of this software and associated documentation files (the Software), to deal\r
 *in the Software without restriction, including without limitation the rights\r
index 5875fd5c11e0f7f701b0637494bd798f81627ca1..d9453c49cacc7bd28d03cdb39275d0764e6f37bf 100644 (file)
@@ -5,7 +5,7 @@
 * Version: \r
 * DO NOT EDIT.\r
 *\r
-* Copyright (C) 2010-2016 Xilinx, Inc. All Rights Reserved.*\r
+* Copyright (C) 2010-2017 Xilinx, Inc. All Rights Reserved.*\r
 *Permission is hereby granted, free of charge, to any person obtaining a copy\r
 *of this software and associated documentation files (the Software), to deal\r
 *in the Software without restriction, including without limitation the rights\r
index 1041b1d0842ac73ae704a860616cbd6d888543ad..50888df787993d78b7ac4297cc4d44a2461ce42c 100644 (file)
@@ -5,7 +5,7 @@
 * Version: \r
 * DO NOT EDIT.\r
 *\r
-* Copyright (C) 2010-2016 Xilinx, Inc. All Rights Reserved.*\r
+* Copyright (C) 2010-2017 Xilinx, Inc. All Rights Reserved.*\r
 *Permission is hereby granted, free of charge, to any person obtaining a copy\r
 *of this software and associated documentation files (the Software), to deal\r
 *in the Software without restriction, including without limitation the rights\r
index 4c51e79991194d4e565cba1afb73d02b7da7310f..8126d2402b01ceac2a8cea6ab5126cd75ee9503f 100644 (file)
@@ -5,7 +5,7 @@
 * Version: \r
 * DO NOT EDIT.\r
 *\r
-* Copyright (C) 2010-2016 Xilinx, Inc. All Rights Reserved.*\r
+* Copyright (C) 2010-2017 Xilinx, Inc. All Rights Reserved.*\r
 *Permission is hereby granted, free of charge, to any person obtaining a copy\r
 *of this software and associated documentation files (the Software), to deal\r
 *in the Software without restriction, including without limitation the rights\r
index 17dc1c58a2617e9e023a79ccd9a3f82c73b7be92..9824a36478b580113ce4b25cac0ce62b07a520db 100644 (file)
@@ -5,7 +5,7 @@
 * Version: \r
 * DO NOT EDIT.\r
 *\r
-* Copyright (C) 2010-2016 Xilinx, Inc. All Rights Reserved.*\r
+* Copyright (C) 2010-2017 Xilinx, Inc. All Rights Reserved.*\r
 *Permission is hereby granted, free of charge, to any person obtaining a copy\r
 *of this software and associated documentation files (the Software), to deal\r
 *in the Software without restriction, including without limitation the rights\r
index 4d5b3000319c1218ff05932359cd504055f211c2..caab9c3f11e8bac92fa9b30688c32177109e5d39 100644 (file)
@@ -5,7 +5,7 @@
 * Version: \r
 * DO NOT EDIT.\r
 *\r
-* Copyright (C) 2010-2016 Xilinx, Inc. All Rights Reserved.*\r
+* Copyright (C) 2010-2017 Xilinx, Inc. All Rights Reserved.*\r
 *Permission is hereby granted, free of charge, to any person obtaining a copy\r
 *of this software and associated documentation files (the Software), to deal\r
 *in the Software without restriction, including without limitation the rights\r
index 4dd178f041d2a8b6461ed27fd209c5c52b50663b..8671e3fbe5b1382a795f004b206031b8bbc42b67 100644 (file)
@@ -5,7 +5,7 @@
 * Version: \r
 * DO NOT EDIT.\r
 *\r
-* Copyright (C) 2010-2016 Xilinx, Inc. All Rights Reserved.*\r
+* Copyright (C) 2010-2017 Xilinx, Inc. All Rights Reserved.*\r
 *Permission is hereby granted, free of charge, to any person obtaining a copy\r
 *of this software and associated documentation files (the Software), to deal\r
 *in the Software without restriction, including without limitation the rights\r
index 9ea62c8b7e5a261ba5ed291adc9e0ad02d706b3a..2729f41f55945564ae88bc7c67f2a3c7cabb9034 100644 (file)
@@ -5,7 +5,7 @@
 * Version: \r
 * DO NOT EDIT.\r
 *\r
-* Copyright (C) 2010-2016 Xilinx, Inc. All Rights Reserved.*\r
+* Copyright (C) 2010-2017 Xilinx, Inc. All Rights Reserved.*\r
 *Permission is hereby granted, free of charge, to any person obtaining a copy\r
 *of this software and associated documentation files (the Software), to deal\r
 *in the Software without restriction, including without limitation the rights\r
index f7deaf320f727a134f1dbbfbaade537ecfbc1a68..d0ed617c486e65101625ec45559d3170aa9ed582 100644 (file)
@@ -5,7 +5,7 @@
 * Version: \r
 * DO NOT EDIT.\r
 *\r
-* Copyright (C) 2010-2016 Xilinx, Inc. All Rights Reserved.*\r
+* Copyright (C) 2010-2017 Xilinx, Inc. All Rights Reserved.*\r
 *Permission is hereby granted, free of charge, to any person obtaining a copy\r
 *of this software and associated documentation files (the Software), to deal\r
 *in the Software without restriction, including without limitation the rights\r
index a4fb0da39b5af55cda8227a56cb3ca7ce2153434..a2486d88ee5a8f2bcd2240e7d049cc83de75b7f2 100644 (file)
@@ -5,7 +5,7 @@
 * Version: \r
 * DO NOT EDIT.\r
 *\r
-* Copyright (C) 2010-2016 Xilinx, Inc. All Rights Reserved.*\r
+* Copyright (C) 2010-2017 Xilinx, Inc. All Rights Reserved.*\r
 *Permission is hereby granted, free of charge, to any person obtaining a copy\r
 *of this software and associated documentation files (the Software), to deal\r
 *in the Software without restriction, including without limitation the rights\r
index 947d2c6f55c8d1aeaf0792d7b360f1b10c3fe848..4668ee8c5e5d12bcfa2d864058b7883981dbe56c 100644 (file)
@@ -5,7 +5,7 @@
 * Version: \r
 * DO NOT EDIT.\r
 *\r
-* Copyright (C) 2010-2016 Xilinx, Inc. All Rights Reserved.*\r
+* Copyright (C) 2010-2017 Xilinx, Inc. All Rights Reserved.*\r
 *Permission is hereby granted, free of charge, to any person obtaining a copy\r
 *of this software and associated documentation files (the Software), to deal\r
 *in the Software without restriction, including without limitation the rights\r
index 46ff2cfcd03988030fa4b8fd55c86720bed99217..970bb0cac75bf8cd3fe935c90574e1abb58b3e78 100644 (file)
@@ -217,16 +217,17 @@ FreeRTOS_IRQ_Handler:
        LDR             r0, [r2]\r
 \r
        /* Ensure bit 2 of the stack pointer is clear.  r2 holds the bit 2 value for\r
-       future use. */\r
+       future use.  _RB_ Does this ever actually need to be done provided the start\r
+       of the stack is 8-byte aligned? */\r
        MOV             r2, sp\r
        AND             r2, r2, #4\r
        SUB             sp, sp, r2\r
 \r
-       /* Call the interrupt handler. */\r
-       PUSH    {r0-r3, lr}\r
+       /* Call the interrupt handler.  r4 pushed to maintain alignment. */\r
+       PUSH    {r0-r4, lr}\r
        LDR             r1, vApplicationIRQHandlerConst\r
        BLX             r1\r
-       POP             {r0-r3, lr}\r
+       POP             {r0-r4, lr}\r
        ADD             sp, sp, r2\r
 \r
        CPSID   i\r
index 55091c815c23d96297c0ccfbaf79a7643aaef9c9..7008c0eccfedb73e84405ce23bbb70089bcf2df4 100644 (file)
@@ -124,16 +124,17 @@ FreeRTOS_IRQ_Handler
        LDR             r0, [r2]\r
 \r
        ; Ensure bit 2 of the stack pointer is clear.  r2 holds the bit 2 value for\r
-       ; future use.\r
+       ; future use.  _RB_ Does this ever actually need to be done provided the\r
+       ; start of the stack is 8-byte aligned?\r
        MOV             r2, sp\r
        AND             r2, r2, #4\r
        SUB             sp, sp, r2\r
 \r
-       ; Call the interrupt handler\r
-       PUSH    {r0-r3, lr}\r
+       ; Call the interrupt handler.  r4 is pushed to maintain alignment.\r
+       PUSH    {r0-r4, lr}\r
        LDR             r1, =vApplicationIRQHandler\r
        BLX             r1\r
-       POP             {r0-r3, lr}\r
+       POP             {r0-r4, lr}\r
        ADD             sp, sp, r2\r
 \r
        CPSID   i\r